
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.
-logdir [ .] Directory di log per stampare i dati delle chiamate di libreria
-only_from_app [ false] Segnala solo le chiamate di libreria dall'app
-follow_children [ true] Traccia i processi figli
-print_ret_addr [ false] Stampa l'indirizzo di ritorno delle chiamate di libreria
-num_unknown_args [ 2] Numero di argomenti sconosciuti delle chiamate di libreria da stampare
-num_max_args [ 6] Numero massimo di argomenti da stampare
-default_config [ true] Usa il file di configurazione predefinito.
-config [ ""] Il percorso del file di configurazione personalizzato.
-filter [filter.config] Il percorso del file whitelist/blacklist.
-ignore_underscore [ false] Ignora i nomi delle routine di libreria che iniziano con "_".
-help [ false] Stampa questo messaggio.
-version [ false] Stampa il numero di versione.
-verbose [ 1] Cambia la verbosità.
-use_config [ true] Usa il file di configurazione
-grepable [ false] Output leggibile con grep
Drltrace supporta file di configurazione esterni in cui un utente può descrivere come drltrace deve stampare gli argomenti per determinate chiamate API.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
Ogni argomento di funzione deve essere separato da |. Il primo argomento è il tipo di ritorno, il secondo argomento è il nome della funzione stesso e il resto sono gli argomenti della funzione. Un token __out viene utilizzato per contrassegnare gli argomenti di output e ___inout viene utilizzato per contrassegnare gli argomenti di input+output.
Puoi trovare esempi su come utilizzare drltrace per l'analisi di malware complessi nella nostra pagina Wiki.
Per semplificare il lavoro con i file di log, abbiamo implementato uno script chiamato api_calls_viz.py che può essere utilizzato per generare immagini RGB in cui ogni colore di pixel rappresenta una chiamata API unica. Ad esempio, l'immagine qui sotto rappresenta il file di log del malware WannaCry.

Le grandi aree verdi nell'immagine rappresentano chiamate API (wcscmp/wcsicmp) utilizzate per selezionare file con estensioni interessanti (es. docx, xls, py) da crittografare. Le aree viola rappresentano chiamate API (FindFirstFile/FindNextFile/CryptEncrypt) utilizzate per enumerare e crittografare file e cartelle sul disco.
Lo script può anche generare una rappresentazione HTML dell'immagine RGB generata in cui ogni elemento può essere selezionato per mostrare il nome di una chiamata API.

Vedi la directory api_calls_viz per maggiori dettagli.
Puoi trovare un manuale dettagliato in questa pagina Wiki.
Windows, Linux (macOS in futuro).
x86, x64 (ARM in programma).
Libreria standard C e C++ (e script per la gestione dei log scritti in Python).
Abbiamo deciso di implementare il nostro tracciatore di chiamate API basandoci sul framework di instrumentazione binaria dinamica DynamoRIO. Drltrace chiede a DynamoRIO di eseguire l'instrumentazione della chiamata LoadLibrary per poter gestire le nuove librerie caricate dal processo target. Quando il processo tenta di caricare una nuova libreria, DynamoRIO reindirizza il flusso di controllo a drltracelib.dll. A sua volta, drltrace enumera le funzioni esportate nella DLL appena caricata e registra un callback speciale per ciascuna di esse. Quindi, se una funzione esportata viene chiamata dal malware, il callback di drltrace verrà eseguito prima di questa funzione e lo strumento sarà in grado di registrare tutte le informazioni necessarie come il nome della funzione e gli argomenti. Un altro callback potrebbe essere registrato dopo la funzione per salvare i risultati dell'esecuzione.
Perché non Intel Pin? Abbiamo deciso di utilizzare DynamoRIO motivati dai seguenti motivi:
-syswide_on di drrun.exe). Tuttavia, in futuro, è necessario implementare un supporto speciale in drltrace per tali situazioni.Il nostro issue tracker contiene maggiori dettagli sul futuro di drltrace.
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Joe Testa https://github.com/jtesta