Гайд [C++ для самых маленьких] Удалённый патч памяти

  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 238
Шалам валейкум

Каждому реверсеру рано или поздно придется столкнуться с магией от 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 :)


Вводим любой пароль и он будет приниматься как за правильный :)



На этом гайд заканчивается, если есть вопросы: можете написать в ВК или под тредом
 
Последнее редактирование:
  • G3nd3r
  • ♂️Dungeon master♂️
  • 713
  • 176
Вотб, а можно чтобы прям всё раз живать, не просто перемолоть в крошку, а прям в мелкую пыль из-за которой аллергия?
Я просто ноль в ваши обратных инженерингах.
 
  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 238
тебе нужно объяснить как работают инклуды, для чего нужны глобальные переменные, для чего нужен оператор std и объяснить работу условных операторов?
 
  • 112
  • 92
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Спасибо. Интересно
 
Активность
Пока что здесь никого нет
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше...