-
Автор темы
- #1
Всем привет, делал эксперимент с перезаписью функции в райтайме.
Допустим, вы хотите сделать защиту от дампа, что бы важные функции или данные в них не засветились, тогда можно заменить все инструкции в этой функции nop'ами.
Сразу скажу, что в дополнении к этому коду, следует использовать обфускаторы.
Вот пример кода который получился у меня:
Я сделал для примера функцию которая выделяет 320 байт в памяти приложения используя WinApi функцию VirtualAlloc.
Предположим, что данная функция отработает у нас только 1 раз и в будущем она нам не понадобится.
В main функции я написал такой код (оставил комментарии для вас).
Результат дампа такой:
Теперь реверсер вместо функции получит попу)).
В теории, если заморочиться, то можно переписать функцию, и записать туда небольшой малварь, и если невнимательный реверсер решит открыть его, вы сами понимаете что может быть...)
Как узнать длину функции, я написал в Readme на моём
Допустим, вы хотите сделать защиту от дампа, что бы важные функции или данные в них не засветились, тогда можно заменить все инструкции в этой функции 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;
}
В 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 на моём
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Пожалуйста, авторизуйтесь для просмотра ссылки.