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(hwnd==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 从而达到我们注入的目的
------By LeeHowNash
2007.9.19
感谢crruirui所写的http://www.ghoffice.com/bbs/htm_data/74/0704/35033.html注入方法 这里我所用的是WH_GETMESSAGE来通讯的调用DLL里面的函数