
Um dumper VMP dinâmico e fixador de importações, alimentado por VTIL.

Um dumper VMP dinâmico e fixador de imports, alimentado por VTIL. Funciona para VMProtect 3.X x64.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
Argumentos:
<Target PID>: O ID do processo alvo, em formato decimal ou hexadecimal.<Target Module>: O nome do módulo que deve ser descarregado e corrigido. Pode ser uma string vazia ("") se desejar o módulo da imagem do processo.[-ep=<Entry Point RVA>]: Um RVA de ponto de entrada fornecido opcionalmente, em formato hexadecimal. VMPDump simplesmente sobrescreve o Entry Point no cabeçalho opcional com este valor.[-disable-reloc]: Uma configuração opcional para instruir o VMPDump a marcar que as realocações foram removidas na imagem de saída, forçando a imagem a carregar no ImageBase descarregado. Isto é útil se dumps executáveis forem desejados.A inicialização e descompressão do VMProtect devem estar concluídas no processo alvo antes de executar o VMPDump. Isto significa que deve estar no ou após o OEP (Original Entry Point / Ponto de Entrada Original). A imagem descarregada e corrigida aparecerá no diretório do módulo de imagem do processo, sob o nome <Target Module Name>.VMPDump.<Target Module Extension>.
O VMProtect injeta stubs para cada chamada de import ou jmp. Estes stubs resolvem o thunk 'ofuscado' na secção .vmpX, e adicionam uma constante fixa para 'desofuscá-lo'. As próprias chamadas ou saltos são então despachados com uma instrução ret.
O VMPDump analisa todas as secções executáveis em busca destes stubs, e os eleva para VTIL usando o lifter VTIL x64. A análise é então realizada nestes stubs, a fim de determinar que tipo de chamada deve ser substituída e que bytes devem ser sobrescritos.
Uma vez que todas as chamadas tenham sido recuperadas, o VMPDump cria então uma nova tabela de imports e anexa thunks à IAT existente. As chamadas para os stubs de import do VMP são substituídas por chamadas diretas para estes thunks.
Note que em rotinas mutadas, existem situações em que não há bytes suficientes para substituir a chamada do stub de import do VMP por uma chamada direta de thunk, já que esta última é 1 byte maior. Nestes casos, a secção é estendida e um stub que salta para o thunk de import é injetado. A chamada do stub de import do VMP é então substituída por uma chamada relativa de 5 bytes ou jmp para o referido stub injetado.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
Compilar no VS é tão simples quanto substituir os diretórios de include/library para VTIL-NativeLifers/VTIL-Core/Keystone/Capstone no vcxproj.
O projeto requer C++20.
Devido ao facto de que as secções de código são examinadas linearmente, particularmente em código altamente mutado e ofuscado, algumas chamadas de stub de import podem ser ignoradas e, portanto, não resolvidas. No entanto, o VMPDump inclui soluções alternativas para a maioria das inconsistências de mutação do VMProtect, pelo que deve produzir resultados decentes mesmo em código altamente mutado.
Se encontrar isto, por favor crie um issue com a informação relevante e eu darei uma olhada.
Licenciado sob a Licença GPL-3.0. Nenhuma garantia é fornecida de qualquer tipo.