Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Закрытая тема
 
Опции темы
Старый 30.11.2008, 00:31   #1
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию Пишем иньектор 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;
}
Код без комментариев
На это собственно все. Жду вопросов в этой теме=)
PS: Глупых вопросов не бывает.
PSS: Рекомендую выключить антивирус перед компиляцией))

Последний раз редактировалось Ivan_32; 30.11.2008 в 11:19.
 
6 пользователя(ей) сказали cпасибо:
Глюконатор (30.11.2008), geny (26.05.2011), JKHKJgj (21.04.2015), Leo_ня (20.07.2009), PeTaK (30.11.2008), Zhyk (30.11.2008)
Закрытая тема

Метки
dll-ок, иньектор, пишем, с++.


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пишем разными цветами (скрипт) Hummel Читы, баги и статьи по WoW 4 13.06.2010 00:22
пишем в "All"-чат не использую пудру FFForever Архив уязвимостей 12 07.09.2008 20:57
Пишем сразу нескольким игрокам, конференц общение без пати. Danilk Rising Force Online 7 25.06.2008 23:19

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:09.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net