
un cargador de PE y un trazador de API de Windows. Útil en análisis de malware.
Este proyecto fue creado para facilitar el proceso de análisis de malware. El objetivo es crear un binario activador cuyo propósito es cargar un binario definido por el usuario y monitorizar la ejecución mediante hooks de la API Win32. Los datos relevantes se guardan en disco. El código soporta binarios tanto x86 como x64.
Escribí una entrada de blog explicando cómo funciona: http://antonioparata.blogspot.com/2022/06/thematrix-process-inspection-tool-aimed.html
Para monitorizar un nuevo binario es necesario crear un activador. El activador cargará y monitorizará un binario de entrada del usuario. Para crear un activador, usa la opción -add. Un ejemplo de uso es el siguiente:
c:\>TheMatrix.exe -add c:\path\to\my\binary.dll
Activator file created
c:\>regsvr32.exe TheMatrix.build.dll
Este comando creará un nuevo archivo PE que representa al activador. El activador tendrá el mismo formato (DLL o EXE) que el binario de entrada.
Una vez creado, puedes ejecutarlo de la forma que prefieras (para DLL, la forma recomendada es usar la utilidad rundll32.exe).
Durante la ejecución, los datos generados por las funciones monitorizadas se guardan en ./Desktop/thematrix/[ID del proceso]/ (esto depende de la función log_data implementada en utility.c).
Limitación:
El proyecto modifica la estructura PEB.Ldr para permitir que ciertas APIs funcionen correctamente (como GetModuleHandle, ...). Si ejecutas el activador en un sistema WOW64 (binario x86 en un sistema operativo x64), solo se modifica el PEB.Ldr x86 (los procesos WOW64 tienen tanto PEB x86 como x64). Cuando la CPU cambia a x64, las APIs nativas de Windows (ntdll.dll) usarán la versión x64 de PEB.Ldr. Esto implica que el activador podría no funcionar correctamente. Para asegurarte de que el x86 funciona, ejecuta el binario en un sistema operativo x86.
El archivo recién creado no exporta todos los métodos ni contiene los recursos del archivo original. Esto provocará posibles errores, por ejemplo, si una DLL llama a GetModuleFileName -> LoadLibrary -> FindResource. Esta ruta de código cargará el archivo TheMatrix original que no contiene el recurso deseado.
Añadir nuevas funciones al monitor es una tarea sencilla; echa un vistazo al archivo hooks.c para ver algunos ejemplos de hooks de Kernel32.dll y bcrypt.dll. Para añadir un nuevo hook, basta con llamar a la función hook_add. A continuación se muestra un ejemplo de creación de un hook:
LPVOID __stdcall hook_BCryptEncrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput, VOID* pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG* pcbResult, ULONG dwFlags)
{
// save plain data
if (cbInput) {
char name[MAX_PATH] = { 0 };
snprintf(name, sizeof(name), "BCryptEncrypt_%llx_%d", (uint64_t)pbInput, cbInput);
log_data(cbInput, pbInput, name);
}
LPVOID ret = call_original(
hKey,
pbInput,
cbInput,
pPaddingInfo,
pbIV,
cbIV,
pbOutput,
cbOutput,
pcbResult,
dwFlags
);
return ret;
}
hook_add("Bcrypt.dll", "BCryptEncrypt", hook_BCryptEncrypt);
La función debe tener la misma firma que la función a la que se le aplica el hook. La función call_original se usa para llamar a la función original. Basta con llamar a esta función con los parámetros de entrada de la función original; el framework hará todo el trabajo pesado por ti para llamar a la función correcta ;) La llamada a la función call_original debe realizarse en el mismo hilo que ejecuta el hook, de lo contrario el proceso fallará.