
Offuscatore binario x64 per file PE con appiattimento del flusso di controllo, antidisassemblaggio, offuscamento delle importazioni e mutazione delle istruzioni per ostacolare il reverse engineering.
Alcatraz è un offuscatore binario x64 in grado di offuscare vari file PE, inclusi:
Installa: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) Carica un binario cliccando su file nell'angolo in alto a sinistra.
2.) Aggiungi funzioni espandendo l'albero Functions. (Puoi cercare inserendo il nome nella barra di ricerca in alto)
3.) Premi compile (nota: offuscare molte funzioni potrebbe richiedere alcuni secondi)
Nella dimostrazione seguente tutte le funzionalità (tranne quella dimostrata) sono disabilitate.
Se un valore immediato viene spostato in un registro, lo offuschiamo applicando molteplici operazioni bitwise. Diamo un'occhiata alla funzione popolare _security_init_cookie.
Prima:
Dopo:

Rimuovendo la struttura ordinata del programma generata dal compilatore e inserendo il nostro codice in nuovi blocchi generati, aumentiamo la complessità del programma. Prendiamo come esempio questa semplice funzione main (l'ottimizzazione per questo programma è disabilitata):

Se la inseriamo in IDA 7.6, il decompilatore la ottimizza:

Ora appiattiamo il suo flusso di controllo e lasciamo che IDA lo analizzi di nuovo:

Come puoi vedere, la complessità è aumentata notevolmente anche se mostro solo una piccola porzione del codice generato. Se vuoi vedere il CFG:

Se un registro (es. RAX) viene aggiunto a un altro registro (es. RCX), muteremo l'istruzione. Ciò significa che la sintassi cambia ma non la semantica.
L'istruzione ADD RCX, RAX può essere mutata in:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
Se vuoi saperne di più sulla mutazione, dai un'occhiata a perses.
Se il file PE è un .exe (il supporto per .dll verrà aggiunto), creeremo un punto di ingresso personalizzato che decifra quello reale all'avvio (!!! non funziona se mappato manualmente).

L'offuscamento LEA è piuttosto semplice ma efficace. Spostiamo un indirizzo diverso nel registro e lo decifriamo successivamente. In questo modo, i reverse engineer non possono fare riferimenti incrociati a determinati dati/funzioni.
Supponiamo di trovare l'istruzione: lea rcx, [0xDEAD]
La muteremo in:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
Se troviamo un'istruzione che inizia con il byte 0xFF, inseriamo 0xEB prima di essa.
Facciamo questo perché 0xEB 0xFF viene codificato come jmp rip + 1 che, alla fine, salta al nostro primo 0xFF effettivo. Questo confonde gli strumenti che decodificano le istruzioni in modo lineare.
Prima:

Dopo:

Di tanto in tanto possiamo inserire:
jz 3
jne 1
0xE8
IDA proverà a decodificare 0xE8 (call) ma non ci riuscirà:

Al momento non esiste un'offuscamento IAT "vero e proprio". Il trucco anti disassemblaggio 0xFF se ne occupa per ora. L'implementazione corretta è pianificata qui:
iat.cpp
Questo è un estratto della nostra funzione main con tutto abilitato tranne l'anti disassemblaggio (così IDA può creare una funzione):
