1 新建一个mfc extension dll 这个我想用VC的人都会做的事情吧–!名字叫做mydll
2 点击 文件—新建 选择文件 建立一个Header File文件 我们就暂定他的名字叫做Hook吧
3 在刚才建立的Hook.h的文件中加入复制以下的函数进去
extern “C” LRESULT CALLBACK keybordproc(int code,WPARAM wparam,LPARAM lparam); //钩子处理函数
extern “C” bool WINAPI starthook(DWORD threadID); //启动钩子
extern “C” bool WINAPI stophook();//停止钩子
4 在mydll.CPP的#include “stdafx.h”下面添加
#include “Hook.h”
#pragma data_seg(“publicdata”)
HHOOK hhook=NULL;
HINSTANCE pinstance=NULL;
#pragma data_seg()
5 找到DllMain…….在里面初始化
pinstance = hInstance;
6 同时 在mydll.CPP中找到空白的地方 复制下面的代码进去
extern “C” bool WINAPI starthook(DWORD threadID)//打开钩子函数
{
hhook=SetWindowsHookEx(WH_GETMESSAGE,keybordproc,pinstance,threadID);
if(hhook!=NULL)
return true;
else
return false;
}
extern “C” bool WINAPI stophook() //关闭钩子函数
{
UnhookWindowsHookEx(hhook);
if(hhook==NULL)
return true;
else
return false;
}
7 同样复制下面的代码进去 注意 下面的AfxMessageBox(“hhhhh”);就可以代替你所写的汇编就比如
DWORD addr = 0x0056FC80;
__asm
{
pushad
call addr
popad
}
前面的If语句就是指按下H键会发生后面的事件 我这里就是弹出一个对话框而已
extern “C” LRESULT CALLBACK keybordproc(int code,WPARAM wparam,LPARAM lparam)
{
if (code == HC_ACTION)
{
MSG *msg = (MSG *)lparam;
if (msg->message == WM_CHAR)
{
if (msg->wParam == ‘h’) AfxMessageBox(“hhhhh”);//如果收到键盘消息 为按键h 则弹出对话框
}
}
return CallNextHookEx(hhook,code,wparam,lparam);
}
8 在mydll.def文件中的EXPORTS下加入
starthook @1
stophook @2
开始编译 在Debug 里面会看到一个mydll.dll和mydll.lib
9 工程–增加到工程–新建 建立一个纯Dialog EXE 编译一下… 然后把上面Debug里面的mydll.dll和mydll.lib复制到新建的EXE
文件夹和EXE的Debug里 然后工程–设置 找到 连接 在对象/库模块 里添加mydll.lib
10 为自己的Dialog增加两个按钮 用来测试是否注入成功 里面的函数如下
void CWULINtestDlg::OnButton1()
{
HWND mhwnd = ::FindWindow(NULL,“春秋Q传Online(版本0.6.17)”);
if(mhwnd==0){
AfxMessageBox(“error”);
}
else{
DWORD threadid = GetWindowThreadProcessId(mhwnd,NULL);
starthook(threadid);//打开钩子
}
}
void CWULINtestDlg::OnButton2()
{
HWND hwnd=::FindWindow(NULL,“春秋Q传Online(版本0.6.17)”);
if(hwnd==0)
AfxMessageBox(“error”);
else{
::PostMessage(hwnd,WM_KEYDOWN,72,0);//72是h的键值
}
}
11 先按下注入的按键 然后按下令一个 看看是不是弹出了一个对话框 同时 你也可以把 dll里的函数 改成你想要得CALL 从而达到我们注入的目的