VMP VMProtect (Туторы, скрипты, плагины, ...)

Rio

Администратор
Сообщения
165
Реакции
202
Решил создать отдельную тему по VMProtect'у, чтобы собирать в одном месте информацию по этому проту и обсуждать детали.

Для начала ответ на самый распространенный вопрос.

1. Почему OllyDbg вылетает при запуске программы, защищенной VMProtect'ом?

Потому что VMProtect использует баг с переполнением буфера в старых версиях dbghelp.dll, из-за которого отладчик падает. Чтобы обойти его необходимо исправить баг в dbghelp.dll или положить в папку отладчика новую версию файла dbghelp.dll, который можно взять из комплекта Debugging Tools for Windows:

http://www.microsoft.com/whdc/devtools/ ... fault.mspx

Добавлено

Microsoft включил дистрибутив Debugging Tools в состав пакета Windows SDK (который весит достаточно прилично), поэтому вот альтернативные ссылки на:

1. Дистрибутив Debugging Tools v6.12.2.633 x86 от 26.02.2010 (18,3 Мбайт)
http://www.revenge-crew.com/xchg/kio/Debugging_Tools_for_Windows_v6.12.2.633_x86.msi

2. Только библиотека dbghelp.dll из дистрибутива Debugging Tools v6.12.2.633 x86 (0,5 Мбайт)
http://www.revenge-crew.com/xchg/kio/dbghelp_v6.12.2.633_x86.zip

Темы на форуме -
Use of syscall and sysenter in VMProtect 3.1
VMP VirtualProtect Bypass - Disables virtualprotect checks/hooks so you can modify memory and change memory protection
Патч и кейген RSA в VMProtect 3.x
VMProtect ULTIMATE v3.5.0 Build 1213
Анализ VMProtect c Triton (dynamic binary analysis (DBA) framework)
Inside VMProtect
Vm2Import
Исследование кода VMProtect. Часть 1. Патч хешей

VTIL (Virtual-machine Translation Intermediate Language) -

NoVmp , vmpattack , vmpdump

VMProtect Windows API Address Decoder (IDA Pro - Python)
VMProtect xx_vm Chinese Decompiler
Quick PoC for a taint based attack on VMProtect

Сборник версий
VirtualizedFuncFinder
ZVM - пакет для изучения и практики по VMP2, сорсы и пример, док на Драконском
VmpGetHWID - может быть полезен
Плагин и Сорсы для OllyDBG, цель VMP2 - Unpacking VMProtect With ODPlugin
Деобфускация VMProtect в IDA Pro используя Qiling Framework
Collection of code for HWID-Locking .NET apps with VMProtect 3.4.0
VMP.NET-Kill V2.1 (VMP 1213-1261)
GH VMProtect 3 Import Fixer 1.0.1 x86 & x64
FixVmpDump - use python script to fix vmp dump api in ida. support x86 and x64
Vm2Import - fix vmprotect import function used unicorn-engine
VMPImportFixer - VMPImportFixer is a tool aimed to resolve import calls in a VMProtect'd (3.x) binary
VMUnprotect.NET
- VMUnprotect is a project engaged in hunting virtualized VMProtect methods
x64Unpack for VMProtect 3.4 - Hybrid Emulation Unpacker for 64-bit Windows
vmpfix - VMPfix is a dynamic x86/x64 VMProtect 2.0-3.x import fixer. The main goal of this project was to build correct and reliable tool to fix imports in x86/x64 applications.
Updated VMP Demutator from sn0w (.NET) - VMProtect Mutation Cleaner/Remover - Updated for the latest VMP + Fully fixed

https://github.com/archercreat/vmpfix

Detailed Analysis of the Virtual Machine Architecture - VMProtect 2 Reverse Engineering
+ Source https://githacks.org/vmp2 or https://cracklab.team/index.php?threads/12/post-2346,
+ Bin - https://githacks.org/vmp2/um-tracer/-/tree/master/refbuilds)
Detailed Analysis of the Virtual Machine Architecture - VMProtect 2 Reverse Engineering - Part Two, Complete Static Analysis


VMProtect 2 Reverse Engineering (x64 PE Only) (Detailed Analysis of the Virtual Machine Architecture - VMProtect 2 Reverse Engineering)

