菜鸟的VC6神迹外挂的DIY之路(一)

来源:互联网 发布:遥感数据的光谱分辨率 编辑:程序博客网 时间:2024/05/03 08:25

本人业余爱好编程,从事的工作与软件开发无关,空闲的时候也玩玩网络游戏,目前玩的是神迹,现在网络游戏外挂到处都是,外挂这个东西真神奇,怎么做的呢?于是,Visual C++ 6.0+MSDN2001+搜索引擎找资料,开始了自己的VC6神迹外挂的DIY之路。有什么不对的地方欢迎广大高手指正,望不吝赐教!


(一)外挂一般都能在游戏的界面中按一个热键(比如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,建立新工程

点OK,选择
Regular DLL using shared mfc DLL

在S3DHook.h头文件中加入


#ifndef S3DHOOKAPI
#define S3DHOOKAPI extern "C" __declspec(dllimport)
#endif

在S3DHook.cpp中


#i nclude "S3DHook.h"
这一句之前加入
#define S3DHOOKAPI extern "C" __declspec(dllexport)

也就是这个样子成了这个
#define S3DHOOKAPI extern "C" __declspec(dllexport)
#i nclude "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的调用

插入头文件包含
#i nclude "../s3dhook/s3dhook.h"

更改工程设置

Project->settings->link->Object/library modules:
输入../s3dhook/debug/s3dhook.lib

在对话框的OnInitDialog中加入InstallHook();安装键盘钩子
在OnClose中加入UninstallHook();关闭程序时卸载键盘钩子
编译这个对话框EXE

把这两个工程生成的S3DHook.dll和Main.exe放到同一个文件夹中,运行.

原创粉丝点击