Sto disassemblando un DOS MZ EXE a 16 bit compresso.
Per deoffuscarlo, ho impostato un punto di interruzione in DOSbox alla fine della routine di decompressione, l'ho lasciato funzionare e ho creato una memoria discarica. In questo modo ho essenzialmente ottenuto l'immagine EXE deoffuscata.
I problemi sono iniziati quando ho caricato l'immagine in IDA. Vedi, non capisco il concetto di segmenti dell'IDA. Sono simili ai segmenti x86, ma ci sono numerose differenze che non riesco a cogliere. Quando IDA mi ha chiesto di creare almeno un segmento, ho appena creato un singolo segmento enorme di 1 MB di lunghezza, perché il codice ei dati nello spazio degli indirizzi del programma sono misti e non ha senso introdurre segmenti separati come CODE
, DATA
ecc.
Dopo aver mostrato a IDA il punto di ingresso, tutto ha funzionato bene: funzioni determinate con successo da IDA, variabili locali, argomenti ecc. L'unico problema è che alcuni le chiamate sono contrassegnate come NONAME
, anche se puntano alle subroutine corrette. La cosa più strana è che quelle subroutine hanno XREF corretti per le chiamate "illegali". Ecco un esempio:
seg000: 188FF 004 call 1AD9h: 1; Procedura di chiamata
Questa riga è rossa e presenta un problema NONAME
associato nell'elenco dei problemi. Perché?
L'indirizzo 1AD9h: 1
seg: offset corrisponde all'indirizzo lineare 0x1ad91
, che ha questo:
seg000: 1AD91; =============== SUBROUTINE ================================== ===== seg000: 1AD91seg000: 1AD91; Attributi: frameseg000: 1AD91seg000: 1AD91 sub_1AD91 proc far; CODICE XREF: sub_188F2 + DP
Nota l'XREF. Quindi IDA elabora effettivamente la chiamata correttamente! Perché la chiamata è considerata non valida? Il file della guida IDA dice questo:
Problema: impossibile trovare il nome
Due motivi possono causare questo problema :
- Viene fatto riferimento a un indirizzo illegale nel programma in corso disassemblato;
- IDA non è riuscito a trovare un nome per l'indirizzo ma deve esistere.
Cosa fare
Se questo problema è causato da un riferimento a un indirizzo illegale
- Prova a inserire l'operando manualmente
- Oppure rendi legale l'indirizzo illegale creando un nuovo segmento .
Altrimenti, il database è danneggiato.
Quindi, immagino che il problema sia che ho un segmento gigantesco invece di diversi piccoli . Ma come divido correttamente lo spazio degli indirizzi in segmenti appropriati?
Conosco i valori di registro (inclusi DS
, CS
, SS
, IP
, ecc.) al punto di ingresso. Supponiamo che crei un segmento CODE
a partire dal segmento corrispondente al valore del registro CS nel punto di ingresso. Ma che lunghezza dovrebbe avere questo segmento?
Qual è lo scopo dei segmenti in IDA? Se i segmenti di DATI possono contenere istruzioni e i segmenti di CODICE possono essere letti e scritti come dati?
Mi scusi per questa domanda per principianti, ma il manuale IDA ufficiale è notoriamente scarso ei forum di HexRays sono chiusi per me usa la versione freeware.