
Un dumper VMP dinamico e un fixer degli import, basato su VTIL.

Un dumper VMP dinamico e riparatore di import, basato su VTIL. Funziona per VMProtect 3.X x64.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
Argomenti:
<Target PID>: L'ID del processo target, in forma decimale o esadecimale.<Target Module>: Il nome del modulo che deve essere dumpato e riparato. Può essere una stringa vuota ("") se si desidera il modulo immagine del processo.[-ep=<Entry Point RVA>]: Un RVA dell'entry-point opzionale, in forma esadecimale. VMPDump sovrascrive semplicemente l'Entry Point nell'intestazione opzionale con questo valore.[-disable-reloc]: Un'impostazione opzionale per istruire VMPDump a segnare che i reloc sono stati rimossi nell'immagine di output, forzando il caricamento dell'immagine all'ImageBase dumpata. Utile se si desiderano dump eseguibili.L'inizializzazione e l'unpacking di VMProtect devono essere completati nel processo target prima di eseguire VMPDump. Ciò significa che deve essere al OEP (Original Entry Point) o oltre.
L'immagine dumpata e riparata apparirà nella directory del modulo immagine del processo, con il nome <Target Module Name>.VMPDump.<Target Module Extension>.
VMProtect inietta stub per ogni chiamata o salto di import. Questi stub risolvono il thunk 'offuscato' nella sezione .vmpX e aggiungono una costante fissa per 'deoffuscarlo'. Le chiamate o i salti stessi vengono poi inviati con un'istruzione ret.
VMPDump esegue la scansione di tutte le sezioni eseguibili per questi stub, e li solleva in VTIL utilizzando il lifter VTIL x64. Successivamente, viene eseguita un'analisi su questi stub per determinare che tipo di chiamata deve essere sostituita e quali byte devono essere sovrascritti.
Una volta recuperate tutte le chiamate, VMPDump crea una nuova tabella di import e aggiunge thunk alla IAT esistente. Le chiamate agli stub di import VMP vengono sostituite con chiamate dirette a questi thunk.
Nota che nelle routine mutate, ci sono situazioni in cui non ci sono abbastanza byte per sostituire la chiamata allo stub di import VMP con una chiamata diretta al thunk, poiché quest'ultima è 1 byte più grande. In questi casi, la sezione viene estesa e viene iniettato uno stub che salta al thunk di import. La chiamata allo stub di import VMP viene quindi sostituita con una chiamata relativa a 5 byte o un salto verso tale stub iniettato.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
Compilare in VS è semplice come sostituire le directory include/library con VTIL-NativeLifers/VTIL-Core/Keystone/Capstone nel vcxproj.
Il progetto richiede C++20.
A causa del fatto che le sezioni di codice vengono scansionate linearmente, specialmente in codice pesantemente mutato e offuscato, alcune chiamate di stub di import possono essere saltate e quindi non risolte. Tuttavia, VMPDump include soluzioni alternative per la maggior parte delle incongruenze di mutazione di VMProtect, quindi dovrebbe produrre risultati decenti anche in codice pesantemente mutato.
Se incontri questo problema, per favore apri un issue con le informazioni rilevanti e darò un'occhiata.
Concesso in licenza sotto GPL-3.0. Non viene fornita alcuna garanzia di alcun tipo.