|
| |
精品推荐 |
 |
|
| |
|
|
|
|
协议型网络游戏外挂制作之APIHOOK
|
日期:2008年6月9日 作者: 查看:[大字体
中字体 小字体]
|
上一节中我们说了外挂平台的搭建,我们做完了Hook.dll和wg.exe,但如何让wg.exe调用Hook.dll中的函数,可以自己查看CB的教程或者到网上查查。在这里我是在wg.exe的Hook按钮事件中添加了下面的语句来实现:
if(gamethreadid) { if(EnableHook(gamethreadid)==false) ShowMessage("error"); } 你可以点击Hook按钮在游戏界面出来之后,然后在游戏界面中按F12键调出外挂的窗口。
昨天的尾巴完事之后,开始今天的教程。今天我想说说APIHOOK。虽然APIHOOK在大话游戏的外挂制作中不是必须的,但为了按照一般的制作流程顺序,就先将这部分加入到里面去了。
使用APIHOOK的原因也很简单,游戏肯定要调用某些系统函数,使用APIHOOK可以简单的查看一些关键的信息并进行修改(就这么简单的理由?是的,我们一向再用杀牛的刀宰鸡的。。。)。
Jeffrey Richter用了大量的篇幅来讲如何插入DLL和挂接API,如果你不知道Jeffrey Richter是谁的话,总该知道《Windows核心编程》的作者吧,如果不知道,我倒,系统抛出例外,你是外星人吧。我们的程序运行在用户层上,J。R提出了两种办法,一种是改写代码,我刚开始也试图用这种办法,后来发现这种办法确实存在的漏洞多多,和J。R说的一样。最后还是采用操作模块的输入节了。
在查看资料的过程中,我发现J。R的代码在中文Windows 2000上并不能运行(难道是外国人用的系统和中国的不一样?),后来只好J。R的思路,重新安排了一下函数,但大部分函数都一样的。为了方便,我没有在类中捕获LoadLibraryA、LoadLibraryW、LoadLibraryExA和LoadLibraryExW,也是因为我们的外挂程序运行的时候游戏的窗口已经出来了,该加载的一般都加载了。
下面是我的APIHOOK类的源代码,该源代码是根据J.R的思路重新整理他的源代码来的:
/*HookAPI.h*/ #include "windows.h" class CAPIHOOK { public: CAPIHOOK(PSTR pszCalleeModName,PSTR pszFuncName,PROC pfnHook,HANDLE prochandle,HMODULE hmod); ~CAPIHOOK(); operator PROC(){return (m_pfnOrig);}; public: static PVOID sm_pvMaxAppAddr; static CAPIHOOK* sm_pHead; CAPIHOOK* m_pNext; PCSTR m_pszCalleeModName; PCSTR m_pszFuncName; PROC m_pfnOrig; PROC m_pfnHook; BOOL m_fExcludeAPIHookMod; HMODULE m_module; HANDLE m_handle; private: pfnOrig,PROC pfnHook,BOOL fExcludeAPIHookMod); void WINAPI ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,PROC pfnOrig,PROC pfnHook,HMODULE hmodcaller,HANDLE handle); void WINAPI FixupNewlyLoadedModule(HMODULE hmod,DWORD dwFlags); FARPROC WINAPI GetProcAddress(HMODULE hmod,PCSTR pszProcName); };
/*HookApi.cpp*/
#include "hookapi.h" #include <assert.h> #include "imagehlp.h" PVOID CAPIHOOK::sm_pvMaxAppAddr = NULL; const BYTE cPushOpCode = 0x68; CAPIHOOK *CAPIHOOK::sm_pHead = NULL;
上一篇:协议型网络游戏外挂制作之APIHOOK补遗
下一篇:Unix和Windows跨系统通讯编程
|
| 相关文章: |
|
|
|
| 相关软件: |
|
|
|
|