【发布时间】:2019-01-05 08:38:12
【问题描述】:
我正在尝试获取 notepad.exe 处理的文件信息。
所以,我的程序执行以下步骤。
-
为notepad.exe创建进程
CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); -
等到notepad.exe初始化完成
WaitForInputIdle(pi.hProcess, 10000); -
将 notepad.exe 进程作为调试对象附加到我的程序。
DebugActiveProcess(dwPID) -
等待来自被调试者的调试事件。
-
当我的程序收到
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)
【问题讨论】:
-
你很幸运你的程序没有加载 advapi32.dll。目标很模糊,但是当你编写调试器时,你需要学习如何使用the 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)); ReadProcessMemory(g_cpdi.hProcess, g_pfHookingAdd, &g_chOrgByte, sizeof(BYTE), NULL);] 获得正确的数据
标签: c++ winapi reverse-engineering notepad