Name:
release
release bundle of all vmp2 projects
um-hook
VMProtect 2 Usermode Virtual Instruction Hook Demo
vmassembler
VMProtect 2 Virtual Instruction Assembler
vmdevirt
VMProtect Devirtualization
vmemu
VMProtect 2 Virtual Machine Handler Emulation
vmhook
VMProtect 2 Virtual Machine Hooking Library
vmprofiler
VMProtect 2 Virtual Machines Profiler Library
vmprofiler-cli
VMProtect 2 CLI Virtual Machine Information Displayer
vmprofiler-qt
VMProtect 2 Qt Virtual Instruction Inspector


Quick look around VMP 3.x - Part 1 : Unpacking
Quick look around VMP 3.x - Part 2 : Code Mutation
Quick look around VMP 3.x - Part 3 : Virtualization

Автоматическая классификация VM Handler-ов - The idea of using machine learning to analyze vmp

Tickling VMProtect with LLVM: Part 1 + https://github.com/LLVMParty/TicklingVMProtect
Tickling VMProtect with LLVM: Part 2 + https://github.com/LLVMParty/TicklingVMProtect
Tickling VMProtect with LLVM: Part 3 + https://github.com/LLVMParty/TicklingVMProtect
Тема по LLVM - LLVM, Clang для реверсинга
 
Последнее редактирование модератором:

Dark_Bull

Зарегистрированный
Сообщения
6
Реакции
2
В этой серии статей, если я правильно понял, автор накрывает свои sample files VMP 3.x и потом исследует результат.
Смотреть пассивно на screenshots как-то скучно, да и непонятно порой что откуда берется.

Я взял свой sample, простую программку на "С", вставил маркеры и накрыл. Но мои результаты какие-то совсем другие, мало похожие на результаты из статьи.

Так вот, собственно вопрос:
кто-нибудь видел оригинальные исходные файлы, над которыми автор экспериментирует?
Может в самой статье есть ссылка, которую я проглядел?
Или, есть ли способ самому создать "исходный файл", путем максимального приближения наугад к тому, что автор мог иметь?
Заранее спасибо!
Он писал, что узнал, что демо и платная версия сильно отличается по методам защиты. (Усиленная мутация и более сильная ВМ)
И вроде как, он в 3ей части статьи запротектил софты платной версией. Так может в этом проблема? Вы тоже лицензионной версией накрывали ПО?
 

plutos

_Вечный_Студент_
Мудрец
Сообщения
162
Реакции
647
пытаюсь build vtil project.
Беру VS 2019 16.10.2, в ней открываю VTIL-Core.sln. Все вроде просто и хорошо, но не может найти capstone-static.vcxproj,
хотя file "capstone-static.vcxproj" is present in this location: C:\vtil\dependencies\capstone\msvc,
т.е. именно там, где ему и надлежит быть согласно спецификации из solution file:
Project("{///}") = "capstone-static", "..\capstone\msvc\capstone-static.vcxproj", "{...}"

KEYSTONE:
Код:
------ Rebuild All started: Project: keystone, Configuration: Debug x64 ------
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project 'D:\keystone\msvc\ZERO_CHECK.vcxproj' does not exist.
Building Custom Rule D:/keystone/llvm/keystone/CMakeLists.txt
The system cannot find the path specified.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(241,5): error MSB8066: Custom build for 'D:\keystone\llvm\keystone\CMakeLists.txt' exited with code 3.
Done building project "keystone.vcxproj" -- FAILED.
что тут надо делать? Может эти проэкты надо сперва отдельно собрать?

И еще один вопрос:
C++ Standard in VS is set to
"Preview - Features from the Latest C++ Working Draft (/std:c++latest)"
Я так понимаю, это и есть C++ 20?
Каким образом эта опция устанавливается в VS? В самом solution file об этом вроде ничего не сказано? Или студия видит по самому исходному коду какой стандарт использовать и если он студией поддерживается, то он выставляется автоматически?
 
Последнее редактирование:

mak

