此代碼在64位應用程序中運行。目標應用程序是32位。CreateToolhelp32Snapshot:INVALID_HANDLE_VALUE(ERROR_PARTIAL_COPY)
每次運行此代碼時,CreateToolhelp32Snapshot()
返回INVALID_HANDLE_VALUE
,然後GetLastError()
返回ERROR_PARTIAL_COPY
。所以它跳過循環並返回false。
BOOL HookInjector::InjectIntoProcess(DWORD pID)
{
//Get Handle to Remote Process
HANDLE Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
....
//Check to see if 64-bit or 32-bit application
IsWow64Process(Proc, &isWow64);
size_t szCurProc = sizeof(void*); //returns 8
if (isWow64)
{
__debugbreak();
//Get list of all Modules associated with the Process
HANDLE hProc32Module;
do {
hProc32Module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32, pID);
}
while ((hProc32Module == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_BAD_LENGTH));
if (hProc32Module == INVALID_HANDLE_VALUE) {
__debugbreak();
DWORD err = GetLastError(); //just to see the error code which is 0x12b
return false;
}
//Find the module for Kernel.dll and get the base address of it
MODULEENTRY32 entryModule;
entryModule.dwSize = sizeof(MODULEENTRY32);
BOOL isGetModuleSuccess = Module32First(hProc32Module, &entryModule);
DWORD errEndofList = GetLastError();
BOOL isSuccessful = false;
while (errEndofList != ERROR_NO_MORE_FILES && isGetModuleSuccess)
{
if (_tcscmp(entryModule.szModule, KERNEL32_DLL)){
isSuccessful = true;
break;
}
isGetModuleSuccess = Module32Next(hProc32Module, &entryModule);
errEndofList = GetLastError();
}
if (!isSuccessful)
{
__debugbreak();
CloseHandle(hProc32Module);
return false;
}
//Get handle for Kernel.dll module
hKernel32 = entryModule.hModule;
CloseHandle(hProc32Module);
}
else
{
....
你知道哪個函數調用產生的錯誤?我們當然不會。你所有的錯誤檢查都是錯誤的,所以你可能不知道。你必須檢查返回值。你沒有。如果返回值指示失敗,並且文檔說上一個錯誤是有效的,則調用'GetLastError'。我強烈建議您修復錯誤檢查,然後再詢問一次。 – 2014-10-20 20:46:41
@DavidHeffernan:Sry,回合。是的,我知道哪個函數會產生錯誤。 hProc32Module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32,pID); hProc32Module在此行之後不應該爲INVALID_HANDLE_VALUE。但是,這意味着發生了錯誤,因爲如果發生錯誤,CreateToolhelp32Snapshot僅返回句柄或INVALID_HANDLE_VALUE。 – Informat 2014-10-20 21:02:29
那麼,在這種情況下,我想你是處於最佳狀態的人。 – 2014-10-20 21:03:12