
Drltrace è un tracciatore di chiamate di libreria per applicazioni Windows e Linux.
Build di test per Windows
Drltrace è un tracciatore dinamico di chiamate API per applicazioni Windows e Linux. Drltrace è costruito sopra il framework di instrumentazione binaria dinamica DynamoRIO. Drltrace è stato inizialmente implementato da Derek Bruening e distribuito con i framework DynamoRIO e DrMemory. Questo repository contiene una versione standalone di drltrace con script aggiuntivi e materiali su come utilizzarlo per l'analisi dei malware. La build di rilascio può essere scaricata qui.
L'utilizzo di drltrace è molto semplice. Un utente deve specificare una directory di log e il nome di un processo target nel seguente modo:
drltrace -logdir . -- calc.exe
Tutto qui, lo strumento inietterà le DLL necessarie nel processo target, avvierà l'instrumentazione e in parallelo registrerà informazioni su tutte le chiamate di libreria eseguite nel processo target:
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
Il formato dell'output è semplice e può essere facilmente analizzato da uno script esterno:
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
L'analisi con grep può essere eseguita quando viene utilizzato l'argomento -grepable; questo stampa i nomi delle funzioni e gli argomenti tutti su una riga:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:\Windows\Fonts\staticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
La tabella degli identificatori unici dei moduli viene stampata alla fine del file di log:
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:\Windows\SysWOW64\calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:\Users\Max\Downloads\drltrace\drltrace\dynamorio\lib32\release\dynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:\Users\Max\Downloads\drltrace\drltrace\bin\release/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:\Windows\System32\CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:\Windows\System32\SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:\Windows\System32\GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:\Windows\System32\RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:\Windows\System32\IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:\Windows\System32\advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:\Windows\System32\cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:\Windows\System32\SHELL32.dll
Drltrace può facilmente filtrare le chiamate tra librerie e stampare solo le chiamate API eseguite dal modulo principale (o dall'heap) di un'applicazione target specificando l'opzione -only_from_app, molto utile nel caso di applicazioni che generano log enormi. Per un controllo più granulare, l'opzione -filter consente all'utente di specificare un file di configurazione del filtro per includere solo funzioni consentite o ignorare funzioni bloccate (vedi il file filter.config per esempi). Drltrace dispone anche di diversi utili script esterni per filtrare le chiamate API per una determinata libreria, stampare solo le chiamate API potenzialmente interessanti e le stringhe.
I moduli principali di Drltrace sono distribuiti sotto licenza BSD.
Alcuni file necessari per drltrace sono distribuiti sotto LGPL. Vedi i file sorgente per maggiori dettagli.
L'analisi dei malware non è un compito facile. I packer software sofisticati come Themida e Armadillo e naturalmente decine di packer senza nome scritti dagli autori di malware, insieme alla crittografia del codice e dei dati, facilitano notevolmente (in alcuni casi rendendolo completamente impossibile) il reverse engineering statico di tali campioni, complicando la vita degli analisti di malware. In questo caso, la tracciatura delle chiamate API può ridurre significativamente il tempo necessario per comprendere l'effettivo intento malevolo e rivelare molti dettagli tecnici sul codice malevolo protetto.
Mentre la tecnica tradizionale dell'API-hooking è stata implementata con successo in diverse soluzioni, l'approccio è ben studiato dagli autori di malware e può essere facilmente rilevato e/o aggirato. Inoltre, questi strumenti sono distribuiti come applicazioni GUI standalone pesanti (come prodotti proprietari) che non sono spesso facili da integrare nel flusso di lavoro esistente per l'analisi dei malware.
Se guardiamo al mondo Linux, c'è un meraviglioso strumento chiamato ltrace. Usando un singolo comando bash, possiamo facilmente ottenere la traccia completa delle chiamate API di un determinato eseguibile.
Perché non abbiamo uno strumento simile (come ltrace in Linux) per Windows che sia anche trasparente ai trucchi anti-ricerca usati dai malware moderni?
Risulta che esiste una tecnica che può aiutarci ad avere uno strumento del genere per Windows e tracciare le chiamate API in modo trasparente rispetto al programma eseguito. Questa tecnica è chiamata instrumentazione binaria dinamica, nota come DBI. DBI è una tecnica per analizzare il comportamento di un'applicazione binaria in fase di esecuzione tramite l'iniezione di codice di instrumentazione.
Tuttavia, l'applicazione della DBI per l'analisi dei malware è ingiustamente limitata all'automazione dell'unpacking e a diverse prove di concetto per la tracciatura di istruzioni, blocchi di base e chiamate di funzione. Per quanto ne sappiamo, drltrace è il primo strumento per la tracciatura delle chiamate API basato su DBI che può essere utilizzato nella pratica per l'analisi dei malware. Abbiamo fornito diversi esempi di analisi di malware nel nostro wiki in cui abbiamo descritto come drltrace ha permesso di rivelare in pochi minuti molti dettagli tecnici interni su campioni malevoli sofisticati senza nemmeno avviare IDA o un debugger.