
Ofuscar APIs específicas de Windows con diferentes APIs
Ofuscar (ocultar) las importaciones PE de las herramientas de análisis estático/dinámico.
Esto es bastante directo, digamos que he usado VirtualProtect y quiero ofuscarlo con Sleep, la herramienta manipulará la IAT para que el thunk que apunta a VirtualProtect apunte en su lugar a Sleep, ahora al ejecutar el archivo, el cargador de Windows cargará Sleep en lugar de VirtualProtect, y mueve la ejecución al punto de entrada, desde allí la ejecución será redirigida al shellcode, que la herramienta colocó antes, para encontrar la dirección de VirtualProtect y usarla para reemplazar la dirección de Sleep que fue asignada antes por el cargador.
#include <cobf.hpp>
int main() {
cobf obf_file = cobf("sample.exe");
obf_file.load_pe();
obf_file.obf_sym("kernel32.dll", "SetLastError", "Beep");
obf_file.obf_sym("kernel32.dll", "GetLastError", "GetACP");
obf_file.generate("sample_obfuscated.exe");
obf_file.unload_pe();
return 0;
};
config.ini).cobf.exe <input file> <out file> [config file]; Template for the config file:
; * Sections can be written as:
; [dll_name]
; old_sym=new_sym
; * The dll name is case insensitive, but
; the old and the new symbols are not.
; * You can use the wildcard on both the
; dll name and the old symbol.
; * You can use '#' at the start of
; the old or the new symbol to flag
; an ordinal.
; * The new symbol should be exported
; by the dll so the windows loader can resolve it.
; For example:
; * Obfuscating all of the symbols
; imported from user32.dll with ordinal 1600.
[user32.dll]
*=#1600
; * Obfuscating symbols imported from both
; kernel32.dll and kernelbase.dll with Sleep.
[kernel*.dll]
*=Sleep
; * Obfuscating fprintf with exit.
[*]
fprintf=exit
Compilar este ejemplo de código
#include <windows.h>
#include <stdio.h>
int main() {
SetLastError(5);
printf("Last error is %d\n", GetLastError());
return 0;
};
Después de compilarlo, así es como se ven las importaciones de kernel32

Ahora ofusquemos tanto SetLastError como GetLastError con Beep y GetACP (en realidad cualquier api de kernel32 estará bien incluso si no está importada en absoluto).
Las configuraciones utilizadas son
[kernel32.dll]
SetLastError=Beep
GetLastError=GetACP
Aquí está la salida (también puede usar la biblioteca directamente como se muestra arriba).

Nuevamente echemos un vistazo a las importaciones de kernel32

No hay existencia de SetLastError o GetLastError
Una confirmación de que los dos archivos funcionarán correctamente

Descompilador IDA HexRays

Depurador IDA

Ghidra

ApiMonitor

Eso se debe a que todas las herramientas de análisis estático dependen de cuál es el nombre de la API escrito en la IAT, el cual puede ser manipulado como se muestra.
Para ApiMonitor, debido al uso de IAT hooking, existe el mismo problema.
Por otro lado, para herramientas como x64dbg, los nombres de API mostrados dependerán solo de lo que realmente se llama (no de lo que está escrito en la IAT).

.cobf para contener el shellcode y los otros datos necesarios.git clone https://github.com/d35ha/CallObfuscator.