免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 软件破解 > 浅谈魔兽争霸 DotA外挂制作(4)

浅谈魔兽争霸 DotA外挂制作(4)

时间:2011-11-08 13:29来源:未知 整理:寂涯网络 点击:


    else 
       ……
    endif
    return false
endfunction

由此可以看出,神符是由 CreateItem 函数创建的。CreateUnit 和 CreateUnit 的函数签名
如下:
native CreateUnit  takes player id, integer unitid, real x, real y, real face returns
unit
native CreateItem takes integer itemid, real x, real y returns item
hook这两个函数后,可以根据 unitid、itemid来判断是不是感兴趣的单位或者物品,x和

y 则提供了坐标,对于神符提示和Roshan复活提示,这样就足够了。
小地图上敌方英雄提示,不停地调用PingMinimapEx函数在敌方英雄位置处发信号就可
以了。只是所有 extends handle 的类型都是必须同步的,我们不能通过
GroupEnumUnitsInRange 之类的函数来枚举所有的英雄(需要一个 group 对象)。经过观察
后发现,英雄在出生、复活的时候都会调用 SetUnitX/SetUnitY 函数设定英雄位置,观察
SetUnitX的函数签名:
native SetUnitX  takes unit whichUnit, real newX returns nothing
Hook 住 SetUnitX 之后,判断 whichUnit 是不是一个英雄,是不是幻象(通过 IsUnitType
和 IsUnitIllusion 函数) ,如果是的话,就把这个 unit 记录下来,这样就可以获得所有英
雄的 unit值了。
既然是提示敌方英雄位置,那必然是周期性的,怎样保证定时调用呢?这里作者走了不
少弯路。一开始实现的时候是通过线程实现的,在决定去掉线程的时候,在RunJassNative
函数调用 native的地方做了 inline hook(6F45DCC5 处,每秒 3000-10000 次地调用);去
掉 inline hook换做DRx下断点的时候,又有很明显的性能问题。后来想到,既然这些东西
都是在魔兽的主线程内完成的,那么应该有消息循环,直接SetTimer不就好了,呃。果然,
OD中 bp DispatchMessage后,中断在主线程了。

程序构思
 
上一节已经将魔兽争霸和 DotA 分析过了,所有的必要条件就已经掌握,那么就可以开
始编码了。
前文提过,我们的外挂要实现“无进程无线程无 DLL 无补丁”。实际上完全的做到是不
可能的(不然你怎么启动啊),那么就要求外挂在运行的时候要做到。
无进程无线程这个不多说(全是Hook,都运行在魔兽的主线程)。无DLL么,那我们就写自
定位代码,或者在注入代码的时候处理重定位,本文选择的是第一种。无补丁,那怎么Hook
啊?x86 的 CPU 有个叫调试寄存器(DRx)的东西,经过设置,可以在读写内存/执行/操作 IO
端口的时候中断,在Win32上的表现就是一个EXCEPTION_SINGLE_STEP异常,我们可以根据
这个设断。
上文提到的那些 Jass native 和内部函数(P 开头的),是不能随便调用的,比如在
JassEnv 无效的时候调用 Jass native,或者在魔兽程序还未初始化完成的时候,调用 

PGetCurrentJassEnv(需要的 TLS 中的结构还没有初始化),魔兽都会痛快的死给你看。那
么我们就需要保证在正确的环境中开始工作。
给 PInitNatives 函数设断后发现,每开局一次,都会多次调用这个函数,那么我们
hook住这个函数,当他执行的时候就将外挂的状态初始化。
另外,当游戏开始 loading 或者已经开始的时候,CreateUnit 函数是经常性的被调用的,
所以这个函数不仅仅会帮忙提供 Roshan 复活的信息,也会告诉我们,外挂已经可以安全的
开展工作了。
另外的一个发现是,如果使用 PAddNative 函数添加 Jass native 的话,后来的函数会
覆盖掉之前添加的,这样我们可以用这个函数方便的添加 hook,虽然这实际上也算是补丁
了,但是总不能去计算数据区的校验值吧。这种方法有一个不算是的缺点:每一次初始化的
时候都要重新添加,不过真的影响不大。如果真的在意“这也算是个补丁”的话,改成DRx
hook就可以了,本来设计成这样是觉得DRx 寄存器可能不够用,后来发现4个刚刚好。
在作者开发的时候,无DLL(即改写成重定位代码)是最后一步完成的,在此之前外挂  

的功能,以及从 inline hook 过渡到 DRx hook 都已经完成。当改写成自定位代码以后,外
挂仅仅驻留在一块RWE(Read/Write/Execute)属性的内存块内。这是却发现,再次运行的时
候魔兽华丽丽的崩溃了…… 在处理异常的 SEHandler 上设断,发现系统根本就没有调用我

本页地址 http://www.jybase.net/ruanjianpojie/20111109592.html

百度搜索更多

谷歌搜索更多

顶一下
(4)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com