Domanda:
Riorganizzare le istruzioni in un database ida?
Guntram Blohm supports Monica
2014-08-19 17:01:34 UTC
view on stackexchange narkive permalink

Sto smontando un vecchio (1996) gioco, che è stato compilato con il compilatore Watcom 386. Questo compilatore sembra riordinare in modo aggressivo le istruzioni per fare un uso migliore della pipeline del processore, come si vede in questo pezzo di assembly:

enter image description here

Le istruzioni contrassegnate da un punto rosso sono impostate i parametri per la prossima chiamata; le istruzioni con un punto blu terminano l'inizializzazione dell'oggetto restituito dalla chiamata precedente. Riorganizzarli rende l'assembly molto più facile da leggere:

  ... chiama ClassAlloc13680_0FAhmov edx, [eax] mov [edx + Class180F4.WidgetInputHandler], offset gblHandleTransportDestinationAndCheckForPassengersSpacemov edx, [eax] mov [edx] Class13680.Paint ???], offset ClassVehicleManager__PaintForSomeWidgetmov dword_A4D88, eaxmov eax, [eax] mov [eax + Class10B8C.MouseInputHandler], offset ClassVehicleManager__MouseInputHandlerpush 0push 2push 0push 4Ehpush 5Bhmov ebx, 5Chmov ecx, 21hmov edx, ebpmov eax, ebpcall ClassAlloc13680_0FAhpush 0push 2. ..  

(Nota che ho spostato le istruzioni mov reg, xxh ancora più in basso, perché la convenzione di chiamata del compilatore è ax-dx-cx-bx-stack , quindi posso vedere anche l'ordine degli argomenti qui)

C'è un modo per farlo in IDA? Non sto chiedendo un algoritmo per determinare automaticamente quali istruzioni dovrebbero essere "rosse" e quali dovrebbero essere "blu", e non voglio patchare il file binario originale, vorrei solo riorganizzare manualmente le istruzioni nel database ida.

O c'è un altro modo per migliorare la leggibilità di questo tipo di codice in IDA?

È possibile scrivere uno script IDC / IDAPython per spostare le istruzioni selezionate, ad esempio: selezionare una sequenza di istruzioni, richiamare lo script, inserire il numero di byte per spostare queste istruzioni su / giù, lo script le riordina usando `PatchByte` o qualcosa di simile comando.
Qualche tempo fa ho scritto uno script idc per farlo per il codice arm: [swapinsn.idc] (http://nah6.com/~itsme/cvs-xdadevtools/ida/idcscripts/swapinsn.idc). Ruoterà una sequenza di insns su o giù e correggerà eventuali salti relativi in ​​tale intervallo
@WillemHengeveld: Potresti rispondere a questa domanda? È il 90% di ciò di cui ho bisogno e vorrei assegnarti i punti rep.
Una risposta:
Willem Hengeveld
2014-08-22 14:33:26 UTC
view on stackexchange narkive permalink

Diversi anni fa ho scritto swapinsn.idc per farlo per il codice ARM. Ruoterà una sequenza di insns verso l'alto o verso il basso e correggerà eventuali salti relativi in ​​quell'intervallo.

Nota che contrariamente ai commenti nello script, non ho mai aggiunto il supporto x86.

Per comodità ho aggiunto le funzioni dei tasti di scelta rapida HK_ExchangeDown e HK_ExchangeUp come definito in hotkeys.idc. Quindi puoi selezionare una serie di istruzioni, digita shift- x per spostare in alto l'ultimo insn selezionato e il resto in basso.

A proposito, non ho il mio laptop con me in questo momento, la prossima settimana potrei probabilmente aggiungere il supporto x86


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...