2010-02-07 12 views
7

Sto provando a creare uno script python che disassembri un binario (un exe di Windows per la precisione) e ne analizzi il codice. Ho bisogno della capacità di prendere un certo buffer e di estrarre una sorta di struttura contenente informazioni sulle istruzioni al suo interno.Disassemblare con Python - nessuna soluzione facile?

Ho già lavorato con libdisasm in C e ho trovato l'interfaccia abbastanza intuitiva e comoda. Il problema è che la sua interfaccia Python è disponibile solo tramite SWIG e non riesco a farla compilare correttamente sotto Windows.

Nell'aspetto della disponibilità, diStorm fornisce un'interfaccia semplice, ma fornisce solo il Mnemonico di ogni istruzione, e non una struttura binaria con enumerazioni che definiscono il tipo di istruzione e quali no. Questo è abbastanza scomodo per il mio scopo, e richiederà molto di quello che vedo come tempo trascorso che avvolge l'interfaccia per adattarla alle mie esigenze.

Ho anche guardato BeaEngine, che di fatto fornisce l'output di cui ho bisogno, una struttura con informazioni binarie relative ad ogni istruzione, ma la sua interfaccia è davvero strana e contro-intuitiva e si blocca praticamente istantaneamente quando viene fornita con argomenti sbagliati. Il tipo CTypes di arresti anomali di ultimate-to-your-python.

Quindi, sarei felice di conoscere altre soluzioni, che richiedono meno tempo rispetto a djgcc o mingw per rendere SWIGed libdisasm o scrivere un wrapper OOP per diStorm. Se qualcuno ha delle indicazioni su come compilare il libdisasm SWIG, o, meglio ancora, un binario compilato (pyd o dll + py), mi piacerebbe sentirlo/averlo. :)

Grazie in anticipo.

risposta

2

Bene, dopo essermi immischiato, sono riuscito a compilare il libdisasm SWIGed! Sfortunatamente, sembra che crash Python su un uso errato (e talvolta corretto). Come ho fatto:

  1. ho compilato libdisasm.lib utilizzando Visual Studio 6, l'unica cosa che serve per questo è il codice sorgente in qualsiasi versione libdisasm si utilizza, e stdint.h e inttypes.h (The Versione compatibile con Visual C++, google it).
  2. ho SWIGed il file libdisasm_oop.i data con la seguente riga di comando

    sorso -python -Ombre -o x86disasm_wrap.c -outdir. libdisasm_oop.i

  3. Cygwin utilizzato per eseguire ./configure nella directory principale libdisasm. L'unica cosa reale che si ottiene è config.h

  4. Ho quindi creato un nuovo progetto DLL, aggiunto x86disasm_wrap.c, aggiunto le cartelle c: \ PythonXX \ libs e c: \ PythonXX \ Include al variabili corrispondenti, impostate su Release configuration (importante, o this o do #undef _DEBUG prima di includere python.h). Inoltre, è possibile che sia necessario correggere il percorso di config.h.

  5. Compilato il progetto DLL e denominato output _x86disasm.dll. Posizionalo nella stessa cartella del SWIG generato x86disasm.py e il gioco è fatto.

Qualche suggerimento per altre librerie di disassilità meno dannose per Python?

2

Si potrebbe provare a utilizzare ctypes per interfacciare direttamente con libdisasm invece di passare attraverso un livello SWIG. Potrebbe essere necessario più tempo di sviluppo, ma AFAIK dovrebbe essere in grado di accedere alla funzionalità sottostante utilizzando i tipi.

Problemi correlati