C++ Исходник Защита функции от дампа.

Начинающий
Статус
Оффлайн
Регистрация
4 Фев 2023
Сообщения
49
Реакции[?]
8
Поинты[?]
1K
Всем привет, делал эксперимент с перезаписью функции в райтайме.
Допустим, вы хотите сделать защиту от дампа, что бы важные функции или данные в них не засветились, тогда можно заменить все инструкции в этой функции nop'ами.
Сразу скажу, что в дополнении к этому коду, следует использовать обфускаторы.

Вот пример кода который получился у меня:
Я сделал для примера функцию которая выделяет 320 байт в памяти приложения используя WinApi функцию VirtualAlloc.
C++:
LPVOID Valloc()
{
    LPVOID lpvResult;

    lpvResult = VirtualAlloc(NULL, 320, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    if (lpvResult == NULL)
    {
        MessageBoxA(NULL, "VirtualAlloc failed!", "SHC", MB_OK);
        return 0;
    }
    VirtualFree(lpvResult, 0, MEM_RELEASE);
    MessageBoxA(NULL, "VirtualAlloc success!", "SHC", MB_OK);
 
    return lpvResult;
}
Предположим, что данная функция отработает у нас только 1 раз и в будущем она нам не понадобится.

В main функции я написал такой код (оставил комментарии для вас).
C++:
#pragma optimize( "", off )

typedef LPVOID(*pAlloc)();
LPVOID Valloc();

VOID WINAPI Entry(VOID)
{
    //MessageBoxA(NULL, "Hello World!", "SHC", MB_OK);
    LPVOID Done = Valloc(); //Выполняем нашу основную функцию
 
    DWORD oldProtect;
    size_t functionSize = 97; //Указываем размер нашей функции Valloc в моём случае, она весит 98 байт, но я указываю 97, так как в конце функции есть ret, который занимает 1 байт (её можно тоже заменить, но в таком случае дебаггер не будет видеть её:().
        VirtualProtect(Valloc, functionSize, PAGE_EXECUTE_READWRITE, &oldProtect);

        //Заменяем нашу функцию на указанный опкод, если хотите заменить nop'ы, то 0x61 замените на 0x90
        //Опкоды можно узнать тут: http://xxeo.com/single-byte-or-small-x86-opcodes
    for (size_t i = 0; i < functionSize; ++i) {
        *((char*)Valloc + i) = 0x61;
    }
    VirtualProtect(Valloc, functionSize, oldProtect, &oldProtect);

    pAlloc functionPointer = Valloc;
    MessageBoxA(NULL, "NOP success!", "SHC", MB_OK); //Выводим сообщение, что всё прошло успешно.
}
Результат дампа такой:

Теперь реверсер вместо функции получит попу)).

В теории, если заморочиться, то можно переписать функцию, и записать туда небольшой малварь, и если невнимательный реверсер решит открыть его, вы сами понимаете что может быть...)

Как узнать длину функции, я написал в Readme на моём
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Сверху Снизу