Шалам валейкум
Каждому реверсеру рано или поздно придется столкнуться с магией от VMProtect, в таком случае локальные патчи через дебаггер
уже не будут работать из-за защиты памяти, поэтому на помощь к нам придет удаленный патч.
1. Создаем проект "Консольное приложение" с любым названием.
2. Переходим в ваш .cpp файл и вписываем два инклуда
3. Вписываем три глобальные переменные, ваши байты (в моем случае это будет безусловный джамп, т.е. патч займет два байта), адрес и процесс айди
4. Переходим в int main(), аля главной функции. Сделаем так, чтобы консольное приложение открывало наш процесс по его pid.
5. Используем условные операторы, чтобы в дальнейшем проверять смогли ли мы аттачнуться, в else будем записывать дальнейшие действия для патча.
Итак, для дальнейшего патча в else нам понадобиться WriteProcessMemory, в его параметрах мы и запишем наш патч.
Мы закончили написание самого патча, теперь можно проверить его на защищенном вмпротектом приложении.
Вот нужный нам адрес для патча, попробуем его пропатчить удаленно:
Вводим нужный нам pid и JNE превращается в JMP :)
Вводим любой пароль и он будет приниматься как за правильный :)
На этом гайд заканчивается, если есть вопросы: можете написать в ВК или под тредом
Каждому реверсеру рано или поздно придется столкнуться с магией от VMProtect, в таком случае локальные патчи через дебаггер
уже не будут работать из-за защиты памяти, поэтому на помощь к нам придет удаленный патч.
1. Создаем проект "Консольное приложение" с любым названием.
2. Переходим в ваш .cpp файл и вписываем два инклуда
C++:
#include <Windows.h> // Для манипуляции с памятью
#include <iostream> // Для std оператора
3. Вписываем три глобальные переменные, ваши байты (в моем случае это будет безусловный джамп, т.е. патч займет два байта), адрес и процесс айди
Код:
BYTE jmp[] = { 0xEB, 0x00 }; // Безусловный джамп
DWORD Address = 0xAA104F; // Адрес для патча
DWORD pid; // Процесс айди
4. Переходим в int main(), аля главной функции. Сделаем так, чтобы консольное приложение открывало наш процесс по его pid.
C++:
std::cout << "Enter pid: "; // Просим ввести pid
std::cin >> pid; // Запоминаем введенный pid
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, pid); // Аттачимся к процессу
5. Используем условные операторы, чтобы в дальнейшем проверять смогли ли мы аттачнуться, в else будем записывать дальнейшие действия для патча.
Итак, для дальнейшего патча в else нам понадобиться WriteProcessMemory, в его параметрах мы и запишем наш патч.
C++:
if (!hProcess) // Если не смог аттачнуться
{
std::cout << "[-] OpenProcess failed!" << std::endl;
}
else
{
std::cout << "[+] Process opened!" << std::endl;
// Подробнее можно прочитать про эту функцию на MSDN
if (!WriteProcessMemory(hProcess, LPVOID(Address), &jmp, sizeof(jmp), 0)) // Если не смог записать патч
{
std::cout << "[-] WriteProcessMemory failed!\nGetLastError(): " << GetLastError() << std::endl;
}
else
{
std::cout << "[+] Inline Patching Successful!" << std::endl;
}
system("pause");
}
Мы закончили написание самого патча, теперь можно проверить его на защищенном вмпротектом приложении.
Вот нужный нам адрес для патча, попробуем его пропатчить удаленно:
Вводим нужный нам pid и JNE превращается в JMP :)
Вводим любой пароль и он будет приниматься как за правильный :)
На этом гайд заканчивается, если есть вопросы: можете написать в ВК или под тредом
Последнее редактирование: