Пытаюсь внедрить библиотеку в процесс, но вылетает окно системной ошибки с предложением отправить отчет. Исходник взял с
www.rsdn.ru, немного поправил но несущественно:
BOOL InjectDll (HANDLE hProcess, char* lpszDllName)
{
BYTE* p_code;
INJECTORCODE cmds;
DWORD wr, id;
//зарезервировать память в процессе
p_code = (BYTE*)VirtualAllocEx(hProcess, 0, sizeof(INJECTORCODE), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if(p_code==NULL)
{
MessageBox(NULL, "Unable to alloc memory in remote process", "Error!", 0);
return FALSE;
}
//инициализировать машинный код
cmds.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
cmds.loadlibrary_arg = (DWORD)(p_code + offsetof(INJECTORCODE, libraryname));
cmds.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
cmds.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(INJECTORCODE, addr_loadlibrary));
cmds.instr_push_exitthread_arg = 0x68;
cmds.exitthread_arg = 0;
cmds.instr_call_exitthread = 0x15ff;
cmds.adr_from_call_exitthread = (DWORD)(p_code + offsetof(INJECTORCODE, addr_exitthread));
cmds.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
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 );
//записать машинный код по зарезервированному адресу
WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);
//выполнить машинный код
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (unsigned long (__stdcall *)(void *))p_code, NULL, 0, &id);
//HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (DWORD (__stdcall *)(void*))p_code, NULL, 0, &id);
//ожидать завершения удаленного потока
WaitForSingleObject(hThread, INFINITE);
//освободить память
if (hThread == NULL)
{
return FALSE;
}
VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);
CloseHandle(hThread);
return TRUE;
}
ну а вызывается функция:
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
int main ( int argc, char* argv[] )
{
ZeroMemory(&StartInfo, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);
CreateProcess (NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &StartInfo, &ProcInfo);
Sleep(2000);
InjectDll(ProcInfo.hProcess, "TestDll.dll");
return 0;
}