gpt4 book ai didi

winapi - EnumProcessModules 返回 0 错误 299

转载 作者:行者123 更新时间:2023-12-03 11:39:58 25 4
gpt4 key购买 nike

我目前正在尝试枚举我之前从我的 32 位程序创建的 supsended 32 位进程的所有模块,我的 Windows 是 64 位的。
(我已经阅读了有关该问题的所有其他主题)。

这是代码:

let a = CreateProcessA(
"C:\\Program Files (x86)\\GlassWire\\GlassWire.exe\0".as_ptr(),
null_mut(), null_mut(), null_mut(),
false,
0x00000004,
null_mut(), null_mut(), SI, PI);
println!("{}", GetLastError());

let mut buffer: [*mut c_void;10] = [0 as *mut c_void;10];
WaitForInputIdle((*PI).hProcess as *mut c_void, -1);
let result = EnumProcessModules(
(*PI).hProcess as *mut c_void,
buffer.as_ptr() as *mut c_void,
10, null_mut());

println!("EnumProcessModules([...]) = {} - {}", result, GetLastError());

let mut index: usize = 0x0;
let mut modname: [u8;1024] = [0;1024];
while(transmute::<*mut c_void, u32>(buffer[index]) != 0x0){
GetModuleFileNameExA((*PI).hProcess as *mut c_void, buffer[index], modname.as_ptr() as *mut c_void, 1024);
println!("module: {}", std::str::from_utf8_unchecked(&modname));
modname = [0;1024];
index += 1;
}
println!("Dump: {:?}", buffer.to_vec());

我看到我必须使用 WaitForInputIdle()在枚举模块之前使用 CreateProcessA 之后,因为进程没有时间“初始化”,当我这样做时,无论我创建什么进程(它成功创建它)程序都会永远等待。

当我尝试通过将所有 (*PI).hProcess 替换为 GetCurrentProcess() 来对主进程执行相同操作时(我删除了 WintForInputIdle() 行), EnumProcessModules()仍然返回 0 但现在 GetLastError()返回 998 (ERROR_NOACCESS), 但是 模块句柄已成功写入 buffer .

所以程序输出:
A:\Encrypted\Temp\injector\target\i686-pc-windows-msvc\debug\main.exe // (the program)
C:\WINDOWS\SYSTEM32\ntdll.dll

Dump: [0x920000, 0x77180000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]

如果我在 CreateProcessA() 中指定正在运行的程序的路径,它也会返回 0 和 299 作为 windows 错误代码。

我真的很困惑......感谢阅读,我希望我已经足够清楚了。

最佳答案

首先,使用 CREATE_NEW_CONSOLECREATE_NO_WINDOW而不是 CREATE_SUSPENDED(0x00000004) ,作为@Jonathan Potter,暂停状态将阻止函数WaitForInputIdle .

其次,确保该进程不是控制台应用程序或有消息队列,否则WaitForInputIdle立即返回。

然后,您可以尝试调用SuspendThreadWaitForInputIdle 之后暂停进程以防止其结束。

编辑:

注意 EnumProcessModules 的最后两个参数:
cb

The size of the lphModule array, in bytes.


lpcbNeeded

The number of bytes required to store all module handles in the lphModule array.



这是 msdn 上的一个很好的示例: Enumerating All Modules For a Process .只需更换 hProcess .

关于winapi - EnumProcessModules 返回 0 错误 299,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com