本篇是灌水系列的第二篇.
来参照别人的mh获取我们需要的patch点
如果你希望自己分析 有果子林的文章
魔兽争霸3的MapHack制作教程(一)显示敌对单位
http://alzzl.spaces.live.com/blog/cns!C1FF77E38059705D!274.entry
魔兽争霸3的MapHack制作教程(二)去除战争迷雾
http://alzzl.spaces.live.com/blog/cns!C1FF77E38059705D!281.entry
里面还有不少WOW的文章值得细读
我们简单起见,直接拿别人已经做好的MH分析
偶分析的是Bmap
以下所有的都是offset,由于game.dll基址可变,一般用offset比较稳定
1.patch showunitsingame
0x3A04AB
2.patch showunitsmap
0x36087C
3. patch clickableunits
0x28464C
4.patch clickableunits 2
0x284662
5.patch revealillu
0x281F1C
6. patch removefogingame
0x73B949
7.patch pingsignal
0x42F836
8.patch showinvisiblemap
0x360C91
9.patch showinvisiblemap
0x3558FE
10.bypass DotA -ah command
0x3C3F02
0x3BF63C
11.enable viewable items
0x3F75AA
0x3A03EB
12.enable colored invisibles
exe:
0x4559EC
0x455A60
0x455A65
0x455A6A
dll:
0x398E09
13.enable view skills
0x201B9C
0x34E6E8
14.enable view cooldowns
0x28D68E
0x34E726
15.enable click invisible units
0x284662
16. patch tradeamount
0x34D1E2
0x34D1EB
17.patch view all icons
0x36FFD1
0x36FFD7
18.patch view enemy icons
0x36FFD1
0x36FFD7
基本上国内的几个MH,比如warmh,lynnmh,ayssmh基本上都是这patch点
只是patch方式有所差别而已,文件的没什么,内存的就各有千秋了
标准写writeprocessmemory ,lpk,纯asm代码等各种方法均有
这些都是为了避免各种游戏平台的本地检测的,对于游戏而言 ,没用什么实际检测
当然这是局域网模式的特点,连接BN战网又是一回事,国内偶没看到多少人能连BN
游戏的,当然偶也没Z版cdkey,自然也不可能测试了.
关于游戏bug,确实存在的,有几种bug情况,一种是利用游戏bug出错,另外几种是
交换bug造成CollDown时间免除等bug,不过一般作用不大,偶也不喜欢去利用bug
刷积分,偶们写辅助工具是为了玩的舒服一点,不是为了刷积分,其实要刷积分
直接欺骗平台快多了,根本不需要游戏 哈哈
另外这里是简单提一下,不能直接修改金钱和攻击力,锁定生命也是不行的
简单起见,我们只关心感兴趣的几个功能
1.去除迷雾
2,显示隐身单位
3.识别幻象分身
其余的功能个人认为作用不大,其实功能2和3对于其他的英雄没什么大威胁
只是对于剑圣来说,把2个主功能给消除了,就明显被动了不少
那些没隐身和分身的单位基本上作用不大的了
好啦,关于修改代码的几个问题,上面的Bmap是直接打nop或者jmp解决的
直接修改文件肯定不用考虑了,这是任何效验都会发现的
这种办法是肯定被游戏平台封杀了,偶们需要使用一个hook引擎来把这一段代码
整个的搬出去运行,这样可以躲避内存效验(看各种平台具体情况)
有的平台喜欢做内存md5,那么我们就直接欺骗这个md5的算法函数
可以让其返回特定数值,更好的办法是内存重定位就是我们把原始的
复制出去一份 让效验的去检测拿原始的,这个在netroc大侠的文章有介绍
不过偶也不想用hook int0e 那样成本太高了.玩个游戏还写驱动,划不来啊
关于hook引擎的选择.其实偶根本不怎么懂得引擎的,只是随便说说,不当之处
欢迎大家指正,
首先 偶不喜欢那种复杂的引擎,偶们是懒人,要求使用简单效果好
那么要求是这样.设函数为gamefunc
偶们要直接输出gamefunc mygamefunc oldgamefunc
gamefunc -原始游戏内部函数
mygamefunc -我们的替代函数
oldgamefunc-如果要在mygamefunc 里面call原始函数,用这个
以下这种方式偶这种懒人是受不了的
http://www.xfocus.net/articles/200511/832.html这种方法
__declspec(naked) my_function_detour_ntdeviceiocontrolfile()
{
__asm
{
// exec missing instructions
push ebp
mov ebp, esp
push 0x01
push dword ptr [ebp+0x2C]
// jump to re-entry location in hooked function
// this gets 'stamped' with the correct address
// at runtime.
//
// we need to hard-code a far jmp, but the assembler
// that comes with the DDK will not poop this out
// for us, so we code it manually
// jmp FAR 0x08:0xAAAAAAAA
_emit 0xEA
_emit 0xAA
_emit 0xAA
_emit 0xAA
_emit 0xAA
_emit 0x08
_emit 0x00
}
}
还要自己处理堆栈帧,偶很懒,不想用
稍稍改进一点的是
http://www.whitecell.org/forums/viewthread.php?tid=360
这个,虽然多定义一个jmp函数,但是起码我们不用自己动堆栈帧了
不过也复杂了一点,我们还是使用成型的hooklib也许更加方便
lib的要求是一定要有反汇编引擎或者长度识别
确保hook任意地方都能成功运行无需人工干预
偶比较喜欢的类型是Ms-Rem的lib,直接输出三函数就可以了
虽然老V说这个jmp比较诡异,不过偶实际测试,没发现bug
fengyue的lib,确实是功能强大不假,但是使用起来有些复杂
DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...);
RetAddr //调用api的返回地址
pfnXXX //类型为__pfnXXXX,待hook的api的声明类型,用于调用未被hook的api
感觉不是那么方便,再来不得不灌水1下的是cooldiyer的hooklib
这个就实在是有点不过关了,他的GetPatchSize在计算偶的patch点的
长度发生了错误,偶不懂引擎,不知道错在哪里,他是基于Ms-Rem的没错
但是奇异的是Ms-Rem的lib计算正常,cooldiyer的计算出错?不明白..
还有就是一个奇怪的事情,当然偶也不明白
偶感觉 jmp far(7字节)和jmp near(5字节)在win里面似乎没什么差别?
似乎+了一个段表示符没什么作用?或者是win不使用段来寻址?
偶只能猜测cooldiyer是为了避免这种jmp near的计算相对地址的麻烦
不过有另外一办法也可以不需要计算相对地址
那就是 push xxx,ret
当然这个属于吹毛求疵了.实际上没什么影响的.只要正常工作
具体用什么指令无所谓的
接下来就要分析分析各个平台具体的检测措施了
GG平台,据说用了驱动hook了ntopenprocess不过没事
解决的办法太多了..不过偶这儿无法用GG,算了
浩方,似乎他检测不怎么严格,再说在偶机器上经常看不见别人,原因未知
不过浩方据说随便你怎么MH,都不会封号,所以可以放心测试
VS,这个据说是检测最严格的家伙把,而且有封号的风险
他有定期的内存hash检测(md5),而且还会扫描其他进程的内存特征
如果你开过360保险箱,那么应该会提示有一个dll会注入的
这个dll中也可能包含有一些检测,需要具体分析
下篇偶再来抓个软柿子捏捏把. 今天就灌水这这里咯.