GetModuleHandle()无法检索由“ notepad.exe”加载的“ advapi32.dll”的句柄

时间:2018-07-28 12:01:36

标签: c++ winapi reverse-engineering notepad

我试图获取由notepad.exe处理的文件信息。

因此,我的程序执行以下步骤。

  1. 为notepad.exe创建进程

    CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

  2. 等待直到完成notepad.exe的初始化

    WaitForInputIdle(pi.hProcess, 10000);

  3. 以Debugee身份将notepad.exe进程附加到我的程序中。

    DebugActiveProcess(dwPID)

  4. 等待来自Debugee的调试事件。

  5. 我的程序收到CREATE_PROCESS_DEBUG_EVENT时,需要做我所需的事情。

这是我的功能有问题。

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)

1 个答案:

答案 0 :(得分:1)

那是行不通的,因为GetModuleHandle() ...

  

检索指定模块的模块句柄。该模块必须   已被调用进程加载。

回答GetModuleHandle(), for a DLL in another process可能会对您有所帮助。