
um PE Loader e rastreador de API do Windows. Útil em análise de malware.
Este projeto foi criado para facilitar o processo de análise de malware. O objetivo é criar um binário ativador cujo propósito é carregar um binário definido pelo usuário e monitorar a execução usando hooks da API Win32. Os dados relevantes são então salvos em disco. O código suporta binários tanto x86 quanto x64.
Escrevi uma postagem no blog explicando como funciona: http://antonioparata.blogspot.com/2022/06/thematrix-process-inspection-tool-aimed.html
Para monitorar um novo binário, é necessário criar um ativador. O ativador carregará e monitorará um binário de entrada do usuário. Para criar um ativador, use a opção -add. Um exemplo de uso é o seguinte:
c:\>TheMatrix.exe -add c:\path\to\my\binary.dll
Activator file created
c:\>regsvr32.exe TheMatrix.build.dll
Este comando criará um novo arquivo PE representando o ativador. O ativador terá o mesmo formato (DLL ou EXE) do binário de entrada.
Uma vez criado, você pode simplesmente executá-lo da maneira preferida (para DLL, a maneira sugerida é usar o utilitário rundll32.exe).
Durante a execução, os dados gerados pelas funções monitoradas são salvos em ./Desktop/thematrix/[process ID]/ (isso depende da função log_data implementada em utility.c).
Limitação:
O projeto modifica a estrutura PEB.Ldr para permitir que APIs específicas funcionem corretamente (como GetModuleHandle, ...). Se você executar o ativador em um sistema WOW64 (binário x86 em um SO x64), apenas o PEB.Ldr x86 é modificado (processos WOW64 possuem tanto PEB x86 quanto x64). Quando a CPU muda para x64, as APIs nativas do Windows (ntdll.dll) usarão a versão x64 do PEB.Ldr. Isso implica que o ativador pode não funcionar corretamente. Para garantir que o x86 funcione, execute o binário em um SO x86.
O arquivo recém-criado não exporta todos os métodos e não contém os recursos do arquivo original. Isso causará possíveis erros, por exemplo, se uma DLL chamar GetModuleFileName -> LoadLibrary -> FindResource. Esse caminho de código carregará a DLL TheMatrix original que não contém o recurso desejado.
Adicionar novas funções ao monitor é uma tarefa fácil; dê uma olhada no arquivo hooks.c para alguns exemplos de hooks de Kernel32.dll e bcrypt.dll. Para adicionar um novo hook, basta chamar a função hook_add. Abaixo é mostrado um exemplo de criação de 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);
A função deve ter a mesma assinatura da função com hook. A função call_original é usada para chamar a função original. Basta chamar esta função com os parâmetros de entrada da função original; o framework fará todo o trabalho pesado para você chamar a função correta ;) A chamada para a função call_original deve ser executada na mesma thread que executa o hook, caso contrário o processo irá travar.