(一)外挂一般都能在游戏的界面中按一个热键(比如F12,HOME等),就可以呼出外挂的窗口,然后在里面进行外挂的功能设置,这个外挂的窗口是怎么弄出来的呢?
要想在游戏里显示出窗口,那么我们要显示的这个窗口就要和游戏本身“混”在一起,也就是说我们的外挂窗口要“混入”游戏的内部,让游戏不排斥外挂窗口,把外挂窗口当做“自己人”,这样我们的外挂才能去“影响”游戏本身的运行。行话把这个叫“注入”。
那怎么“注入”呢? Windows操作系统有个API函数SetWindowsHookEx,该函数的可以在系统上安装一个“钩子(HOOK)”。也就是把我们自己编写的一个回调函数设置为系统“钩子”。“钩子(HOOK)”有什么用呢?系统发送给各种程序窗口的消息,都要先经过“钩子”先处理之后再送到它本来要去的窗口。而在“钩子”处理来的消息的时候,Windows操作系统就已经自动把“钩子”“钩”在了消息即将到达的目的程序窗口上了,此时“钩子”就已经“混入”了目的窗口的内部了
========================================== 以下shaker注明: 这个教程存在一个漏洞,以使一些对DLL编程不是很了解的人不能顺利的完成编译。 BUG如下:原文中的S3DHOOK.DEF文件中的内容如下 ; S3DHook.def : Declares the module parameters for the DLL.
LIBRARY "S3DHook" DESCRIPTION "S3DHook Windows Dynamic Link Library"
EXPORTS ; Explicit exports can go here 使得生成的DLL没有任何输出函数,在编译EXE工程出现错误,要解决这个问题只要改变原来的S3DHook.def文件的内容如下: ; S3DHook.def : Declares the module parameters for the DLL.
LIBRARY "S3DHook" DESCRIPTION "S3DHook Windows Dynamic Link Library"
EXPORTS ; Explicit exports can go here InstallHook UninstallHook 如此,问题便得到解决! 把有关外挂功能的代码和“钩子”函数一起放到同一个DLL中,那么我们的外挂也就一同被注入到游戏里面去了 在“我的文档”中建立一个文件夹名字叫“神迹外挂”然后打带VC6,建立新工程
创建MFC(dll),选择 Regular DLL using shared mfc DLL
在S3DHook.h头文件中加入
#ifndef S3DHOOKAPI #define S3DHOOKAPI extern "C" __declspec(dllimport) #endif
在S3DHook.cpp中
#include "S3DHook.h" 这一句之前加入 #define S3DHOOKAPI extern "C" __declspec(dllexport)
也就是这个样子成了这个 #define S3DHOOKAPI extern "C" __declspec(dllexport) #include "S3DHook.h"
在S3DHook.cpp中加入全局共享数据
#pragma comment(linker,"section:Shared,rws") #pragma data_seg("Shared") HHOOK g_hhook; #pragma data_seg() 在S3DHook.cpp加入钩子回调函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { BOOL bKeyUp = lParam & (1 << 31); if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION) { AfxMessageBox("ok"); } return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam); } 在文件前面加入函数的原形以便后面引用 LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
在S3DHook.H里加入“导出(export)”的钩子安装卸载函数原形
S3DHOOKAPI BOOL WINAPI InstallHook(); S3DHOOKAPI BOOL WINAPI UninstallHook();
在S3DHook.CPP里加入钩子安装卸载函数的实现
S3DHOOKAPI BOOL WINAPI InstallHook() { if (g_hhook == NULL) { g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, 0); if (g_hhook != NULL) return TRUE; } return FALSE; }
S3DHOOKAPI BOOL WINAPI UninstallHook() { return ::UnhookWindowsHookEx(g_hhook); }
好了,现在我们建立的这个DLL具有基本的键盘钩子的功能,编译生成S3DHook.dll 下面建立一个EXE来调用这个DLL
这个是对话框型的工程
在MainDlg.cpp中加入对DLL的调用
插入头文件包含 #include "../s3dhook/s3dhook.h"
更改工程设置
Project->settings->link->Object/library modules: 输入../s3dhook/debug/s3dhook.lib
在对话框的OnInitDialog中加入InstallHook();安装键盘钩子 在OnClose中加入UninstallHook();关闭程序时卸载键盘钩子 编译这个对话框EXE
把这两个工程生成的S3DHook.dll和Main.exe放到同一个文件夹中,运行
在游戏窗口中按F12,会出现一个消息框,游戏会暂时定住 注意消息框的标题是游戏程序的名字 这说明这个消息框是在游戏内部显示出来的

|