- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码在 64 位应用程序中运行。目标应用程序是 32 位的。
每次运行此代码时,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
{
....
最佳答案
根据documentation , CreateToolhelp32Snapshot()
仅当 CreateToolhelp32Snapshot()
被试图访问 64 位进程的 32 位进程调用时失败并返回 ERROR_PARTIAL_COPY
:
If the specified process is a 64-bit process and the caller is a 32-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).
确保您的应用确实是为 64 位编译的。 TH32CS_SNAPMODULE32
只有在 64 位进程中调用 CreateToolhelp32Snapshot()
时才有意义:
TH32CS_SNAPMODULE32
0x00000010
Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process.
您也没有考虑到 GetLastError()
仅在 API 函数失败时更新,除非另有说明。您的循环假设 GetLastError()
在每次 API 调用后都会更新,这是不正确的。
尝试更像这样的东西:
BOOL HookInjector::InjectIntoProcess(DWORD pID)
{
//Get Handle to Remote Process
HANDLE Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
....
DWORD dwFlag;
#ifdef _WIN64
//Check if Remote Process is a 32-bit application
BOOL isWow64 = FALSE;
IsWow64Process(Proc, &isWow64);
if (!isWow64) return false;
// TH32CS_SNAPMODULE32 includes 32bit modules when used by a 64bit process...
dwFlag = TH32CS_SNAPMODULE32;
#else
// TH32CS_SNAPMODULE includes 32bit modules when used by a 32bit process...
dwFlag = TH32CS_SNAPMODULE;
#endif
__debugbreak();
//Get list of all Modules associated with the Process
HANDLE hProc32Module;
do {
hProc32Module = CreateToolhelp32Snapshot(dwFlag, pID);
}
while ((hProc32Module == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_BAD_LENGTH));
if (hProc32Module == INVALID_HANDLE_VALUE) {
__debugbreak();
return false;
}
//Find the module for Kernel.dll and get the base address of it
hKernel32 = NULL;
MODULEENTRY32 entryModule = {0};
entryModule.dwSize = sizeof(MODULEENTRY32);
BOOL isGetModuleSuccess = Module32First(hProc32Module, &entryModule);
while (isGetModuleSuccess) {
if (_tcscmp(entryModule.szModule, KERNEL32_DLL)) {
hKernel32 = entryModule.hModule;
break;
}
isGetModuleSuccess = Module32Next(hProc32Module, &entryModule);
}
if (!hKernel32) {
__debugbreak();
CloseHandle(hProc32Module);
return false;
}
CloseHandle(hProc32Module);
....
}
关于c++ - CreateToolhelp32Snapshot : INVALID_HANDLE_VALUE (ERROR_PARTIAL_COPY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474349/
此代码在 64 位应用程序中运行。目标应用程序是 32 位的。 每次运行此代码时,CreateToolhelp32Snapshot() 都会返回 INVALID_HANDLE_VALUE,然后 Get
我正在尝试写入另一个进程的内存,我以 38h(VM_OPERATION、VM_READ、VM_WRITE)权限打开它,然后我以 4h(PAGE_READWRITE)权限使用 VirtualProtec
我正在调用函数 EnumProcessModulesEx 但它失败了。我在 64 位机器上运行。这是下面的代码: wchar_t* dest = new wchar_t[100]; int index
我知道还有其他人问过这个问题,但似乎没有人得出令人满意或可以理解的结论。我无法使用未回答的内容。我不太确定问题出在哪里,我尝试了各种不同的解决方案但都没有成功,所以这是我的代码: #include
我是一名优秀的程序员,十分优秀!