
Динамический дампер VMP и фиксатор импорта, на основе VTIL.

Динамический дампер VMP и фиксатор импортов на основе VTIL. Работает для VMProtect 3.X x64.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
Аргументы:
<Target PID>: ID целевого процесса в десятичной или шестнадцатеричной форме.<Target Module>: Имя модуля, который необходимо дампить и фиксировать. Может быть пустой строкой (""), если требуется модуль образа процесса.[-ep=<Entry Point RVA>]: Опционально предоставляемый RVA точки входа в шестнадцатеричной форме. VMPDump просто перезаписывает точку входа в опциональном заголовке этим значением.[-disable-reloc]: Опциональная настройка, указывающая VMPDump пометить, что релоки были удалены в выходном образе, заставляя образ загружаться по сохранённому ImageBase. Полезно, если требуются исполняемые дампы.Инициализация и распаковка VMProtect в целевом процессе должны быть завершены до запуска VMPDump. Это означает, что процесс должен находиться на OEP (Original Entry Point) или после него.
Дамп и фиксированный образ появятся в директории модуля образа процесса под именем <Target Module Name>.VMPDump.<Target Module Extension>.
VMProtect внедряет заглушки для каждого вызова или перехода импорта. Эти заглушки разрешают «обфусцированный» thunk в секции .vmpX и добавляют фиксированную константу для его «деобфускации». Сами вызовы или переходы затем выполняются с помощью инструкции ret.
VMPDump сканирует все исполняемые секции на наличие этих заглушек и поднимает их в VTIL с помощью лифтера VTIL x64. Затем выполняется анализ этих заглушек для определения типа заменяемого вызова и байтов, которые необходимо перезаписать.
После получения всех вызовов VMPDump создаёт новую таблицу импорта и добавляет thunk к существующему IAT. Вызовы к заглушкам импорта VMP заменяются прямыми вызовами к этим thunk.
Обратите внимание, что в мутированных процедурах бывают ситуации, когда недостаточно байт для замены вызова заглушки импорта VMP на прямой вызов thunk, так как последний на 1 байт больше. В таких случаях секция расширяется, и внедряется заглушка, которая переходит к thunk импорта. Затем вызов заглушки импорта VMP заменяется 5-байтовым относительным вызовом или переходом на эту внедрённую заглушку.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
Сборка в VS выполняется простой заменой каталогов include/library на VTIL-NativeLifers/VTIL-Core/Keystone/Capstone в файле vcxproj.
Проект требует C++20.
Из-за линейного сканирования секций кода, особенно в сильно мутированном и обфусцированном коде, некоторые вызовы заглушек импорта могут быть пропущены и, следовательно, не разрешены. Однако VMPDump включает обходные решения для большинства несоответствий мутации VMProtect, поэтому должен давать приемлемые результаты даже в сильно мутированном коде.
Если вы столкнулись с этим, пожалуйста, создайте issue с соответствующей информацией, и я рассмотрю его.
Лицензировано под GPL-3.0. Никаких гарантий любого рода не предоставляется.