Итак, я вставляю код в память другого процесса вроде этого:
void RemoteInj::ExecuteFunction(DWORD Start, DWORD End, DWORD Entry, RemoteArgs* Args)
{
unsigned long Id;
int size = End - Start;
cout << size << endl;
void* Func = VirtualAllocEx(hProcess, NULL, size+10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
void* ep = (void*)(Entry-Start+(DWORD)(Func));
WriteProcessMemory(hProcess, Func, (void*)Start, size, NULL);
void* Data = VirtualAllocEx(hProcess, NULL, sizeof(RemoteArgs)+1, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, Data, (void*)Args, sizeof(RemoteArgs), NULL);
cout << hex << Func << endl;
cout << "Function: 0x" << hex << Start << endl << "End: 0x" << hex << End << endl;
system("PAUSE");
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)ep, Data, NULL, NULL);
CloseHandle(hProcess);
}
Моя проблема: если я использую вызовы в этом потоке, например:
void F(RemoteArgs* arg)
{
while (true)
{
arg->pSleep(50); //Works
Sleep(50); //doesnt work
}
return;
}
Не нужно объяснять, почему это не работает, я знаю, это другой процесс... Мой вопрос: есть ли способ сделать такую функцию (Sleep()), я мог бы попробовать импортировать в этот процесс и IAT на правильном расстоянии, у вас есть идея лучше? Спасибо!
Как вы подозреваете, причина, по которой это не работает сразу с места в карьер, заключается в том, что вызов Sleep в вашем процессе фактически переходит в местоположение в вашей таблице адресов импорта (IAT), которая имеет переход к реальной реализации сна в kernel32.dll, Несмотря на то, что другой процесс также импортирует файл kernel32.dll (все процессы выполняются), он, очевидно, не имеет идентичного IAT.
Есть способы, но ничто из того, что я знаю, тривиально.