Форум
ПОИСК ПО ФОРУМУ
Портал
ПОИСК ПО ФОРУМУ
Авторы
Что нового
Медиа
Поиск медиа
Архив
Пользователи
Сейчас на форуме
Поиск сообщений в профиле
ПОИСК
Вход
Регистрация
Что нового
ПОИСК ПО ФОРУМУ
Меню
Вход
Регистрация
Установить приложение форума
Установить
Уменьшение отступа
Обратная связь
(info@ru-sfera.pw)
Форум
Программирование
С++
Рантайм линковка.
JavaScript отключён. Для полноценно использования нашего сайта, пожалуйста, включите JavaScript в своём браузере.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать
другой
.
Ответить в теме
Сообщение
<blockquote data-quote="MKII" data-source="post: 147659" data-attributes="member: 27173"><p>Всем привет!</p><p>Решил написать статью про рантайм линковку.</p><p></p><p>Рантайм линковка позволяет избавиться от таблицы импортов, тем самым немного затруднит анализ кода реверс инженерами.</p><p>Для реализации всего этого, вам не потребуется особых знаний, достаточно иметь под рукой документацию Microsoft.</p><p></p><p>Рассмотрим на примере функции MessageBoxA.</p><p>Для реализации нам понадобиться несколько вещей.</p><p>1. Синтаксис.</p><p>[ATTACH=full]59954[/ATTACH]</p><p>2. DLL в которой содержится наша функция (MessageBoxA).</p><p>[ATTACH=full]59955[/ATTACH]</p><p></p><p>Документация для MessageBoxA: <a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa" target="_blank">Link</a></p><p></p><p>Теперь можно начать писать код.</p><p></p><p>Для начала нам требуется сделать указатель на функцию (typedef).</p><p>[CODE=c]typedef int(__stdcall MesBoxa)(HWND, LPCSTR, LPCSTR, UINT);[/CODE]</p><p>Теперь можно объявить HMODULE, который будет содержать базовый адрес DLL.</p><p>[CODE=c]HMODULE hUser32;</p><p>MesBoxa* MessageBoxA;[/CODE]</p><p>Теперь нужно загрузить DLL "User32.dll", в которой содержится функция, и получить адрес функции (MessageBoxA).</p><p>[CODE=c]hUser32 = LoadLibraryA("user32.dll");</p><p>MessageBoxA = (MesBoxa*)GetProcAddress(hUser32, "MessageBoxA");[/CODE]</p><p>Теперь можно вызвать функцию и освободить библиотеку.</p><p>[CODE=c]MessageBoxA(NULL, "Hello World!", "test~", MB_OK);</p><p>FreeLibrary(hUser32);[/CODE]</p><p></p><p>Успешно!</p><p>[ATTACH=full]59956[/ATTACH]</p><p></p><p>Для удобства, я вывел всё это в отдельную void функцию и добавил xor.</p><p>[CODE=c]void MessageBoxL(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)</p><p>{</p><p> HMODULE hUser32 = LoadLibraryA(_xor_("user32.dll").c_str());</p><p> MesBoxa* MessageBoxA = (MesBoxa*)GetProcAddress(hUser32, _xor_("MessageBoxA").c_str());</p><p> MessageBoxA(hWnd, lpText, lpCaption, uType);</p><p> FreeLibrary(hUser32);</p><p>}[/CODE]</p><p></p><p>Аналогично всё делается и с другими функциями.</p><p>[ATTACH=full]59957[/ATTACH]</p><p></p><p>Таблица импортов:</p><p>[ATTACH=full]59959[/ATTACH]</p><p></p><p>Кому лень переписывать вручную, добавил архив с готовыми функциями.</p></blockquote><p></p>
[QUOTE="MKII, post: 147659, member: 27173"] Всем привет! Решил написать статью про рантайм линковку. Рантайм линковка позволяет избавиться от таблицы импортов, тем самым немного затруднит анализ кода реверс инженерами. Для реализации всего этого, вам не потребуется особых знаний, достаточно иметь под рукой документацию Microsoft. Рассмотрим на примере функции MessageBoxA. Для реализации нам понадобиться несколько вещей. 1. Синтаксис. [ATTACH type="full"]59954[/ATTACH] 2. DLL в которой содержится наша функция (MessageBoxA). [ATTACH type="full"]59955[/ATTACH] Документация для MessageBoxA: [URL='https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa']Link[/URL] Теперь можно начать писать код. Для начала нам требуется сделать указатель на функцию (typedef). [CODE=c]typedef int(__stdcall MesBoxa)(HWND, LPCSTR, LPCSTR, UINT);[/CODE] Теперь можно объявить HMODULE, который будет содержать базовый адрес DLL. [CODE=c]HMODULE hUser32; MesBoxa* MessageBoxA;[/CODE] Теперь нужно загрузить DLL "User32.dll", в которой содержится функция, и получить адрес функции (MessageBoxA). [CODE=c]hUser32 = LoadLibraryA("user32.dll"); MessageBoxA = (MesBoxa*)GetProcAddress(hUser32, "MessageBoxA");[/CODE] Теперь можно вызвать функцию и освободить библиотеку. [CODE=c]MessageBoxA(NULL, "Hello World!", "test~", MB_OK); FreeLibrary(hUser32);[/CODE] Успешно! [ATTACH type="full"]59956[/ATTACH] Для удобства, я вывел всё это в отдельную void функцию и добавил xor. [CODE=c]void MessageBoxL(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) { HMODULE hUser32 = LoadLibraryA(_xor_("user32.dll").c_str()); MesBoxa* MessageBoxA = (MesBoxa*)GetProcAddress(hUser32, _xor_("MessageBoxA").c_str()); MessageBoxA(hWnd, lpText, lpCaption, uType); FreeLibrary(hUser32); }[/CODE] Аналогично всё делается и с другими функциями. [ATTACH type="full"]59957[/ATTACH] Таблица импортов: [ATTACH type="full"]59959[/ATTACH] Кому лень переписывать вручную, добавил архив с готовыми функциями. [/QUOTE]
Проверка
Ответ
Форум
Программирование
С++
Рантайм линковка.
Верх
Низ