Форум
ПОИСК ПО ФОРУМУ
Портал
ПОИСК ПО ФОРУМУ
Авторы
Что нового
Медиа
Поиск медиа
Архив
Пользователи
Сейчас на форуме
Поиск сообщений в профиле
ПОИСК
Вход
Регистрация
Что нового
ПОИСК ПО ФОРУМУ
Меню
Вход
Регистрация
Установить приложение форума
Установить
Уменьшение отступа
Обратная связь
(info@ru-sfera.pw)
Форум
Программирование
С++
Защита приложения C++ от дампа.
JavaScript отключён. Для полноценно использования нашего сайта, пожалуйста, включите JavaScript в своём браузере.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать
другой
.
Ответить в теме
Сообщение
<blockquote data-quote="MKII" data-source="post: 148329" data-attributes="member: 27173"><p>Всем привет, делал эксперимент с перезаписью функции в райтайме.</p><p>Допустим, вы хотите сделать защиту от дампа, что бы важные функции или данные в них не засветились, тогда можно заменить все инструкции в этой функции nop'ами.</p><p></p><p>Вот пример кода который получился у меня:</p><p>Я сделал для примера функцию которая выделяет 320 байт в памяти приложения используя WinApi функцию VirtualAlloc.</p><p>[CODE=cpp]LPVOID Valloc()</p><p>{</p><p> LPVOID lpvResult;</p><p></p><p> lpvResult = VirtualAlloc(NULL, 320, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);</p><p></p><p> if (lpvResult == NULL)</p><p> {</p><p> MessageBoxA(NULL, "VirtualAlloc failed!", "SHC", MB_OK);</p><p> return 0;</p><p> }</p><p> VirtualFree(lpvResult, 0, MEM_RELEASE);</p><p> MessageBoxA(NULL, "VirtualAlloc success!", "SHC", MB_OK);</p><p> </p><p> return lpvResult;</p><p>}[/CODE]</p><p></p><p>Предположим, что данная функция отработает у нас только 1 раз и в будущем она нам не понадобится.</p><p></p><p>В main функции я написал такой код (оставил комментарии для вас).</p><p>[CODE=cpp]#pragma optimize( "", off )</p><p></p><p>typedef LPVOID(*pAlloc)();</p><p>LPVOID Valloc();</p><p></p><p>VOID WINAPI Entry(VOID)</p><p>{</p><p> //MessageBoxA(NULL, "Hello World!", "SHC", MB_OK);</p><p> LPVOID Done = Valloc(); //Выполняем нашу основную функцию</p><p> </p><p> DWORD oldProtect;</p><p> size_t functionSize = 97; //Указываем размер нашей функции Valloc в моём случае, она весит 98 байт, но я указываю 97, так как в конце функции есть ret, который занимает 1 байт (её можно тоже заменить, но в таком случае дебаггер не будет видеть её:().</p><p> VirtualProtect(Valloc, functionSize, PAGE_EXECUTE_READWRITE, &oldProtect);</p><p></p><p> //Заменяем нашу функцию на указанный опкод, если хотите заменить nop'ы, то 0x61 замените на 0x90</p><p> //Опкоды можно узнать тут: http://xxeo.com/single-byte-or-small-x86-opcodes</p><p> for (size_t i = 0; i < functionSize; ++i) {</p><p> *((char*)Valloc + i) = 0x61;</p><p> }</p><p> VirtualProtect(Valloc, functionSize, oldProtect, &oldProtect);</p><p></p><p> pAlloc functionPointer = Valloc;</p><p> MessageBoxA(NULL, "NOP success!", "SHC", MB_OK); //Выводим сообщение, что всё прошло успешно.</p><p>}[/CODE]</p><p></p><p>Результат дампа такой:</p><p>[ATTACH=full]60254[/ATTACH]</p><p></p><p>Теперь реверсер вместо функции получит попу)).</p><p></p><p>В теории, если заморочиться, то можно переписать функцию, и записать туда небольшой малварь, и если невнимательный реверсер решит открыть его, вы сами понимаете что может быть...)</p><p></p><p>Как узнать размер нашей функции, можно найти в этой статье: <a href="https://ru-sfera.pw/threads/generacija-koda-na-si-chast-vtoraja-ispolnjaem-kod-na-letu.3537/" target="_blank">Малварь как искусство - Генерация кода на си. Часть вторая. Исполняем код на лету</a></p><p>Отрывок из статьи пользователя [USER=1]@X-Shar[/USER]</p><p>3. Ну тут думаю понятно, вычисляем длину функции, далее копируем в специальный буфер и этот буфер сохраняем в файл:</p><p>[CODE=cpp]int func_len = (unsigned int) _Bild</p><p> - (unsigned int) _Demo;</p><p> char buff[1000];</p><p> memcpy (buff, _Demo, func_len);</p><p></p><p> f=fopen("Demo32.bin","wb");</p><p> for (int a=0;a<func_len;a++)</p><p> fputc(((int) buff[a]),f);</p><p> fclose(f);[/CODE]</p></blockquote><p></p>
[QUOTE="MKII, post: 148329, member: 27173"] Всем привет, делал эксперимент с перезаписью функции в райтайме. Допустим, вы хотите сделать защиту от дампа, что бы важные функции или данные в них не засветились, тогда можно заменить все инструкции в этой функции nop'ами. Вот пример кода который получился у меня: Я сделал для примера функцию которая выделяет 320 байт в памяти приложения используя WinApi функцию VirtualAlloc. [CODE=cpp]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; }[/CODE] Предположим, что данная функция отработает у нас только 1 раз и в будущем она нам не понадобится. В main функции я написал такой код (оставил комментарии для вас). [CODE=cpp]#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); //Выводим сообщение, что всё прошло успешно. }[/CODE] Результат дампа такой: [ATTACH type="full" alt="1675170912221.png"]60254[/ATTACH] Теперь реверсер вместо функции получит попу)). В теории, если заморочиться, то можно переписать функцию, и записать туда небольшой малварь, и если невнимательный реверсер решит открыть его, вы сами понимаете что может быть...) Как узнать размер нашей функции, можно найти в этой статье: [URL='https://ru-sfera.pw/threads/generacija-koda-na-si-chast-vtoraja-ispolnjaem-kod-na-letu.3537/']Малварь как искусство - Генерация кода на си. Часть вторая. Исполняем код на лету[/URL] Отрывок из статьи пользователя [USER=1]@X-Shar[/USER] 3. Ну тут думаю понятно, вычисляем длину функции, далее копируем в специальный буфер и этот буфер сохраняем в файл: [CODE=cpp]int func_len = (unsigned int) _Bild - (unsigned int) _Demo; char buff[1000]; memcpy (buff, _Demo, func_len); f=fopen("Demo32.bin","wb"); for (int a=0;a<func_len;a++) fputc(((int) buff[a]),f); fclose(f);[/CODE] [/QUOTE]
Проверка
Ответ
Форум
Программирование
С++
Защита приложения C++ от дампа.
Верх
Низ