iris-ghidra: „bad instruction data“ bei NEC-V30-Programmen (Raiden II): Ursache klären, dann beheben #382
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/iris-plugins#382
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
iris-ghidradekompiliert das Programm der Raiden-II-Recherche (NEC-V30-Hauptprozessor, 1 MB Bild aus prg0/prg1, geladen alsx86:LE:16:Real Mode) nur teilweise: Chat-Export und Workspace auf dem MacBook, 2026-11-06. 242 Funktionen, bei 25 von 241 meldet Ghidra „Control flow encountered bad instruction data“ (55 Warnungen indecompiled.c), darunter die am häufigsten aufgerufene Funktion (FUN_9000_17b4, 36 Aufrufer), die zu „Unsinn“ dekompiliert. Die statische Analyse der Spielelogik ist damit weitgehend wertlos.Was belegt ist und was nicht
Der Agent erklärt es mit V30-Zusatzbefehlen, die Ghidras x86-16-Decoder nicht kennt, und mit „obfuskierten COP-Segmenten“. Das ist nicht belegt. Prüfung:
FUN_9000_009bmeldet „Instruction at (ram,0x0009017a) overlaps instruction at (ram,0x00090179)“. Das aus prg0/prg1 verschachtelte Bild hat bei 0x90179 die Bytes18 08 1d 4a 25 8c 2d ef 39 51 4a 93 56 bd 77 cc …: das sieht nach Daten aus, nicht nach V30-Code. Drei Ursachen sind möglich:Umfang
mame raiden2 -debug, disassembliert den V30 korrekt) und mit der Speicherkarte des Treibers (raiden2.cpp).iris-ghidra, oder eine Erweiterung der x86-Sprachdefinition um die NEC-Befehle (Muster wie beim gepinnten LE/LX-Loader mit Patch), oder ein Hinweis in der Anleitung, wann der Agent Ghidra nicht trauen darf.Nicht im Umfang
Der Hinweis im Ablauf von iris-rea-recherche (eigenes Issue). Ein vollständiger V30-Emulator.
Nachtrag mit Messungen (Workspace auf dem MacBook, 2026-11-06, nach dem weiteren Verlauf des Chats):
EA 00 00 00 98=JMP 9800:0000, also Ziel 0x98000. Dort steht lesbarer 8086-Code:FA B8 00 00 8E D8 8E C0 8E D0 BC 00 00 BF 00 00=CLI; MOV AX,0; MOV DS,AX; MOV ES,AX; MOV SS,AX; MOV SP,0; MOV DI,0. Ursache 2 (falsches Bild/Bank) ist für das Bild selbst damit unwahrscheinlich, die Frage ist, wie es in Ghidra geladen wurde.functions.txthat 242 Funktionen nur in den Segmenten 9000 (160), a000 (58), b000 (23) und d000 (1). Die FunktionFUN_9000_7f02(Start 0x97f02, 362 Bytes) überdeckt 0x98000; zwischen 0x97f02+362 und der nächsten FunktionFUN_9000_894f(0x9894f) liegt nichts. Der Reset-Code liegt also mitten in einer Funktion und nicht an einem Funktionsanfang. Das spricht dafür, dass die Analyse nicht vom Reset-Vektor ausging, sondern Funktionsgrenzen durch Suche fand.FUN_9000_009b, „overlaps instruction“) stehen weiter39 51 4a 93 56 bd 77 cc 11 92 32 52, was nach Daten aussieht.neetan/vx0) mit einemextended_0f-Handler (bcd4s,bit1, MOV in Spezialregister 0x20/0x22/0x26), „genau das, was Ghidra fehlte“. Das erklärt höchstens einen Teil der 25 Fehlerfunktionen; welche Opcodes an den 55 Fehlerstellen stehen, ist nicht ermittelt.Folgerung für die Reihenfolge im Issue: (1) Reset-Vektor als Einstiegspunkt setzen und die Analyse neu laufen lassen (Zähler „bad instruction data“ vorher/nachher), (2) erst dann die verbleibenden Fehlerstellen auf V30-Opcodes prüfen, (3) danach entscheiden, ob die Sprachdefinition ergänzt werden muss.