【发布时间】:2020-10-23 01:49:39
【问题描述】:
我是韩国学生。 这是我注册后的第一个问题。
DWORD getProcessId() {
PROCESSENTRY32 process_infor;
process_infor.dwSize = sizeof(PROCESSENTRY32);
HANDLE snap_handle = CreateToolhelp32Snapshot(
TH32CS_SNAPALL, //스냅 단계
NULL //스냅할 pid
);
if (snap_handle != INVALID_HANDLE_VALUE) {
Process32First(snap_handle, &process_infor);
do {
wchar_t* temp = process_infor.szExeFile;
wstring ws(temp);
string name(ws.begin(), ws.end());
if (name == "notepad.exe") {
cout << name << " : " << process_infor.th32ProcessID << endl;
return process_infor.th32ProcessID;
}
} while (Process32Next(snap_handle, &process_infor));
}
CloseHandle(snap_handle);
return FALSE;
}
BOOL inject() {
HMODULE dll_handle;
HOOKPROC func;
HHOOK process_hook;
dll_handle = LoadLibrary(L"hello.dll");
func = (HOOKPROC) GetProcAddress(dll_handle, "injectSuccess");
cout << "handle : " << dll_handle << endl;
cout << "pid : " << getProcessId() << endl;
process_hook = SetWindowsHookEx(
WH_KEYBOARD,
func,
dll_handle,
getProcessId()
);
cout << "pook : " << process_hook << endl;
cout << "err : " << GetLastError() << endl;
FreeLibrary(dll_handle);
return FALSE;
}
在这种情况下,注入函数的SetWindowsHookEx 似乎有问题。 dll文件加载不错,里面的injectSuccess函数也很好获取。 (我尝试运行它,但它有效)
并且想知道是不是SetWindowsHookEx的参数值输入有误,于是对比,不断的检查,也没有发现有什么不同。于是,我用下面SetWindowsHookEx的返回值尝试了GetLastError(),但返回值为0,错误码为87(“参数不正确”)。
所以我搜索了,但我英语说得不好,而且我是初学者,所以我不确定。
【问题讨论】:
-
欢迎来到 Stack Overflow;我建议检查
GetProcAddress的结果以确保您确实找到了该函数:如果它为NULL 怎么办?此外,建议您在调用SetWindowHookEx之后立即 捕获最后一个错误号,因为后续调用(可能执行I/O)可能会覆盖最后一个错误并混淆报告。在设置窗口挂钩后立即执行const DWORD err = GetLastError()会捕获这一点。 -
您为
getProcessId发布的代码没有使用进程名称(“notepad.exe”),但我认为这是粘贴示例时的拼写错误。我建议您检查您是否实际上找到了一个有效的线程 ID 并检查它:只有在收到非零响应时才调用SetWindowsHookEx。 -
哦,我认为“notepad.exe”是 getProcessId 中的拼写错误。用真实的代码写得很好。
-
请编辑您的示例代码以便编译;很明显,
getProcessId期望得到一个字符串参数 (process_name)。然后我们可以更仔细地观察它。 -
对不起;;它被改变了。 GetProcAddress 函数似乎工作正常。当我像这样手动运行thread_func()函数时,消息框正常出现在窗口中。