
Ein dynamischer VMP-Dumper und Import-Fixer, unterstützt von VTIL.

Ein dynamischer VMP-Dumper und Import-Fixer, angetrieben von VTIL. Funktioniert für VMProtect 3.X x64.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
Argumente:
<Target PID>: Die ID des Zielprozesses, in dezimaler oder hexadezimaler Form.<Target Module>: Der Name des Moduls, das gedumpt und gefixt werden soll. Dies kann ein leerer String ("") sein, wenn das Prozess-Image-Modul gewünscht ist.[-ep=<Entry Point RVA>]: Ein optional bereitgestellter Entry-Point-RVA in hexadezimaler Form. VMPDump überschreibt einfach den Entry Point im optionalen Header mit diesem Wert.[-disable-reloc]: Eine optionale Einstellung, um VMPDump anzuweisen, zu markieren, dass Relocs im Ausgabe-Image entfernt wurden, wodurch das Image gezwungen wird, an der gedumpten ImageBase zu laden. Dies ist nützlich, wenn ausführbare Dumps gewünscht sind.Die VMProtect-Initialisierung und das Entpacken müssen im Zielprozess abgeschlossen sein, bevor VMPDump ausgeführt wird. Das bedeutet, es muss sich am oder nach dem OEP (Original Entry Point) befinden.
Das gedumpte und gefixte Image erscheint im Prozess-Image-Modul-Verzeichnis unter dem Namen <Target Module Name>.VMPDump.<Target Module Extension>.
VMProtect injiziert Stubs für jeden Import-Call oder -Jmp. Diese Stubs lösen den 'verschleierten' Thunk im Abschnitt .vmpX auf und fügen eine feste Konstante hinzu, um ihn zu 'entschleiern'. Die Calls oder Jumps selbst werden dann mit einer ret-Anweisung abgesetzt.
VMPDump durchsucht alle ausführbaren Abschnitte nach diesen Stubs und hebt sie mit dem VTIL x64-Lifter zu VTIL an. Dann wird eine Analyse dieser Stubs durchgeführt, um zu bestimmen, welche Art von Call ersetzt werden muss und welche Bytes überschrieben werden müssen.
Sobald alle Calls abgerufen wurden, erstellt VMPDump eine neue Import-Tabelle und fügt Thunks zur bestehenden IAT hinzu. Die Aufrufe der VMP-Import-Stubs werden durch direkte Aufrufe dieser Thunks ersetzt.
Beachten Sie, dass es in mutierten Routinen Situationen gibt, in denen nicht genügend Bytes vorhanden sind, um den VMP-Import-Stub-Aufruf durch einen direkten Thunk-Aufruf zu ersetzen, da letzterer 1 Byte größer ist. In diesen Fällen wird der Abschnitt erweitert und ein Stub injiziert, der zum Import-Thunk springt. Der VMP-Import-Stub-Aufruf wird dann durch einen 5-Byte-relativen Call oder Jmp zu diesem injizierten Stub ersetzt.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
Das Erstellen in VS ist so einfach wie das Ersetzen der Include-/Library-Verzeichnisse durch VTIL-NativeLifers/VTIL-Core/Keystone/Capstone in der vcxproj.
Das Projekt erfordert C++20.
Aufgrund der Tatsache, dass Codeabschnitte linear gescannt werden, insbesondere in stark mutiertem und verschleiertem Code, können einige Import-Stub-Aufrufe übersprungen und daher nicht aufgelöst werden. VMPDump enthält jedoch Workarounds für die meisten Inkonsistenzen der VMProtect-Mutation, sodass es auch bei stark mutiertem Code gute Ergebnisse liefern sollte.
Wenn Sie darauf stoßen, erstellen Sie bitte ein Issue mit den relevanten Informationen, und ich werde es mir ansehen.
Lizenziert unter der GPL-3.0-Lizenz. Es wird keinerlei Garantie gewährt.