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

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

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


Мы закончили написание самого патча, теперь можно проверить его на защищенном вмпротектом приложении.

Вот нужный нам адрес для патча, попробуем его пропатчить удаленно:
1610284386221.png


Вводим нужный нам pid и JNE превращается в JMP :)
1610284472476.png


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

1610284516397.png


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

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


Мы закончили написание самого патча, теперь можно проверить его на защищенном вмпротектом приложении.

Вот нужный нам адрес для патча, попробуем его пропатчить удаленно:
Посмотреть вложение 4525

Вводим нужный нам pid и JNE превращается в JMP :)
Посмотреть вложение 4526

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

Посмотреть вложение 4527

На этом гайд заканчивается, если есть вопросы: можете написать в ВК или под тредом
Спасибо. Интересно
 
Сверху Снизу