Соломенные сандалии
Администратор
Сообщения
861
Реакции
654
что тут надо делать? Может эти проэкты надо сперва отдельно собрать?
Важная строчка - "Building Custom Rule D:/keystone/llvm/keystone/CMakeLists.txt" обычно пути разные, Смэйк создаёт свою конфигурацию, можно сделать это повторно или проверив пути, удалить из проекта CMakeLists.txt, если он там есть.
 

OKOB

Победители турниров
Финалисты турниров
Мудрец
Сообщения
81
Реакции
564

Indy

Ветеран
Сообщения
117
Реакции
69
mak

#21, Vm2Import - я глянул, получается ведь простейшая задача. Эти стабы примитивны, можно решить без всяких визоров и вирт. Взять произвольный call/jmp и начать хард. трассировать, при этом соблюдать несколько условий:

- Выборка W в память за пределы стека только R.
- Выборка в стек ниже sp что был при call.
- Окончание трейса при передаче управления на экспорт.

Если тред валится, то обработать фаулт(первое условие - стек не будет изменён), перейти к следующему call. При иных условиях трассировка будет прекращаться. А call's найти сканом памяти.

Продумал алго, вопрос как определить тип выборки. Обычно нужно тянуть ксед, но есть и системное решение - подменить сегмент. Псевдокод:

Код:
Trap(Ins, State):
    !State.EFlags.TF
if #DB
    if ID
        State.Ds = ds
        State.Ss = ss
        !ID
    fi
    DecodeIns(Ins)
    if Ins.Fetch
        P = TranslateFetch(Ins)
        if !((P < Call.Esp) & (P > Thread.StackLimit))
            State.Ds = Cs    ; R-access to seg.
            State.Ss = Cs
            ID = 1
        fi
    fi
    State.EFlags.TF = 1
   Run()
else #AV
    if ID
        !ID
        State.Ds = Ds
        State.Ss = Ss
    fi
Stop:
    State.Esp = Call.Esp
    Run()
fi
Всегда можно найти системное решение, но обычно оно не нужно, используют всякие толстые костыли на скриптах, которые есчо и не работают в новой версии отладчика.)
 
Последнее редактирование:

mak

Соломенные сандалии
Администратор
Сообщения
861
Реакции
654
@Indy, можно и скрипт в отладчике написать, как это раньше писали в Олли, по смыслу практически одно и тоже, авторы обычно использовали разный подход на базе того, что уже было доступно в паблике, а в теме эмуляции сейчас это очень популярно, есть ещё пару проектов по теме как https://github.com/mike1k/VMPImportFixer

Для системного решения требуется системное мышление, где, в свою очередь, нужна информация :)
 

Indy

Ветеран
Сообщения
117
Реакции
69
mak

VMPImportFixer - тянуть вирту это оверхед, какая сложность и тайминг что бы такое написать, если можно за час по простому ^. Тем более что бы решить примитивную задачу по обработке простых процедур. Имхо это стрелять пушкой по воробьям. А если что то сложнее нужно, даже сложно представить что для этого потребуется.. :)
 
  • Понравилось
Реакции: mak

Indy

Ветеран
Сообщения
117
Реакции
69
Собрал семпл, работает оно в 32 ос, на 64 трабла имеется с сегментами, впрочем не проблема.

A.png
B.png
 

Прикрепленные файлы:

qq_patriot

Зарегистрированный
Сообщения
2
Реакции
2
Потестил версию 3.5 на бинарниках dotnet 6. Имеем на входе:


Защита минимальная, только виртуализация метода Main(), антиотлачик и прочее отключено. Имеем на выходе виртуальную машину (код из ILSpy):

Это реально как-то восстановить в исходный код? Какой вообще подход к модификации виртуального кода?
 

MrPavlik

Зарегистрированный
Сообщения
1
Реакции
0
Есть 32-битное приложение (Turbo Linker(2.25*,Delphi)[EXE32]), накрытое Vmprotect. OEP нашёл, вроде распаковал. С частью импорта справился VMPImportFixer, часть пришлось править руками. Внутри приложения есть защищённые функции. До перехода в них приложение работает нормально. На выполнении функций, накрытых VMProtect - крашится. Пока не совсем понимаю, это нормальная ситуация с распакованным приложением или при корректной распаковке (без разбора VM-функций) такого быть не должно? Спасибо.
 
Верх Низ