Under the hood

互联网上新生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Hacking Diablo II之外挂的工作原理

Posted on 2008-10-16 10:55  sting feng  阅读(1357)  评论(0编辑  收藏  举报
这一篇介绍外挂的工作原理。如果对外挂是怎么工作的没有一个大概的了解的话,那这一系列文章只能当故事看了。
如下图所示,大方框表示Diablo II.exe的进程空间,框内左侧的虚线表示游戏的主线程循环。游戏主线程循环所做的工作大约有:绘制客户端画面、响应服务器端的命令,以及接收玩家的鼠 标键盘输入等。框内右侧的小方框就是所谓的外挂程序(Injected DLL)。

外挂要工作首先要加载到游戏进程空间,最常用的方法一 般是通过DLL的远程注入,比如在NT/2K/XP下可以用CreateRemoteThread/LoadLibrary方法,9x平台稍微麻烦一点 儿。也有做成和游戏程序一起启动的,比如利用d2loader的plugin加载功能。外挂要发挥作用,就要在必要的时刻感知游戏的状态,这个可以通过在 游戏本身代码中设置旁路点(detour patch)改变原有程序的流程做到。因此外挂加载以后首先要做的就是设置旁路点(一般是一个跳转指令,有hook API经验的同学比较容易理解,但和hook API不同的是,旁路点不一定在函数的入口处)。由于设置旁路点需要修改原有游戏代码,而如果修改的同时主线程正好执行到那儿就会导致游戏崩溃,因此设置 旁路点的代码最好在游戏主线程的上下文环境中执行(可以通过SetWindowLong设置消息钩子,用SendMessage触发主线程调用窗口过程, 然后在窗口过程中进行设置)。
图中的黄色方框就是一个旁路点。通过旁路点,在适当的时刻游戏的主线程就会跳转到外挂程序中,此时外挂程序就取得了 控制权,它做完处理后,再跳转回旁路点的后面继续执行-这是一个典型的外挂代码执行流程。举个例子来说,Diablo中有好几种天气效果:晴天、雨天、雪 天等。可以想象游戏中肯定有一段负责绘制天气代码,如果在这段代码附近合适的地方插入一个旁路点,就可以控制天气的绘制,始终让游戏处于晴天。 Maphack设置的旁路点有上百个。
其次,外挂要做更多的事情,就要充分利用游戏原有的函数、代码,比如Diablo的程序内部有一个函数可以往游戏画面的左上角输出文字。因此外挂程序加载后要做的另外一件事是定位一些游戏内部函数的入口点。Maphack中用到的内部函数有一百多个。
Diablo II中流行的大部分外挂,如d2maphack, d2hackmap, d2jsp, d2hackit等,都是基于这种原理工作。

注:本图片是在Hacking WOW中的图片基础上修改而成。