c++ - 如何在使用 CreateProcess 创建的进程上安装挂钩?
问题描述
这是我尝试过的:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
cout << "Starting Notepad++..." << endl;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
// set the size of the structures
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&processInformation, sizeof(processInformation));
char commandLine[] = "C:\\Program Files\\Notepad++\\Notepad++.exe";
// start the program up
BOOL res = CreateProcess(NULL, // the path
commandLine, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&startupInfo, // Pointer to STARTUPINFO structure
&processInformation // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
);
if (res) {
if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, NULL, processInformation.dwThreadId))) {
cout << "Failed to install mouse hook :" << endl << getLastErrorAsString() << endl;
}
WaitForSingleObject( processInformation.hProcess, INFINITE );
CloseHandle( processInformation.hProcess );
CloseHandle( processInformation.hThread );
} else {
cout << "Failed to start Notepad++" << endl;
}
return 0;
}
它成功启动 Notepad++,但安装钩子失败,GetLastError 返回以下错误:The parameter is incorrect.
. 我不知道哪个参数不正确。但是,当我关闭 Notepad++ 时,程序正常结束。
由于我在主程序中启动进程并且钩子回调也在主程序中,所以我应该能够安装钩子而不进行任何 dll 注入。
我已经很多年没有接触过 c++ 了,而且我从来没有从事过系统开发,所以我的方式可能是错误的,所以你能向我解释一下我的错误在哪里吗?
编辑:
你们都在告诉我,我需要注入一个 dll 来挂钩一个特定的进程,但这是来自SetWindowsHookEx
关于 hMod 参数(第三个参数)的 windows 文档:
包含 lpfn 参数指向的钩子过程的 DLL 句柄。如果 dwThreadId 参数指定由当前进程创建的线程并且挂钩过程在与当前进程关联的代码内,则 hMod 参数必须设置为 NULL。
我的线程是由当前进程创建的,我的钩子程序在我当前进程的代码中,那么为什么当我使用非低级钩子(WH_MOUSE)时它不起作用?
解决方案
在评估输入的目的地之前执行低级挂钩。这就是为什么低级挂钩需要全局的原因,如SetWindowsHookEx的文档中所述。您不能为dwThreadId参数传递非零值。
推荐阅读
- express - 使用 Express 的 GraphQL 安全 Web 套接字
- r - 计算数据框中行的长度
- angular - 将时间转换为 24 小时格式并使用 formControlName 获取值并填充值,角度
- python - 如何逐行合并多个csv文件python
- ruby - 左零数有奇怪的结果
- reactjs - 更改 Chart.js 图例文本
- node.js - 使用 Axios 在 Sequelize 上更新请求 (PUT) 超时
- ssl - Hyperledger Fabric 中出现奇怪的错误消息
- javascript - 有没有办法替换网络通知中的默认浏览器徽标?
- jquery - 仅在桌面视图上使用 Sticky Text JQuery