TGViewer
Codeby Codeby @codeby_sec · 37.1K subscribers
Post #8292 6.35K
Что такое DLL-injection? 👩‍💻

⏺️DLL-инъекции часто используются внешними программами, чтобы повлиять на поведение другой программы так, как её авторы не задумывали и не предполагали.

⏺️Например, внедрённый код может перехватывать системные вызовы функций или прочитать содержимое текстовых полей пароля, что невозможно сделать обычным способом.

👩‍💻 На Windows имеется множество способов заставить процесс загрузить код в DLL-библиотеке:
DLL-файлы, указанные в списке системного реестра по ключу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, будут загружаться в каждом процессе, загружающем библиотеку User32.dll при её начальном вызове.

DLL-файлы по ключу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs будут загружаться в каждом процессе, которые вызывают функции Windows API CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW и WinExec.

Эксплуатация ограничений Windows и приложений, вызывающих LoadLibrary или LoadLibraryEx без указания пути к загружаемой DLL.


👩‍💻 Пример такого кода на языке C:
#include <windows.h>

HANDLE inject_DLL(const char* file_name, int PID)
{
HANDLE h_process, h_rThread;
char fullDLLPath[_MAX_PATH];
LPVOID DLLPath_addr, LoadLib_addr;
DWORD exit_code;

/* Извлечение handle-идентификатора целевого процесса */
h_process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

/* Получение полного пути к DLL-файлу */
GetFullPathName(file_name, _MAX_PATH, fullDLLPath, NULL);

/* Выделение памяти в целевом процессе */
DLLPath_addr = VirtualAllocEx(h_process, NULL, _MAX_PATH,
MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

/* Запись пути к DLL-файлу в недавно созданный блок памяти */
WriteProcessMemory(h_process, DLLPath_addr, fullDLLPath,
strlen(fullDLLPath), NULL);

/* Получение адреса LoadLibraryA (такой же для всех процессов), чтобы начать его запуск */
LoadLib_addr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");

/* Запуск удалённого потока в LoadLibraryA, и проброс пути к DLL в качестве аргумента */
h_rThread = CreateRemoteThread(h_process, NULL, 0,
(LPTHREAD_START_ROUTINE)LoadLib_addr, DLLPath_addr, 0, NULL);

/* Ожидание его завершения */
WaitForSingleObject(h_rThread, INFINITE);

/* Получение кода завершения (то есть, значение handle, возвращённый вызовом LoadLibraryA */
GetExitCodeThread(h_rThread, &exit_code);

/* Освобождение носителя внедрённого потока. */
CloseHandle(h_rThread);
/* А также память, выделенная для пути к DLL */
VirtualFreeEx(h_process, DLLPath_addr, 0, MEM_RELEASE);
/* А также handle-иднетификатор целевого процесса */
CloseHandle(h_process);

return (HANDLE)exit_code;
}
  • 🔥 27
  • 👍 11
  • 💯 6
  • 👎 2
  • 😁 1
More from @codeby_sec
  1. Oct 12, 2026❗️ Новости недели (5 – 11 октября) Разбираем главные события недели: ЦОДы «Яндекса», ИИ на…
  2. Oct 12, 2026Ищешь баги? Здесь ищут тебя. Вилка: 160–220 тысяч ₽ на руки. ООО «Артис» набирает Web Pent…
  3. Oct 12, 202635 из 40 резюме — в корзину. Что не так с junior-пентестерами? За последний квартал я отсм…
  4. Oct 10, 2026Ты ещё используешь Sherlock или уже перешёл на что-то другое? Прогоняешь никнейм, получаеш…
  5. Oct 10, 2026🚩 Новые задания на платформе HackerLab! 🧰 Категория PWN — Я в своём познании настолько п…
  6. Oct 9, 2026✈️ Telegram Desktop — критическая уязвимость в обработке tg://-ссылок (CVE-2026-107181) В…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →