gpt4 book ai didi

c++ - 简单的 Hook 程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:34 34 4
gpt4 key购买 nike

我正在尝试制作一个简单的 globalhook,只要有人按下键盘上的某个键,它就会将一些文本打印到 .txt 文件中。问题是当我执行我的程序并按下某个程序中的某个键时,该程序卡住了并且不再响应。所以我认为问题在于 hookprocedure 在调用时无法正常工作/返回。

这是我的 .exe 文件中的代码:

#include <Windows.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <wingdi.h>
#include <string>

using namespace std;

typedef bool (*install)();
install instal;
HINSTANCE hinst;

int main()
{
hinst = LoadLibrary(TEXT("injectdll.dll"));
if(!hinst)
{
printf("The DLL could not be found.\n");
}

instal = (install) GetProcAddress(hinst, "install");
if(!instal)
{
printf("The function was not found.\n");
}

if(!instal())
{
printf("func couldn't be executed");
}

printf("Program successfully hooked.\nPress enter to unhook the function and stop the program.\n");
getchar();
}

这是我的dll中的代码:

    #include <windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <Strsafe.h>

using namespace std;

#pragma data_seg(".shared")
HHOOK hook = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")

HINSTANCE hinst;

LRESULT CALLBACK meconnect(int code, WPARAM wParam, LPARAM lParam)
{
if (code < 0)
{
return CallNextHookEx(hook, code, wParam, lParam);
}
FILE *file;
fopen_s(&file, "function.txt", "a+");
fprintf(file, "Function keyboard_hook called.\n");
fclose(file);

return 0;
}

extern "C" __declspec(dllexport) bool install()
{
hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) meconnect, hinst, 0);
return hook != NULL;
}

BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD Reason, LPVOID Reserved) {

switch(Reason) {
case DLL_PROCESS_ATTACH:
hinst = hDLL;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

meconnect函数返回0,不知道这样对不对,我也试过返回:返回 CallNextHookEx(钩子(Hook),代码,wParam,lParam);和返回 CallNextHookEx(0, code, wParam, lParam);

两者都没有改变任何结果。

最佳答案

install 函数在主 exe 的上下文中运行。让它在成功时返回 HHOOK 句柄。您需要该句柄来调用 UnhookWindowsHookEx终止 exe 时运行。

或者,您可以将 HHOOK 存储在 DLL 中的常规全局变量中,并实现导出的 uninstall 函数,该函数将调用 UnhookWindowsHookEx.

总之,把分享的部分删掉,这没有任何用处,只会带来问题。

请注意 CallNextHookEx documentation包含:

Parameters
hhk [in, optional]
Type: HHOOK
This parameter is ignored.

调用CallNextHookEx时将NULL作为参数1传递

始终在 Hook 过程中返回 CallNextHookEx 的返回值。

做:

LRESULT CALLBACK meconnect(int code, WPARAM wParam, LPARAM lParam) {
if (code >= 0) {
FILE *file = 0;
fopen_s(&file, "function.txt", "a+");
if ( file ) {
fprintf(file, "Function keyboard_hook called.\n");
fclose(file);
}
}
return CallNextHookEx( NULL, code, wParam, lParam);
}

DLL 在有键盘事件的进程中加载​​。然后在其“当前目录”中打开文本文件。由于访问权限的原因,它可能会失败,并且您不希望文本文件散布到任何地方:为您的文本文件使用有效的完整路径。

最后,最重要的部分,如果调用 SetWindowsHookEx 的线程没有轮询消息队列,事情就会变得很奇怪(如您所见)。做正确事情的更简单方法就是调用 MessageBox。

将您的 getchar 调用替换为:

MessageBox(NULL, "Ok to leave", "Hooking Keyboard", MB_OK);

您的 DLL 将仅在具有相同位数(32b 或 64b)的进程中加载​​。如果您的 DLL 是 32 位的,则在 32 位 EXE 的上下文中调用您的 Hook 程序会报告 64 位进程中的键盘事件。这就是您必须提供轮询消息队列的原因(它使回调调用成为可能)。

已编辑:WH_KEYBOARD 允许全局和多位 Hook 。

关于c++ - 简单的 Hook 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961622/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com