15,471
社区成员
发帖
与我相关
我的任务
分享
HHOOK hook;
LRESULT CALLBACK KeyProc(int Code,WPARAM wparam,LPARAM lparam)
{
if (wparam==VK_F4)
{
CTestDialog dlg;
dlg.DoModal();
dlg.ShowWindow(TRUE);
return 0;
}
return CallNextHookEx(hook,Code,wparam,lparam);
}
void StartHook()
{
HWND hCal=::FindWindow(NULL,L"计算器");
if (hCal==0)
{
AfxMessageBox(L"请先打开计算器");
return;
}
DWORD hThread=::GetWindowThreadProcessId(hCal,NULL);
hook=::SetWindowsHookEx(WH_KEYBOARD,KeyProc,::GetModuleHandle(_T("Hook.dll")),hThread);
if (hook==NULL)
{
AfxMessageBox(L"没有得到hook");
return;
}
}
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
HHOOK hook;
LRESULT CALLBACK KeyProc(int Code,WPARAM wparam,LPARAM lparam)
{
if (wparam==VK_F4)
{
/*CTestDialog dlg;
dlg.DoModal();
dlg.ShowWindow(TRUE);*/
::MessageBox(0, L"F4", 0, 0);
return 0;
}
return CallNextHookEx(hook,Code,wparam,lparam);
}
void _stdcall StartHook()
{
HWND hCal=::FindWindow(NULL,L"计算器");
if (hCal==0)
{
::MessageBox(0, L"请先打开计算器", 0, 0);
return;
}
DWORD hThread=::GetWindowThreadProcessId(hCal,NULL);
hook=::SetWindowsHookEx(WH_KEYBOARD,KeyProc,::GetModuleHandle(_T("Hook.dll")),hThread);
if (hook==NULL)
{
::MessageBox(0, L"没有得到hook", 0, 0);
return;
}
}
EXE
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hDll = LoadLibrary(TEXT("hook.dll"));
FARPROC StartHook = GetProcAddress(hDll,"StartHook");
StartHook();
return 0;
}
以上代码完全是没问题的.
DLL注入可以用CreateRemoteThread远程线程方式注入,
也可以用SetWindowsHookEx消息钩子注入HMODULE hMod=::LoadLibrary("Hook.dll");
FARPROC StartHook =(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook");
StartHook();