Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2014, 22:03   #1
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию Инжект кода в чужой процесс

Всем привет. Сразу скажу, что я пишу приложение для родительского контроля. А вы сами знаете, какие сейчас "детишки" пошли, что процесс нужно прятать. Так как перехват API для меня сложен, решил делать инжект в explorer.exe

Функцию нашел в интернете

Код:

#pragma comment(linker,"/BASE:0x13140000")

#define BASEADDR 0x13140000

BOOL InjectIntoProcess(HANDLE p_handle, PVOID proc)
{		
	PBYTE Buffer;
	DWORD dwRead=0;

	DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(BASEADDR) + 
		((PIMAGE_DOS_HEADER)(BASEADDR))->e_lfanew 
			+ sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;

	Buffer = (PBYTE)VirtualAlloc(NULL, dwSize, 
		MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	if (Buffer == NULL)
		return FALSE;

	ReadProcessMemory(GetCurrentProcess(), (LPCVOID)BASEADDR, 
		(LPVOID)Buffer, dwSize, &dwRead);	

	PBYTE pMem = (PBYTE)VirtualAllocEx(p_handle, (LPVOID)BASEADDR, dwRead, 
		MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (Buffer == NULL)
		return FALSE;

	DWORD dwOldProt, dwNumBytes;
	VirtualProtectEx(p_handle, pMem , dwRead, PAGE_EXECUTE_READWRITE, 
		&dwOldProt);

	if (!WriteProcessMemory(p_handle, pMem, Buffer, dwRead, &dwNumBytes))
		return FALSE;

	DWORD dwThreadId;	
	CreateRemoteThread(p_handle, NULL, 0, &proc, NULL, 0, &dwThreadId); 

	return TRUE;
}
Вызываю так:

Код:
InjectIntoProcess(OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessID("explorer.exe")), &control);

При компиляции выбивает ошибку

Код:
46  cannot convert `void**' to `DWORD (*)(void*)' for argument `4' to `void* CreateRemoteThread(void*, _SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'

Прошу помощи
Malriser вне форума Ответить с цитированием
Старый 16.02.2014, 22:47   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Ну так естественно. Функция, которую ты передаешь в CreateRemoteThread, должна иметь конкретный прототип - http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
А ты пытаешься туда передать void**.

Да и вообще, это очень дерзкая функция:
Код:
	PBYTE pMem = (PBYTE)VirtualAllocEx(p_handle, (LPVOID)BASEADDR, dwRead,
		MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (Buffer == NULL)
		return FALSE;
Даже если оригинальный код загрузится по нужному адресу (без применения релокейшнов) и внутри explorer.exe окажется дырка достаточного размера по нужному адресу - придется внимательно следить, чтобы внедренная функция ничего не сломала: используемые дллки должны быть загружены по одинаковым адресам в обоих процессах, никаких обращений к своим ресурсам (хендлам, памяти выделенной в heap и тд).
Son Of Pain вне форума Ответить с цитированием
Старый 18.02.2014, 21:44   #3
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

Причём тут релоки и тд? Ты ерунду полную написал(и что б ты знал, в винде длл всегда по одному и тому же адресу загружаются).
Он хочется скопировать себя полностью в другой процесс и запустить. Достаточно интересный трюк с базой.
А по поводу того что не компилируется
Код:
CreateRemoteThread(p_handle, NULL, 0, (DWORD (__stdcall *)(void *))proc, NULL, 0, &dwThreadId);
Код:
BOOL InjectIntoProcess(HANDLE p_handle, PVOID *proc)

Последний раз редактировалось frommars; 18.02.2014 в 21:46.
frommars вне форума Ответить с цитированием
Старый 18.02.2014, 22:15   #4
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от frommars Посмотреть сообщение
А по поводу того что не компилируется
Код:
CreateRemoteThread(p_handle, NULL, 0, (DWORD (__stdcall *)(void *))proc, NULL, 0, &dwThreadId);
Код:
BOOL InjectIntoProcess(HANDLE p_handle, PVOID *proc)
Спасибо за хороший ответ, все сделал как вы предложили, но теперь пишет такое:

Код:
74  cannot convert `DWORD (*)()' to `void**' for argument `2' to `BOOL InjectIntoProcess(void*, void**)'
Malriser вне форума Ответить с цитированием
Старый 18.02.2014, 23:09   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от frommars Посмотреть сообщение
и что б ты знал, в винде длл всегда по одному и тому же адресу загружаются
Пруфлинк можно?
waleri вне форума Ответить с цитированием
Старый 18.02.2014, 23:37   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от frommars Посмотреть сообщение
Причём тут релоки и тд? Ты ерунду полную написал
Если приведенный фрагмент кода находится в длл (а у топикстартера нигде не сказано, что это не так), и при ее загрузке по указанному в заголовке адресу не найдется дырки нужного размера - длл будет загружена по другому адресу. И, соответственно, к ней будут применены релокейшны, для компенсации. Стоило упомянуть об этом, как об одном из возможных вариантов проблем.

Цитата:
и что б ты знал, в винде длл всегда по одному и тому же адресу загружаются).
Серьезно? ) А что случится, если, скажем, у двух extension dll, загружаемых в explorer.exe, будут одинаковые image base?

