发布
社区首页 >问答首页 >设置全局消息钩子注入时,钩子函数失败?

设置全局消息钩子注入时,钩子函数失败?

提问于 2024-12-22 15:41:26
回答 0关注 0查看 12

这段代码时我在腾讯云跟着跟着一位老师写的 但是我的在运行时 钩子设置失败 返回的是NULL,求教各位 !!!!!!!

----------------------------------------------------------------------------------------------------------------------------------

这个是main函数

HMODULE hmod = LoadLibrary(L"D:/程序/dll1/release/sssssssssssss.dll");

if (hmod == NULL)

{

std::cout << "dll加载失败" << std::endl;

return 0;

}

typedef void(*set_hook)(void);

set_hook sethook = (set_hook)GetProcAddress(hmod,"SetHook");

sethook();

while (1)

{

Sleep(1000);

}

typedef bool(*un_sethook)(void);

un_sethook unhook = (un_sethook)GetProcAddress(hmod,"UnHook");

unhook();

FreeLibrary(hmod);

return 0;

----------------------------------------------------------------------------------------------------------------------------------

这是dll

#include "pch.h"

HHOOK global_Hook;

BOOL GetPrentProcess(DWORD pid,LPCTSTR name)// 判断是否是需要注入的进程

{

MODULEENTRY32 me{};

HANDLE hmldulesnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);

if (hmldulesnap != INVALID_HANDLE_VALUE)

{

BOOL bret = Module32First(hmldulesnap,&me);

if (!wcscmp(name, me.szModule))

{

CloseHandle(hmldulesnap);

return true;

}

CloseHandle(hmldulesnap);

return FALSE;

}

CloseHandle(hmldulesnap);

return FALSE;

}

wchar_t* GetMyDllName()

{

wchar_t path[256]{}, dllname[256]{};

GetModuleFileName(NULL,path,256);

int len = wcslen(path);

wchar_t singleChar = L'\\';

for (int i = len; i >= 0; i--)

{

if (path[i] == singleChar)

{

i++;

for (int j = 0;i <= len; j++)

{

dllname[j] =path[i++];

}

break;

}

}

return dllname;

}

LRESULT CALLBACK MyProc(int code, WPARAM wParam, LPARAM lParam)

{

if (code >= 0)

{

switch (lParam)

{

case WM_KEYDOWN:

MessageBox(NULL,L"键盘按下",L"提示",NULL);

break;

}

}

return CallNextHookEx(global_Hook,code,wParam,lParam);

}

extern"C" _declspec(dllexport) void SetHook()

{

global_Hook = SetWindowsHookEx(WH_MSGFILTER,MyProc,GetModuleHandle(GetMyDllName()),0);

}

extern"C" _declspec(dllexport) void UnHook()

{

if (global_Hook != NULL)

{

UnhookWindowsHookEx(global_Hook);

}

}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

{

// 当DLL被加载时触发,判断当前自身父进程是否为 lyshark.exe

BOOL flag = GetPrentProcess(GetCurrentProcessId(),L"被注入的程序.exe");

if (flag == TRUE)

{

MessageBox(0, L"hello lyshark", 0, 0);

}

break;

}

case DLL_THREAD_ATTACH:

{

break;

}

case DLL_THREAD_DETACH:

{

break;

}

case DLL_PROCESS_DETACH:

{

// DLL卸载时自动清理

UnHook();

break;

}

default:

break;

}

return TRUE;

}

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档