WOW外挂编写教程---进阶版

WOW外挂编写教程---进阶版前一贴入门篇主要写的是感性知识,哪怕没接触过程序设计的人,只要用金山游侠,CE(cheat engine)之类的软件就可以将贴内提到的内容实践一下。但是仅仅了解这些远远不够。正如有人回贴说用按键精灵就可以轻松的实现仿键盘输入功能。而接下来遇到的最大问题就是该输入什么,在什么时候输入,如何知道游戏内人物的状态以及周围的情况。上贴教了一个查找游戏内容的方法,通过不停的改变游戏内容来查找改变的数据,最终确定某个内存地址具体对应游戏内的状态值。但是这个方法只适用于静态地址,可以查到人的位置,面对方向等等。但是在2.3版里很多数据是动态存储的,比如HP,通过内存查找软件可以很轻松的找到HP地址(方法在入门篇里已经有介绍),但是你会发现,重新启动一下游戏,或者是重要登录一下账号选择一下人物,这个地址就失效了。每次上游戏,可能都要重新查找,这样一来编写商业外挂就变得很困难。你不可能让客户每次都手动查找地址然后输入。然后用过助手的都知道,运行助手软件后不需要任何动作,程序就会根据游戏的内容自动发送命令,而且非常精确,包括血少时吃红,魔少时吃蓝。那又是怎么做到的呢?呵呵,这里我就这部分内容作一个简单介绍。以下内容可能并不针对所有人,看懂以下内容的提前是你需要有一定的汇编和内存指令数据存储知识,当然,涉及的内容很浅显,如果你愿意花一点时间google,那么最多一天时间,你就能读懂并且顺利的应用这些方法。同时,你需要一些工具,这里我列出来,在网上都能够找到.1.ollydbg,这个东西是搞破解必备家伙,替代工具可以是softice,当然,如果你会用softice,那么这篇东西也不用看了.2.tsearch/cheat engine/金山游侠,这些是内存查找利器,推荐cheat engine,非常好用。如果对内存不熟的话,可以用金山游侠,界面很友好。友情提示一下,cheat engine 会被WOW客户端主动侦测到,并且提示这个软件可能会危害计算机安全,会问你是不是要终止WOW程序,这时候不用管,选“无论如何都运行WOW”。为了安全起见,在使用这个软件的时候,最好找一台独立的机器,独立的IP,使用测试账号登录WOW,避免连累无辜  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  沙发 大 中 小 发表于 2007-12-11 22:01  只看该作者 先复习一下内存数据的查找方法,我们需要查找的内存数据分为两类,一类是显性数据,比如HP,MP,这些值我们都可以看到,如果他们发生变化,我们可以知道具体的值,因此查找这部分数据是很容易。比如第一级HP是80,我们在运行内存查找软件,在WOW的程序里找80这个值,然后去打怪,让血减少,因为血减得很快,可能我们输入某个确定的值查找的时候,血又减少了,因此我们要用到的功能是查找“变更值”,也就是说,查找和上次结果不同的值。这样几次下来,可以确定某个地址,这时你仔细观察一下,这个地址就是对应血量的。显性数据查找起来是很快的,一般只需要几分钟。另一类是隐性数据,比如人物的位置,是处于战斗状态等等,这些数据我们都看不到,也不知道具体对应的值是什么,这时候就需要用模糊查询,这里就cheat engine举个例子:第一次查找时选"unknow value",可以会找到几亿个地址,然后在游戏内改变你想查找的状态,比如原来是非战斗状态,现在进入战斗状态再找一次,找的数据类型为“changed value",然后再恢复为非战斗状态,再查一次“changed value",然后在不改变战斗状态的情况下,查一次“unchanged value",如此反复多次。因为是模糊查询,最终可能会有多个地址跟着你的战斗状态一起变,这个时候就需要你一个个自己判断了,是否某个地址只出现两种值即对应两种状态。现在我们假设你已经能够把需要的动态数据都找出来。然后接下来遇到就是写外挂时最大的问题,如何准确读取每次运行都会改变地址的数据。  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  板凳 大 中 小 发表于 2007-12-11 22:29  只看该作者 现在就轮到ollydbg出场了,先运行wow,登录选完人物进入游戏,因为WOW在登录时会进行文件校验,如果这时已经在ollydbg下过断点的话会发生校验出错提示版本问题登录不了游戏的情况运行ollydbg->打开file菜单->点击attach项->在弹出的菜单内选中world of warcraft ,双击或者点右下方的attach按钮选完之后ollydbg就会载入wow程序,可能会比较多,在截入完之后会自动暂停wow程序,这时候你要迅速点击工具条里的运行钮或者按F9,这时再回到WOW程序看看有没有死机,如果没死的话进入下面的程序,如果死掉的话就重新来一次,加快你按F9的速度选择view菜单->选择memory项(也可以直接用alt+m)->弹出程序的内存清单,假设我们在上面找到了HP的存储地址为110FE3C(这是一个十六进制的数字,用来表示内存,如果你不知道十六进制是什么意思,那么请google"十六进制"),现在我们要做的是在清单内找到这个值,注意,这个内存清单显示的是程序占用的内存段,如下表所示,我们找的是HP地址所对应的内存值段,注意,因为WOW暂时在维护,因此无法登录游戏查找具体数值,下面这个表是我为了表述方便而修改过的,实际可能有所不同,但查找方法相同复制内容到剪贴板代码:Memory mapAddress    Size       Owner      Section    Contains      Type   Access    Initial   Mapped as起始地址     范围00010000   00001000    <-起码地址+范围即条所涵盖的内存段,在本条上对应的区域为起点:00010000,终点:00011000                                   00020000   00001000                                       Priv   RW        RW0011D000   00001000                                       Priv   RW  Guar  RW0011E000   00012000                         stack of mai  Priv   RW  Guar  RW00130000   00006000                                       Priv   RW        RW00137000   0001F000                                       Priv   RW        RW0015A000   00003000                                       Priv   RW        RW01000000   00FFFFF <- 这条即为我们所需要查找的地址段,双击进入弹出了类似以下这个表的内容,下表同样为了表述方便而经过修改,以后如非截图数据均就理解为修改后数据复制内容到剪贴板代码:0110FE3C C8 00 00 00 00 01 00 00 FF EE FF EE 02 10 00 00   <这行就是我们需要找的数据012C0010  00 00 00 00 00 FE 00 00 00 00 10 00 00 20 00 00  ................012C0020  00 02 00 00 00 20 00 00 2F FC 01 00 FF EF FD 7F  ................012C0030  06 00 08 06 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0040  00 00 00 00 88 05 2C 01 0F 00 00 00 F8 FF FF FF  ................012C0050  50 00 2C 01 50 00 2C 01 40 06 2C 01 00 00 00 00  ................012C0060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0090  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C00F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0100  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................012C0110  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................接着,我们在这个表里查找地址110FE3C,第一行就是,然后选中这行的地址,选中部分会变成灰色,一般需要选四个字节,因为WOW的数据都是分配四字节内存,选中后在选中的内容上右击,选择弹出菜单内的breakpoint->memory,on Write,这个动作的意思,一旦程序更改这个值,立即中断程序.这样我们就可以知道是哪条指令更改了他[ 本帖最后由 ht37 于 2007-12-11 22:31 编辑 ]  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  地板 大 中 小 发表于 2007-12-11 22:39  只看该作者 接下来的部分等维护完再写吧,这样不和具体程序联系起来始终觉得很干瘪,而且看的人不能按内容一步步的实践,无法建立感性认识的话是很难坚持看下去的有人说我这个东西是转来的,呵呵,要说转,那你倒转个给我看看,其实类似思路的文章很多,但是都是高手写他们的心得,而入门的文章则很少,我因为接了个写挂的活,有些东西也是现学的,从初学者的角度来写体会,可能更容易让新手看明白吧  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  5楼 大 中 小 发表于 2007-12-13 00:48  只看该作者 我又回来了,接上面的教程,前面两个代码图都是我瞎截的,当时游戏在维护,现在先补上内存段代码,复制内容到剪贴板代码:114FA548  50 00 00 00 00 00 00 00 00 00 00 00 64 00 00 00  P...........d...114FA558  64 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00  d.......P.......114FA568  E8 03 00 00 64 00 00 00 64 00 00 00 00 00 00 00  ?..d...d.......114FA578  01 00 00 00 02 00 00 00 02 01 00 01 00 00 00 00  ...........114FA588  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................114FA598  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................114FA5A8  08 00 00 00 00 00 00 00 99 09 00 00 00 00 00 00  .......?......注意上表的第一行,就是标号为114FA548这行,114FA548是一个十六进制数,表示内存位置地址,在这个数之后的每两位数表示内存中的一个字节,每行16个字节,第一个50也是十六进制数,对应的十进制数是80,这就是兽人第一级的血量,在第二行还有一个50,这个50是最大血量,当前血量和最大血量的地址都有了,然后用鼠标选中114fa548这个地址开始的四个字节,下断点,下断点的方法看上面的贴子.然后回到游戏,打个怪,让血减少.这时候ollydbg就会暂停并且出现下表复制内容到剪贴板代码:00617AB0  /$ 55             PUSH EBP00617AB1  |. 8BEC           MOV EBP,ESP00617AB3  |. 8B41 08        MOV EAX,DWORD PTR DS:[ECX+8]00617AB6  |. 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]00617AB9  |. 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]00617ABC  |. 890C90         MOV DWORD PTR DS:[EAX+EDX*4],ECX<----这一行会被高亮黄色标示00617ABF  |. B8 01000000    MOV EAX,100617AC4  |. 5D             POP EBP00617AC5  /. C2 0800        RETN 8大家注意看我标了注解的这一行,这是一条汇编命令,其功能是向eax+edx*4的这个内存地址开始的位置写入一个双字,写入的值存放在ecx内,eax,edx,ecx是寄存器,具体寄存器是什么意思,大家可以google一下,在我的教程里,你只要知道寄存器可以存放内存地址和数据就行,涉及到具体的命令时我会具体解释我们现在已经知道是这行命令更改了我们的血量,而这行命令的地址是不会变化的,因为他是指令而不是数据,是在客户端载入时分配的地址,因此是固定的,而咱们现在就看看这条指令是不是只更改血量.具体操作:用鼠标左击这一行选中,然后按F2,这个动作意思是我们在这里下断点,只要程序调用这条指令,ollydbg就会中断程序并给出中断时的各项数据,包括寄存器,内存,堆栈的值.下完断点后,我们发现哪怕不打怪,不少血的情况下也会中断,也就是说不减血的时候系统也会调用这条命令....这回完球了.不仅仅地址是动态的,连程序也是公共的,公交车----大家一起上,熟泡面=====人人可以泡.不要着急,既然有人写得出外挂,那么咱们也能写.一般来说遇到这种情况就要分析程序了,一步步的向上查,看ecx的值是从哪里来的,如果程序简单的话,也许1分钟搞定,要是复杂起来,加了一百层壳的话,那就有可能要查上一会了,这就是传说中的软件破解,而且是最低级的.在HP地址这个问题上,我们有更好的办法来解决,你多启动两次游戏或者多登录两次,多查两次不同的HP地址,会发现一个规律,不管地址怎么变,最后三位总是548,注意这依然是一个十六进制数,之所计算机用十六进制数,是用计算机的硬件有关,在电脑里,只有0和1两种状态,对应就是通路和断路两种情况,而十六进制的一个数字,正好对应四位二进制数,下面为了表达方法,十六进制数加后缀H,二进制数加后缀B,1H=0001B,AH=1010B,FH=1111B,这里只是简单介绍,因为下面将要进行二进制的运算动作,如果想详细了解,还请自己google.现在继续刚才的命令讨论,因为这条命令是复用的,因此并不是他所生产的所有数据都是我们需要的,只有当[EAX+EDX*4]这个值的最后三位数是548时,我们才需要.为了读取最后三位数并且判断是否为548,我先要介绍两个二进制的动作命令,"与","异或",注意这"与"和"异或"与我们数学中的"加""减""乘""除"是一个概念,也是一个运算符号,具体的运算法则我这里简单介绍下,我们都知道十进制的加法法则,1+1=2,2+2=4,,而二进制中,只有0和1两个数字,所以无论是什么去运算,只可能产生三种算式:0+1,0+0,1+1,1+0,其中,0+1和1+0是相同的,而二进制的运算法则如下:1与1=11与0=00与0=00与1=0,"与"运算法则简单归纳就是 有0出0,双1出11异或1=00异或0=01异或0=10异或1=1,"异或"法则的速记法是"同位出,异位出1"这两种运算均没有进位和退位,按位运算,例:0001与1101=0001,0001异或1101=1100,分别位置对应,位置不够的话在高位补0,比如1100 0000 与 0000 1111,后面这个数其实就是1111,但是在二进制运算时,需要补0再回到我们刚才的地址讨论,我们现在手上得到的HP地址是114FA548,548H=0101 0100 1000B,注意我在二进制中间加了空格,是为了大家的观察方便,实际当中是没有空格的.我们需要把高位全部清0只剩下548这三位,并且不能倍数改变原来的数字,因为我们接下来还要进行比对,看是否为548,如果是的话记录这个地址上的数值.我们先将这个数字装入ebp内,具体的命令是mov ebp,[eax+edx+4]然后进行与操作,将EBP与00000FFF,具体命令是and ebp,00000FFF,这样我们就将EBP内的高位清0,只剩下原来的3位十六进制数,或者是12位b然后再异或,将EBP异或00000548,命令:xor ebp,00000548,如果结果是0的话,那么代表这个地址正是我们所需要.如果非零,那么就不用管他了接下来,就是要把上面这些命令插到中断的这条命令后面.[ 本帖最后由 ht37 于 2007-12-13 00:52 编辑 ]  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  6楼 大 中 小 发表于 2007-12-13 01:21  只看该作者 上面的帖子有个错误,因为无法编辑,在这里更正一下:最后一段引用:我们先将这个数字装入ebp内,具体的命令是mov ebp,[eax+edx+4]这一行错了,在命令中如果加了中括号是表示地址,正确的命令要分解成几条复制内容到剪贴板代码:push edx<-把edx的中的数据保存起来待用push eax <-把原来的eax中的值保存起来,我们现在要用eax进行剩法运算push eax<-保存第二份,待会要取两次mov eax,edx<-把EDX中的值移入eax<准备用处mul 4<-这条命令的作用是将eax*4再放回eax中pop edx <-把刚才保存的第二份eax的值放到edxadd eax,edx<-将eax+edx,结果保存在eax内mov ebp,eax<-将计算出来的地址装入ebp待用pop eax<-恢复原来的数据,下同pop edx  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  7楼 大 中 小 发表于 2007-12-13 01:22  只看该作者 剩下的明天写了  UID42914 帖子813 精华0 积分0 金钱914 G 注册时间2007-4-1 最后登录2008-3-6 查看详细资料 引用 使用道具 报告 回复 TOP  dljh 中士 精华0 金钱65 G 注册时间2007-3-9 个人空间 发短消息 加为好友 当前离线  8楼 大 中 小 发表于 2007-12-13 05:12  只看该作者 抛开使用外挂到底是对是错,这个本身是很好的技术帖。光从计算机技术来看确实算是入门的好教程。虽然我是提倡反对使用外挂的,但是从写程序的角度来看很有意思。其他我就不多说什么了……不然有被别人说成事托的嫌疑。希望楼主能把帖继续写下去。 UID40300 帖子60 精华0 积分0 金钱65 G 注册时间2007-3-9 最后登录2008-4-26 查看详细资料 引用 使用道具 报告 回复 TOP  ht37 骑士中尉 精华0 金钱914 G 注册时间2007-4-1 个人空间 发短消息 加为好友 当前离线  9楼 大 中 小 发表于 2007-12-13 09:09  只看该作者 谢楼上的朋友顶,因为接下来的的内容比较枯噪,我还在酝酿怎么写得生动感性一点先给大家来点感性的料,用ce搜索hp的值,在确定为XXXXX548这个地址后,打开内存编辑页面,可以看到如下表所示两行第一行的红色50对应的就是我们的当前血量,这个数值会随着我们打怪而减少和恢复,第二行的绿色50则是我们的最大血量,升级时才改变.把后面的绿色50改成F0,再回到游戏看看是什么效果,在血量的显示条上变成了80/240,但是你的当前血量并不会增加,这个数值仅仅是显示数据,而当前血量是一直与服务器同步的.114FA548  50 00 00 00 00 00 00 00 00 00 00 00 64 00 00 00114FA558  64 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00顺便提一下,前段时间有些朋友进不了游戏,来问我什么原因,截图来看是登录时出错版本错误提示,大家在使用ollydbg更改程序后也会出现这个提示,因为WOW会在启动时对内存中的数据进行一次校验,如果发现被更改就给出这个提示.出现这样问题多半使用了外挂,本应该在完成登录后再启动的外挂,如果在登录前就启动了,因为外挂更改了内存的指令,所以就发生这样的问题.由此可见暴雪在防外挂这个事上还是挺用心的.

你可能感兴趣的:(WOW外挂编写教程---进阶版)