А еще ты забыл про aslr (можешь просветиться где-то здесь, например. Что случится, когда одна из системных длл после ребейсинга займет нужный кусок адресов?
Son Of Pain вне форума Ответить с цитированием
Старый 19.02.2014, 07:32   #7
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

Пруф? На
Код:
typedef struct _RPar
{
	DWORD dwMessageBox;
	TCHAR msgTitle[1024];
	TCHAR msgText[1024];
} RPar;


DWORD __stdcall ThreadProc(RPar *Para)
{
	FARPROC PMessageBox = (FARPROC)Para->dwMessageBox;
		

		PMessageBox(NULL, Para->msgText, Para->msgTitle, MB_OK);
			

return 0;
}

int _stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nCmdShow)
{
	DWORD dwThreadId, pID = 0, dwThreadSize = 2048;
	PVOID *pRemoteThread;
    TCHAR ExeFile[1024];
    HANDLE hProcess, hSnap;
    HINSTANCE hUser, hKernel;
    RPar my_RPar,*pmy_RPar;

    PROCESSENTRY32 pe32 = {0};


		if((hSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE )
			return 3;
    
		pe32.dwSize = sizeof(PROCESSENTRY32);
		Process32First(hSnap, &pe32);
		do
		{
			if(_tcsicmp(INJECT_EXE, pe32.szExeFile/*, strlen(INJECT_EXE)*/) == 0)
			{
				pID = pe32.th32ProcessID;
				break;
			}
		} 
		while(Process32Next(hSnap, &pe32));

		if(hSnap != INVALID_HANDLE_VALUE)
			CloseHandle(hSnap);
			
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
		pRemoteThread = VirtualAllocEx(hProcess, 0, dwThreadSize, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);

		WriteProcessMemory(hProcess, pRemoteThread, &ThreadProc, dwThreadSize,0);

		ZeroMemory(&my_RPar, sizeof(RPar));
    
		hKernel = LoadLibrary("kernel32.dll");
		my_RPar.dwGetModuleHandle = (DWORD)GetProcAddress(hKernel, "GetModuleHandleA");
		my_RPar.dwGetProcAddress = (DWORD)GetProcAddress(hKernel, "GetProcAddress");
		FreeLibrary(hKernel);
		
		hUser = LoadLibrary("user32.dll");
		my_RPar.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA");
		FreeLibrary(hUser);
		
		strcpy(my_RPar.msgTitle, "Title");
		strcpy(my_RPar.msgText, "Text");
		
		
		pmy_RPar =(RPar *)VirtualAllocEx(hProcess, 0, sizeof(RPar), MEM_COMMIT, PAGE_READWRITE);
    
		WriteProcessMemory(hProcess, pmy_RPar, &my_RPar, sizeof(my_RPar), 0);
		CreateRemoteThread(hProcess, 0, 0, (DWORD (__stdcall *)(void *))pRemoteThread ,pmy_RPar, 0, &dwThreadId);
   
	
		CloseHandle(hProcess);
		
    
    
return 0;
}
frommars вне форума Ответить с цитированием
Старый 19.02.2014, 07:34   #8
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

Цитата:
74 cannot convert `DWORD (*)()' to `void**' for argument `2' to `BOOL InjectIntoProcess(void*, void**)'
ну подумай теперь как правильно функцию вызвать
frommars вне форума Ответить с цитированием
Старый 19.02.2014, 10:11   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от frommars Посмотреть сообщение
Пруф? На
вы на какой винде сидите хоть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2014, 10:44   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от frommars Посмотреть сообщение
Пруф? На
Извините, это не пруф... будьте любезны ссылочку на документацию, где это написано...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отследить инжект dll в процесс ??? fucil Общие вопросы Delphi 5 26.01.2014 07:12
Загрузить библиотеку в внешний процесс - только инжект? calypso Win Api 15 27.02.2013 17:37
AppInit_DLLs и инжект в определенный процесс nls Win Api 2 01.02.2013 09:17
SysListView32 Добавление Item (чужой процесс) custanator Win Api 10 06.04.2011 14:30
как перехватить чужой процесс Assemblerru Win Api 8 28.09.2010 20:07