
x64-Binärobfuskatator für PE-Dateien mit Kontrollflussabflachung, Anti-Disassemblierung, Importobfuskation und Anweisungsmutation, um Reverse Engineering zu erschweren.
Alcatraz ist ein x64-Binary-Obfuskator, der verschiedene PE-Dateien obfuskieren kann, darunter:
Installation: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) Laden Sie eine Binärdatei, indem Sie oben links auf file klicken.
2.) Fügen Sie Funktionen hinzu, indem Sie den Functions-Baum erweitern. (Sie können suchen, indem Sie den Namen in die Suchleiste oben eingeben.)
3.) Drücken Sie compile (Hinweis: Die Obfuskierung vieler Funktionen kann einige Sekunden dauern).
Im folgenden Beispiel sind alle Funktionen (außer der gezeigten) deaktiviert.
Wenn ein unmittelbarer Wert in ein Register verschoben wird, obfuskieren wir ihn durch Anwenden mehrerer bitweiser Operationen. Schauen wir uns die populäre Funktion _security_init_cookie an.
Vorher:
Nachher:

Indem wir die aufgeräumte Programmstruktur, die der Compiler erzeugt hat, entfernen und unseren Code in neu generierte Blöcke einfügen, erhöhen wir die Komplexität des Programms. Nehmen wir diese einfache Funktion main als Beispiel (Optimierung für dieses Programm ist deaktiviert):

Wenn wir dies in IDA 7.6 werfen, wird der Decompiler es optimieren:

Lassen Sie uns nun seinen Kontrollfluss glätten und IDA erneut analysieren lassen:

Wie Sie sehen können, ist die Komplexität stark gestiegen, obwohl ich nur einen kleinen Teil des generierten Codes zeige. Wenn Sie wissen möchten, wie der CFG aussieht:

Wenn ein Register (z. B. RAX) zu einem anderen Register (z. B. RCX) addiert wird, mutieren wir die Anweisung. Das bedeutet, dass sich die Syntax ändert, aber nicht die Semantik.
Die Anweisung ADD RCX, RAX kann zu folgendem mutiert werden:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
Wenn Sie mehr über Mutation erfahren möchten, werfen Sie einen Blick auf perses.
Wenn die PE-Datei eine .exe ist (Unterstützung für .dll wird hinzugefügt), erstellen wir einen benutzerdefinierten Einstiegspunkt, der den echten beim Start entschlüsselt (!!! funktioniert nicht, wenn manuell gemappt).

Die LEA-Obfuskierung ist recht einfach, aber effektiv. Wir verschieben eine andere Adresse in das Register und entschlüsseln sie danach. Auf diese Weise können Reverse Engineers bestimmte Daten/Funktionen nicht mehr kreuzreferenzieren.
Angenommen, wir finden die folgende Anweisung: lea rcx, [0xDEAD]
Wir werden sie zu folgendem mutieren:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
Wenn wir eine Anweisung finden, die mit dem Byte 0xFF beginnt, setzen wir ein 0xEB davor.
Wir tun dies, weil 0xEB 0xFF zu jmp rip + 1 codiert, was letztendlich zu unserem tatsächlichen ersten 0xFF springt. Dies verwirrt Werkzeuge, die Anweisungen linear dekodieren.
Vorher:

Nachher:

Von Zeit zu Zeit können wir einfügen:
jz 3
jne 1
0xE8
IDA wird versuchen, die 0xE8 (call) zu dekodieren, aber keinen Erfolg haben:

Es gibt derzeit keine "richtige" IAT-Obfuskierung. Der 0xFF-Anti-Disassembly-Trick kümmert sich vorerst darum. Eine ordentliche Implementierung ist hier geplant:
iat.cpp
Dies ist ein Ausschnitt unserer main-Funktion mit allem außer Anti-Disassembly aktiviert (damit IDA eine Funktion erstellen kann):
