
Ofuscador de binarios x64 para archivos PE con aplanamiento de flujo de control, anti-desensamblado, ofuscación de importaciones y mutación de instrucciones para dificultar la ingeniería inversa.
Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos PE diferentes, incluyendo:
Instalación: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) Cargue un binario haciendo clic en file en la esquina superior izquierda.
2.) Agregue funciones expandiendo el árbol Functions. (Puede buscar escribiendo el nombre en la barra de búsqueda en la parte superior)
3.) Presione compile (nota: ofuscar muchas funciones puede tomar algunos segundos)
En la demostración siguiente, todas las características (excepto la que se muestra) están deshabilitadas.
Si un valor inmediato se mueve a un registro, lo ofuscamos aplicando múltiples operaciones bitwise. Echemos un vistazo a la popular función _security_init_cookie.
Antes:
Después:

Al eliminar la estructura ordenada del programa generada por el compilador y colocar nuestro código en nuevos bloques generados, aumentamos la complejidad del programa. Tomemos esta simple función main como ejemplo (la optimización para este programa está deshabilitada):

Si lo metemos en IDA 7.6, el descompilador lo optimizará:

Ahora, aplanemos su flujo de control y dejemos que IDA lo analice de nuevo:

Como puede ver, la complejidad aumentó mucho aunque solo muestro una pequeña parte del código generado. Si quiere saber cómo se ve el cfg:

Si se suma un registro (p. ej., RAX) a otro registro (p. ej., RCX), mutaremos la instrucción. Esto significa que la sintaxis cambia pero no la semántica. La instrucción ADD RCX, RAX se puede mutar a:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
Si desea aprender más sobre la mutación, eche un vistazo a perses.
Si el archivo PE es un .exe (se agregará soporte para .dll), crearemos un punto de entrada personalizado que descifra el real al inicio (!!! no funciona cuando se mapea manualmente).

La ofuscación LEA es bastante simple pero efectiva. Movemos una ubicación diferente al registro y la desciframos después. De esta manera, los ingenieros inversos no pueden hacer referencias cruzadas a ciertos datos / funciones. Digamos que encontramos la siguiente instrucción: lea rcx, [0xDEAD] La mutaremos a:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
Si encontramos una instrucción que comienza con el byte 0xFF, pondremos un 0xEB delante. Hacemos esto porque 0xEB 0xFF se codifica como jmp rip + 1 que, al final, salta a nuestro primer 0xFF real. Esto confundirá a las herramientas que decodifican instrucciones de manera lineal.
Antes:

Después:

De vez en cuando podemos insertar:
jz 3
jne 1
0xE8
IDA intentará decodificar el 0xE8 (call) pero no tendrá éxito:

No hay una ofuscación IAT "adecuada" en este momento. El truco anti-desensamblado 0xFF se encarga de ello por ahora. La implementación adecuada está planeada aquí:
iat.cpp
Este es un fragmento de nuestra función main con todo excepto el anti-desensamblado habilitado (para que IDA pueda crear una función):
