Реферат: Перехват API-функций в Windows NT2000XP
cmds.addr_exitthread =
(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread");
if(strlen(lpszDllName)>99)
{
MessageBox(NULL, "Dll Name too long", "Error!", 0);
return FALSE;
}
strcpy((char*)cmds.libraryname, lpszDllName );
/*После инициализации cmds в мнемонике ассемблера выглядит следующим
образом:
push adr_library_name ;аргументф-ции loadlibrary
call dword ptr [loadlibrary_adr] ; вызвать LoadLibrary
push exit_thread_arg ;аргументдля ExitThread
call dword ptr [exit_thread_adr] ;вызвать ExitThread
*/
//записать машинный код по зарезервированному адресу
WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);
//выполнитьмашинныйкод
HANDLE z = CreateRemoteThread(hProcess, NULL, 0,
(unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);
//ожидать завершения удаленного потока
WaitForSingleObject(z, INFINITE);
//освободить память
VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);
return TRUE;
}
Внедрение 2
Второй способ внедрения исполняемого кода (через хуки) наиболее прост в использовании. Он основан на технологии хуков, а именно: если установить хук на поток чужого процесса, то, как только поток получит сообщение, соответствующее заданному типу хука, система автоматически подключит DLL c хуком к данному процессу. Недостатком данного способа в том, что нельзя внедрить DLL в процесс, не имеющий очереди сообщений. Данная DLL будет присоединена к чужому процессу лишь до тех пор, пока запущена программа, установившая хук. Как только вы завершите эту программу, dll автоматически будет отключена. Первый способ лишен таких недостатков.
С другой стороны, первый способ будет работать лишь в WinNT, по причине использования функции VirtualAllocEx, которая резервирует память в заданном (отличном от того, в котором происходит вызов этой функции) процессе. Теоретически, данную проблему можно обойти, если писать код в некоторую часть отображения exe-файла чужого процесса, например в заголовок DOS, который после загрузки не используется. Но ОС не всегда позволяет писать в эту область памяти, даже если попытаться изменить разрешения при помощи VirtualProtextEx.