这段代码时我在腾讯云跟着跟着一位老师写的 但是我的在运行时 钩子设置失败 返回的是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;
}