我要求在Windows中的32位WOW进程中检索64位进程的所有模块,EnumProcessModules将失败,如下所述:
如果从WOW64上运行的32位应用程序调用此函数,则它只能枚举32位进程的模块.如果进程是64位进程,则此函数失败,最后一个错误代码为ERROR_PARTIAL_COPY(299).
以便EnumProcessModulesEx和CreateToolhelp32Snapshot.
你对如何实现它有任何想法吗?
谢谢.
下面的代码非常适合从32位应用程序获取32位进程的命令行字符串,从64位应用程序获取64位进程,从64位应用程序获取32位进程.如果我尝试从32位应用程序使用64位进程,这将会中断.原因是PROCESS_BASIC_INFORMATION和地址大小的结构大小差异.所以这是我的问题 -
1)在进程黑客(http://processhacker.sourceforge.net/forums/viewtopic.php?f=15&t=181)中使用wow64函数的建议似乎不起作用并且失败并出现以下错误 -
从A68291A0004028E0读取ProcessParameters地址时出现NtWow64ReadVirtualMemory64错误:8000000D
有没有人试过这个并且可以成功获取信息?我在他们的论坛上发布了同样的问题.
2)是否有其他方法可以查询可以可靠地用于x86和x64的peb信息?
int get_cmdline_from_pid( DWORD dwPid, char** cmdLine )
{
DWORD dw, read;
HANDLE hProcess;
NtQueryInformationProcess* pNtQip;
PROCESS_BASIC_INFORMATION pbInfo;
UNICODE_STRING cmdline;
WCHAR* wcmdLine;
*cmdLine = NULL;
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid );
if( !hProcess )
return FALSE;
pNtQip = (NtQueryInformationProcess*) GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQueryInformationProcess");
if(!pNtQip)
return FALSE;
pNtQip(hProcess, PROCESSBASICINFOMATION, &pbInfo, sizeof(pbInfo), NULL);
#ifdef _WIN64
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x20, &dw, sizeof(dw),
&read);
#else
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x10, &dw, sizeof(dw),
&read);
#endif
#ifdef _WIN64 …Run Code Online (Sandbox Code Playgroud) 我有一个小的32位进程我在win7 x64上调试,我看到它按预期加载"C:\ windows\sysWow64 \ntdll.dll",但也"C:\ windows\system32 \ntdll.dll".
我知道x64模块和x86模块不混合,但在这里它们......混合......
它怎么样?