首先以寻找 所有对怪物释放技能的call为主题
首先理一下编程者如何编写释放技能的流程,
1. 游戏玩家释放技能
2. 获取当前选中怪物ID或者指针或者标识一类的总之能标识释放对象
3. 进行释放技能的校验(如技能CD,施法对象是否正确)
4. 向服务器发送封包数据
5. 服务器返回数据
6. 获取当前选中怪物ID或者指针或者标识一类的总之能标识释放对象(千万注意)
7. 播放技能释放的动画
按照这个思路我们从步骤2下手回溯找步骤1的释放技能的call。先用CE找到选中怪物的有哪些标识,经过赛选得出如下结果:
我们改变选中的怪物观察这三个值得变化,发现数据1和数据2始终保持一致并且大小都是相邻的数据,数据3则飘忽不定,由此猜测数据1和2是怪物的ID,3是怪物的指针。
接下来我们查看那些代码访问了这些地址的数据,注意是访问了不是改写了,在上次的找选怪call中我们查看的是那些代码改写了这些地址的数据,两者寻找的目的不一样,故此寻找方式也不一样,
我们看到访问怪物ID好像没有而访问怪物指针瞬间一大堆,不要着急这些都不是我们想找的代码,因为我们还没有释放技能,我们对怪物进行攻击,并查看这三个窗口瞬间出现的代码,找到我们怀疑的代码(理论上攻击一次访问一次),再次攻击,理论上访问的应该是两次,我们继续校验我们怀疑的代码(红框圈住的是访问次数),暂停攻击理应看到访问次数不再增加
经过赛选攻击怪物的时候访问的应该是怪物指针,并且按照上述规则找到几处可以的代码,这时候只能打卡OD校验了。
先给从CE里拿到的代码下断点,校验规则:
1.不进行攻击时进行其他任何操作断点不会断下
2.释放技能之后断点立即断下
3.断点断下之后技能应该尚未击中怪物,释放技能的call尚未完成(如何判断是否击中怪物:击中怪物之后怪物会方向攻击任务)
109F69CB . 8BAA 98050000 MOV EBP,DWORD PTR DS:[EDX+598] 发送封包后
109F3CC3 |. 8BB2 98050000 MOV ESI,DWORD PTR DS:[EDX+598] 发送封包后
109F4AF5 |. 8B82 98050000 MOV EAX,DWORD PTR DS:[EDX+598] 发送封包后
109F60C0 |. 8B80 98050000 MOV EAX,DWORD PTR DS:[EAX+598] 发送封包后
109F3B9B |. 8BB0 98050000 MOV ESI,DWORD PTR DS:[EAX+598] 发送封包后
108EC682 . 8B82 98050000 MOV EAX,DWORD PTR DS:[EDX+598] 发送封包后
102C6D90 . 8BB9 98050000 MOV EDI,DWORD PTR DS:[ECX+598] 发送封包前
依据上述判断我们最终搜定了其中之一的代码(最后一个)
剩下的就是老办法,CTRL+F9回溯,下断点,标号,连续回溯6-7层即可(一般情况,包含间接call),肉眼观察这些call,理应最少一个参数,因为技能有多个,肯定有技能参数。
然后就是用代码注入工具进行测试。最终找到释放技能的call.
调用call之前抓取堆栈,更换技能再抓取堆栈,(其中一次释放技能1堆栈信息如下)
EAX 00000031
ECX 1EF69450
EDX 00000001
EBX 1D8CFC00
ESP 0038E4D4
EBP 00000000
ESI 0038EF34
EDI 0038EF2B
EIP 112A4AE2 em.112A4AE2
C 0 ES 002B 32位 0(FFFFFFFF)
P 1 CS 0023 32位 0(FFFFFFFF)
A 0 SS 002B 32位 0(FFFFFFFF)
Z 1 DS 002B 32位 0(FFFFFFFF)
S 0 FS 0053 32位 FFFDD000(FFF)
T 0 GS 002B 32位 0(FFFFFFFF)
D 0
O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
ST0 empty -??? FFFF 443B8000 44804000
ST1 empty -NAN FFFF FFFFFFFF 00000000
ST2 empty -??? FFFF 3F800000 3F800000
ST3 empty -??? FFFF 443B8000 00000000
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 36.000000000000000000
ST7 empty 0.0
3 2 1 0 E S P U O Z D I
FST 0137 Cond 0 0 0 1 Err 0 0 1 1 0 1 11 (LT)
FCW 027F Prec NEAR,53 掩码 1 1 1 1 1 1
我们发现eax就是技能ID(更换技能时只有这个寄存器的值有变化,其他无变化)
31代表技能1,32代表技能2 ,以此类推,(这款游戏的技能在快捷栏数组里面不可以变动)
值得注意的是其他的非指向技能(如打坐,召唤坐骑)也是这个call只需调整参数即可,
例如,召唤坐骑测试call:
mov ecx,1EF69450
push 1
push 78
CALL 10B26810
普通攻击走的不是这条线,下一篇我们继续套路普通攻击的call.