
Uno strumento per estrarre informazioni RTTI da eseguibili Delphi, scritto in puro Python
Questo strumento analizza un file eseguibile per individuare dati Delphi, incluse le tabelle RTTI e le tabelle delle funzioni virtuali. Produce un file JSON con informazioni su classi e funzioni identificate, che può essere usato per analisi aggiuntive, ad esempio:
È incluso uno script IDAPython in grado di caricare l'output in IDA.
Lo script è stato scritto per integrare altri strumenti di reverse engineering di Delphi.
Rilasciato come open source da NCC Group Plc - http://www.nccgroup.com/
Sviluppato da David Cannings (@edeca) [email protected]
http://www.github.com/nccgroup/pythia
Questo progetto è rilasciato sotto licenza AGPL. Consultare LICENSE per maggiori informazioni.
Il flusso di alto livello è:
Le vftable di Delphi sono ben documentate. Le informazioni per la versione più recente sono disponibili presso Embarcadero. La documentazione non ufficiale è disponibile per Delphi 2005 (vedi qui).
Anche il codice sorgente di Free Pascal è utile (mirror Github).
Il primo elemento in una vftable è vmtSelfPtr, che punta all'inizio della tabella delle
funzioni virtuali. Lo script esegue la scansione di ogni segmento di codice nel file PE per
trovare qualsiasi posizione che punti avanti di +0x4C byte. Si noti che il compilatore Delphi allinea
le vftable a un limite di 4 byte (per ottimizzazione).
Ad esempio, il seguente VA 0x0046E1C8 contiene l'offset 0x0046E214, che
è 0x4C avanti rispetto alla posizione corrente. Come mostrato in IDA:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Questo approccio può generare falsi positivi, pertanto gli altri campi nella
vftable vengono controllati per verificare che abbiano valori plausibili. Ad esempio vmtInstanceSize
viene verificato per assicurarsi che non sia eccessivo e i puntatori a funzione vengono controllati per
verificare che si trovino in una sezione eseguibile. Durante i test il tasso di falsi positivi è
stato molto basso, nonostante il metodo di ricerca a forza bruta.
Ogni funzione trovata in una vftable viene controllata per determinare se è ereditata dal genitore o sovrascritta. Delphi non supporta l'ereditarietà multipla, quindi questo può essere ottenuto controllando il puntatore nella vftable del genitore con lo stesso offset.
Se entrambi i puntatori fanno riferimento alla stessa funzione, questa è ereditata. Se il figlio ha un puntatore diverso, allora la funzione è stata sovrascritta.
L'output principale dello strumento è un file JSON che può essere passato a successive elaborazioni / strumenti. Tuttavia, sono inclusi anche alcuni altri formati di output.
Usare l'opzione --save-tree per generare un file come:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. ecc ..
PACKAGEINFO o DVCLAL) e adattare la scansione ai diversi layout delle vftable.call [ecx+3Fh] a un metodo di istanza)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> che sono piuttosto indecifrabili in IDA.Inviate per favore esempi di binari in cui questo strumento non funziona, così può essere migliorato.