GetModuleHandle() cannot retrieve handle of “advapi32.dll” loaded by “notepad.exe”
我正在尝试获取notepad.exe处理的文件信息。
因此,我的程序执行以下步骤。
为notepad.exe创建过程
CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
等待直到完成notepad.exe的初始化
WaitForInputIdle(pi.hProcess, 10000);
以Debugee身份将notepad.exe进程附加到我的程序中。
DebugActiveProcess(dwPID)
等待Debugee的调试事件。
当程序接收到CREATE_PROCESS_DEBUG_EVENT时,请执行我需要的操作。
这是我的功能出现问题。
1 2 3 4 5 6 7 8 9 10 11
| LPVOID g_pfHookingAdd = NULL;
BOOL OnCreateProcessDebugEvent(LPDEBUG_EVENT pde)
{
DWORD dwLastErr;
if (NULL == GetModuleHandleA("advapi32.dll")) // Not able to get a handle here.
{
dwLastErr = GetLastError(); // dwLastErr => 126 => (0x7E)
}
g_pfHookingAdd = GetProcAddress(GetModuleHandleA("advapi32.dll"),"IsTextUnicode");
return TRUE;
} |
如您所见,我的目标是检索加载IsTextUnicode()函数的地址。
但是,当我调用GetModuleHandleA("advapi32.dll")时,出现错误代码126,这是
ERROR_MOD_NOT_FOUND。
我还检查了notepad.exe执行期间是否已加载advapi32.dll。
谁能告诉我为什么这不起作用?
这是我的环境条件:
Windows 10专业版1803(操作系统内部版本17134.165)
- 您很幸运,您的程序未加载advapi32.dll。目标是模糊的,但是当您编写调试器时,您需要学习如何使用DbgHelp api。
-
如果您有LOAD_DLL_DEBUG_EVENT,则需要什么GetModuleHandle?而对于您所说的DebugActiveProcess,只需创建带有标志DEBUG_ONLY_THIS_PROCESS的进程?
-
我试图获取加载函数的第一个字节数据。实际上,这是我要解决的另一个问题,当我创建带有标志DEBUG_ONLY_THIS_PROCESS或DEBUG_PROCESS的进程时,我无法从[memcpy(&g_cpdi, &pde->u.CreateProcessInfo, sizeof(CREATE_PROCESS_DEBUG_INFO)); \tReadProcessMemory(g_cpdi.hProcess, g_pfHookingAdd, &g_chOrgByte, sizeof(BYTE), NULL);]获取正确的数据
那是行不通的,因为GetModuleHandle()...
Retrieves a module handle for the specified module. The module must
have been loaded by the calling process.
获取GetModuleHandle()的答案,因为在另一个进程中使用DLL可能会对您有所帮助。
- 感谢您的快速回答。那么,您是说advapi32.dll不是由notepad.exe直接加载的吗?
-
@Lance请再次阅读我的答案。 GetoduleHanle()失败,因为advapi32.dll由notepad.exe加载,而不是由正在执行GetModuleHandle()的程序加载。
-
OMG我对GetModuleHandle完全误解了。非常感谢。
-
诊断很好,但实际上使该问题与您发现的问题重复。
-
@BenVoigt好吧,我想回答这个问题不会造成任何伤害,尽管它是重复的。
-
好吧,实际上我们认为链接到重复项更好