[英]CreateRemoteThread fails on Windows7 64bit for 32bit applications
我有一個將dll注入進程的代碼。 執行注入功能的進程始終與注入進程具有相同的體系結構(x86或x64)。 但是由於某些原因,當注入和注入的進程是x86體系結構時,CreateRemoteThread函數調用在Win7 64位OS上失敗。 令人驚訝的是,當操作系統為Win10 64bit時。 32位進程工作正常。 該代碼還適用於64位Win7 64位進程和32位Win7 32位進程。
我已經查看了互聯網上的一個可能原因,而我發現的唯一原因是,在Win7中,過程會話有時會出現問題。 我認為情況並非如此,因為注入和注入過程都是“用戶”會話。
運行GetLastError()時,我得到5(ERROR_ACCESS_DENIED)
這是我的注入功能:
DWORD Inject(DWORD PID, const char *dllname)
{
HANDLE hThread = NULL;
BOOL writeSucceed = false;
int cch = 0;
cout << "Injector.dll : Injecting " << dllname << " to " << PID << endl;
DWORD hLibModule;
HMODULE hKernel32 = GetModuleHandle (TEXT ("Kernel32"));
void *hProcess = OpenProcess (PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |
PROCESS_VM_WRITE, false, PID);
cch = strlen (dllname) + 1;
void *pLibRemote = VirtualAllocEx (hProcess, NULL, cch, MEM_COMMIT,
PAGE_READWRITE);
writeSucceed = WriteProcessMemory (hProcess, pLibRemote, (void *) dllname, cch, NULL);
hThread = CreateRemoteThread (hProcess, NULL, 0,
(PTHREAD_START_ROUTINE)
GetProcAddress (hKernel32,
"LoadLibraryA"),
pLibRemote, 0, NULL);
WaitForSingleObject (hThread, INFINITE);
GetExitCodeThread( hThread, &hLibModule );
CloseHandle (hThread);
VirtualFreeEx (hProcess, pLibRemote, sizeof (dllname), MEM_RELEASE);
hThread = CreateRemoteThread (hProcess, NULL, 0,
(PTHREAD_START_ROUTINE) GetProcAddress (hKernel32,
"FreeLibrary"),
(void *) hLibModule, 0, NULL);
WaitForSingleObject (hThread, INFINITE);
CloseHandle (hThread);
return 0;
}
Is there some special treatment I should do in code for Windows 7?
問題是我必須將PROCESS_QUERY_INFORMATION
添加到OpenProcess
標志中。 這非常棘手,因為如果不包括該標志,它將在除Win7 64位OS和32位應用程序外的任何地方都可以使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.