以前有篇回答被删了。 最近做了war3的一些作弊功能去打防守图。 挺有意思的。
我大概做了技能快速冷却,技能少耗蓝,修改护甲(神圣护甲),攻击类型(混乱攻击),瞬移。
不过代码有点乱, 还在整理后加注释再把后面功能如何逆向的文章写一发……
然后把以前被删那篇回答的war3单独拿出来好了, 因为有些旧的逆向数据我懒得重新解释一遍了。
// by 8.17
论如何修改魔兽3的攻击为混乱攻击, 护甲是神圣护甲
改成
0x1:
在做之前要想好'切入点', 就是游戏在哪会调用到攻击类型这个玩意呢?
比如说可以在使用技能(包括普通攻击)之后, 造成伤害之前是需要获取的。
但是也不好入手, 因为使用技能的判断太多了, 不好区分。
又或者说。 可以这样!
把鼠标放到攻击上面, 他'应该'会获取当前的攻击类型,然后转换成Text
-> 到界面
, 好, 接下去就试试这招!
……………… 但是在获取这个攻击类型之前, 还要获取一个东西, 就是获取该英雄的.
如何在茫茫人海里面把该英雄找出来, 因为每一个英雄都有自己的攻击种类,
所以第一件事就是要找到自身的指针!
从人物HP入手, 买点装备丢装备来达到人物HP不断变化的目的.
最终找到了
一个是HP一个是MAXHP
随便掉点血就知道第一个是HP, 第二个是MAXHP.
附加OD, 在HP下访问断点
看上一层,
023C8C1B|.8BBE48020000movedi,dwordptr[esi+248];HP
ESI就是人物指针.
往上回溯, 看下ESI是怎么传递的
一直翻啊翻, 翻到函数头了
ESI=ECX. 一般ECX或者ESI传递的, 都是this指针,
就是类指针.
比如说
Class::AAA() 里面默认有一个参数传递this指针.
汇编自动生成, 但是代码省略.
同理, 顺便做个记号, 因为你总不可能记0x????? 老夫记忆力不行.
继续回溯!
函数头
继续回溯
发现了这样! 很明显就是一个递归嘛!
先不管这个递归, 直接先找到上一层, 因为如果你一直卡在这个递归里面, 万一你上一层也是N个递归或者说是一条死路呢? 所以你得先寻找到根源, 再做详细分析!
继续函数头部下断点, 那么你会发现
他的[ESP]=
也就是这里. 所以要过滤这个!使用条件断点!
[ESP]!=
总算找到Base了.
那么我们再来分析这个递归
好了。然后就可以动手了写代码了.
首先因为这个是在DLL里面的, 因为DLL的加载地址不同,
所以解析出的Base也不同, 这个需要知道PE文件的如何计算偏移的。
我就直接粗暴一点, 暴力搜索内存
MFC做个注入DLL…… 不要问我为嘛用MFC,因为它是VS自带的,方便立马用。反正关了灯都一样.
随便写一个。 不要太讲究了。
编译! 注入! 测试! 结果如下:
好啦。然后发现了辣么多个Base, 然后找名字!
从名字入手. 这个英雄叫'虚入梦'. 顺便这个游戏是UTF-8编码(略过如何求证的).
所以这个英雄名称对应的编码是=
打开CE, 搜一下
务必要记住把 扫'只读'内存勾上
然后直接一个一个修改这个Text, 看下哪个是对应的名称. 比如说
手动修改一个
运气好, 第一个就是。 如果没变化, 那就一个一个往下改。 记得如果不是的话, 要改回去.
再改下一个。 也可以用二分"修改"(查找)法, 直接一次性改一半.
如果不存在的话, 那肯定在另一半。时间复杂度O()=O(logn) 必须学以致用!!!
接下来就是开启OD, 附加游戏.
下一个访问断点.
断下来了, 就是一个字符串循环复制, 返回到上一层CALL
eax就是人物对象指针.
edi就是一个缓冲区, 把人物指针的Name复制到缓冲区.
继续回溯
这个CALL就可以用了。
PUSH0x200
PUSHBuffer
MOVECX,pObjectPointer
CALL235F640
然而我在观察地址的时候, 就观察出来
因为他们2个地址是一毛一样的!
ECX=[ESI+238]
=[+238]
其实往上跟也有可能可以关联起来, 但是我懒得继续回溯了……
所以……
发现了有些地址可能是其他分类的吧?
分类判断懒得写了。 干脆
结果就是
好啦。 至少有一个是对的.
因为刚才游戏不小心被我弄崩了。我就顺便重开而且换了个游戏.
暂时目的达到了. 获取到当前角色. (遍历所有英雄小兵之类的暂时没这个需求,不做)
下一步就是修改攻击种类:
按照刚才的步骤, 搜索显示的Text
2分搜索大法好, 3次即可到达。
下访问断点
惯例的字符串复制操作, 返回到上一个函数!
EAX就是Text,
上面的MOV EAX,
[ESP+14]. 就是从上一个函数传递过来的参数. 返回去看好一下.
上一层CALL看参数
第一个参数
第二个参数
就是上上张图, 就懒得复制了
第三个参数
就是这个玩意。 那么我们要找的是种类。 也就是第二个参数=[ESP+0BC]
然后往上分析……过程略, 多断点几次的事, 我就不废话了。
然后往上慢慢下断看参数, 直到……
mov edx, dword ptr [esp+10]
mov ecx, dword ptr [edx+]
接下去就找[ESP+34]
既然这样,那么我们试试.
首先
所以
[] + 1E8 = EDI
EAX = 攻击种类
= [EDI + 0 * 4 + 0xF4]. (已经探明EBX=0)
所以……
我们换一个有混乱攻击的号就知道。 混乱攻击的时候。 这个值是=5的。
所以我们改成5试试。
嘿嘿!
然后是不是有效。 最上面的那2张图有数值测试!
顺便…… 肯定是联网无效的, 因为有数值校验的。可以单机爽一下!
而且……哪怕你用各种作弊图, 暂时老夫还没发现哪个可以改攻击类型!
神圣护甲同理, 我就多此一举了。
还有几张图顺便贴了
评论(0)