На заметку Рантайм линковка.


MKII

Просветленный
Просветленный
Регистрация
03.10.2022
Сообщения
264
Репутация
197
Всем привет!
Решил написать статью про рантайм линковку.

Рантайм линковка позволяет избавиться от таблицы импортов, тем самым немного затруднит анализ кода реверс инженерами.
Для реализации всего этого, вам не потребуется особых знаний, достаточно иметь под рукой документацию Microsoft.

Рассмотрим на примере функции MessageBoxA.
Для реализации нам понадобиться несколько вещей.
1. Синтаксис.
1665413685710.png

2. DLL в которой содержится наша функция (MessageBoxA).
1665413720284.png


Документация для MessageBoxA:

Теперь можно начать писать код.

Для начала нам требуется сделать указатель на функцию (typedef).
C:
typedef int(__stdcall MesBoxa)(HWND, LPCSTR, LPCSTR, UINT);
Теперь можно объявить HMODULE, который будет содержать базовый адрес DLL.
C:
HMODULE hUser32;
MesBoxa* MessageBoxA;
Теперь нужно загрузить DLL "User32.dll", в которой содержится функция, и получить адрес функции (MessageBoxA).
C:
hUser32 = LoadLibraryA("user32.dll");
MessageBoxA = (MesBoxa*)GetProcAddress(hUser32, "MessageBoxA");
Теперь можно вызвать функцию и освободить библиотеку.
C:
MessageBoxA(NULL, "Hello World!", "test~", MB_OK);
FreeLibrary(hUser32);

Успешно!
1665414327585.png


Для удобства, я вывел всё это в отдельную void функцию и добавил xor.
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);
}

Аналогично всё делается и с другими функциями.
1665414489916.png


Таблица импортов:
1665414655464.png


Кому лень переписывать вручную, добавил архив с готовыми функциями.
 

Вложения

  • ru sfera.rar
    1.8 КБ · Просмотры: 1

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 174
Репутация
8 310
А такое скрытие что даёт ?
Типо усложняет статический анализ ?

Хорошо-бы ещё скрыть GetProcAddress, LoadLibraryA и FreeLibrary.

А-то кто будет анализировать сразу поймёт что тут динамическая линковка.)
 

MKII

Просветленный
Просветленный
Регистрация
03.10.2022
Сообщения
264
Репутация
197
А такое скрытие что даёт ?
Типо усложняет статический анализ ?

Хорошо-бы ещё скрыть GetProcAddress, LoadLibraryA и FreeLibrary.

А-то кто будет анализировать сразу поймёт что тут динамическая линковка.)

Реверсерам придется покопаться в листингах, чтоб понять, что делает тот или иной вызов.

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

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 174
Репутация
8 310
Я пытался скрыть, но у меня нечего не получилось, поскольку для скрытия данных функций, надо вызвать их так или иначе, вот такая проблема(не считая FreeLibrary, она скрывается без проблем).
Это можно сделать при помоще lasy importer.
Ну или вот-такой штуки:

В том примере как-раз есть реализация скрытия LoadLibrary, а также других API, таких как CreateFile.)
 
Верх Низ