 |
30.11.2008, 01:31
|
#1
|
|
|
|
Капитан
|
 Регистрация: 14.05.2008
 Сообщений: 253
 Популярность: 1015
 Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
|
Пишем иньектор DLL-ок на С++.
Немного теории.
Техническое задание: показать MessageBox от имени друго окна из его же процесса.
Давайте разберемся что же такое инъекция кода.
Это перенос кусочка кода в другой процесс.
Перенести туда мы можем только функцию точнее говоря
функцию - начало исполнения Thread-а. Думаю все хоть раз
делали много поточную программу. Но в данном случае перенос кода невозможен из за того что адресация в каждом процессе своя и валидный адрес для одного процесса таковым не будет для другого. Тогда как же сделать инъекцию ?
Вспомните как расшифровывается название DLL. Dynamic Link Library. Вот собственно и вся суть. Линковка происходит прямо в процессе приемнике, значит наша задача сводится к тому что бы
подключить свою DLL к целевому процессу. Делать мы это будем следующим образом:
1. Получим реальный адрес функции LoadLibraryA.
2. Загрузим в память процесса, название нашей DLL-ки
3. Создадим Remote Thread начальной процедурой для которого будет
LoadLibraryA, для этого мы и получили ее реальный адрес.
Для начала взглянем на прототипы всех используемых нами процедур:
WinMain
Код:
int WINAPI WinMain(
HINSTANCE hInstance, //Адрес на свой собственный модуль.
HINSTANCE hPrevInstance,//Нуль-значение, если конечно запущена из первого поколения.
LPSTR lpCmdLine,//Два параметра которые помогают делать настоящие консольные приложения.
int nCmdShow
);
ОПИСАНИЕ: Главная функция Win32 приложения. Входные параметры чаще всего не используются. Не мы ее вызываем, а ей передается управление сразу после запуска программы. Возвращает тип завершения программы. Ноль это удачное завершение.
OpenProcess
Код:
HANDLE WINAPI OpenProcess(
__in DWORD dwDesiredAccess,//Уровень доступа к процессу
__in BOOL bInheritHandle,//Флаг наследования хендла дочерними процессами
__in DWORD dwProcessId//PID процесса. Можно посмотреть в Диспетчере задач.
);
ОПИСАНИЕ: Функция открывает процесс для работы с ним, возвращает хендл на процесс.
VirtualAllocEx
Код:
LPVOID WINAPI VirtualAllocEx(
__in HANDLE hProcess,//Хендл на процесс.
__in_opt LPVOID lpAddress,//Адрес с которого будет выделятся память.
__in SIZE_T dwSize,//Обьем выделяемой памяти.
__in DWORD flAllocationType,//Тип выделения.
__in DWORD flProtect//Защита на выделенной памяти.
);
ОПИСАНИЕ: Выделяет в виртуально памяти целевого процесса некоторый обьем памяти. Возвращает хендл на эту память.
WriteProcessMemory
Код:
BOOL WINAPI WriteProcessMemory(
__in HANDLE hProcess,//Хендл на целевой процесс
__in LPVOID lpBaseAddress,//Адрес начала
__in LPCVOID lpBuffer,//То что нужно записать.
__in SIZE_T nSize,//Обьем того что нужно записать.
__out SIZE_T *lpNumberOfBytesWritten//Адрес переменной в которую
//запишется количество успешно записанных байт. Опционально.
);
ОПИСАНИЕ: Пишет данные в память. Возвращает либо True если все хорошо прошло или же False.
GetProcAdress
Код:
FARPROC WINAPI GetProcAddress(
__in HMODULE hModule,//Хендл на модуль из которого будем грузить.
__in LPCSTR lpProcName//Название процедуры.
);
ОПИСАНИЕ: Вытаскивает реальный адрес, процедуры в DLL -например. Возвращает этот адрес.
GetModuleHandle
Код:
HMODULE WINAPI GetModuleHandle(
__in_opt LPCTSTR lpModuleName
);
ОПИСАНИЕ: Получает хендл на модуль, например на DLL
CreateRemoteThread
Код:
HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,//Хендл на целевой процесс
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,//Атрибуты безопасности для нашего треда. Задаются структурой, опционально.
__in SIZE_T dwStackSize,//размер стека нашего треда. 0 - такой же как у вызывающего треда.
__in LPTHREAD_START_ROUTINE lpStartAddress,//Адрес процедуры в нашей программе, которая будет началом для треда.
__in LPVOID lpParameter,//аргумент для процедуры. Больше одного параметра ставить не пробовал.
__in DWORD dwCreationFlags,//Параметры создания для треда. 0 - сразу запустить выполнение.
__out LPDWORD lpThreadId//Номер нашего Thread-а. Опционально.
);
ОПИСАНИЕ: Создает Remote Thread в целевом процессе и возвращает хендл на него.
С функционалом разобрались, приступим к написанию. Я не буду писать все пошагово хотя бы потому что кода кот наплакал.
Код:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char libname[]="D:\mylib.dll";//Название моей билиотеки.
int libsize=strlen(libname);//Длина названия.
DWORD PID=4084;//Pid целевого процесса.
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//Открываем процесс с безграничными правами на доступ=)
PSTR remLibName=(PSTR)VirtualAllocEx(hProcess,0,libsize,MEM_COMMIT,PAGE_READWRITE);//PSTR это тип указатель на строку в памяти. Это очень похоже на (Char*)malloc(10);
WriteProcessMemory(hProcess,remLibName,libname,libsize,0);//Записываем название DLL-ки в память целевого процесса.
LPTHREAD_START_ROUTINE lprFunc=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");//Получаем адрес процедуры и преобразовываем в тип адреса на функцию.
CreateRemoteThread(hProcess,0,0,lprFunc,remLibName,0,0);//Создаем наш Тред и благополучно возвращаем 0 - удачное завершение.
return 0;
}
Сложно ? По-моему нет.
В качестве DLL-ки используется любая настоящая DLL-ка и ее базовый код должен выглядть где то так.
Код:
BOOL APIENTRY DllMain( HANDLE hModule, //Хендл на саму себя.
DWORD ul_reason_for_call,//Причина вызова.
LPVOID lpReserved )
{
/*Тут вы уже можете добавить свой код, это может быть что угодно.
Формочки тоже можно лепить.*/
return TRUE;
}
Код без комментариев
Код:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char libname[]="D:\mylib.dll";
int libsize=strlen(libname);
DWORD PID=4084;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
PSTR remLibName=(PSTR)VirtualAllocEx(hProcess,0,libsize,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,remLibName,libname,libsize,0);
LPTHREAD_START_ROUTINE lprFunc=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
CreateRemoteThread(hProcess,0,0,lprFunc,remLibName,0,0);
return 0;
}
На это собственно все. Жду вопросов в этой теме=)
PS: Глупых вопросов не бывает.
PSS: Рекомендую выключить антивирус перед компиляцией))
Последний раз редактировалось Ivan_32; 30.11.2008 в 12:19.
|
|
|
6 пользователя(ей) сказали cпасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 15:42.
|
 |