发布于:2018-5-28 11:12 | 166756次阅读 作者: 外部投稿
1. 线索:利用我们第一节课学到的无CD找法,找到放技能相关的关键点。接着,这节课我们要分析释放技能的相关CALL,实现全屏技能秒杀CALL。 启动DXF,CE搜索,OD附加 2. 调试:0227BC22 无CD的地址 [分析与查找见本系列教程第二课],我们到了16级了,可以体验转职后的技能,在无CD的地址下好断点,往上回溯,我们知道这里是判断的地方,我们需要找到真正放技能的地址 我们在判断CD的地方走出来后,发现了这样的代码 006C01A0 6A 01 push 0x1 006C01A2 6A 00 push 0x0 006C01A4 6A 00 push 0x0 006C01A6 6A FF push -0x1 006C01A8 6A 01 push 0x1 006C01AA 6A 01 push 0x1 006C01AC 6A 01 push 0x1 006C01AE 51 push ecx 006C01AF 8BCE mov ecx, esi 006C01B1 E8 DA9B4A01 call 01B69D90 ; 我们尝试把返回值修改为0试试,我们可以看到,技能的CD刷新了,但是却没有释放出来效果,可以判断这里就是一个判断技能能否释放,然后刷新CD,蓝量相关的代码。真正的效果还是在下面,我们把之前的无CD关闭.. 我们看到,这里的返回值如果是1的话,就算在CD中也可以释放。那么我们就需要调用的是这个CALL了 006C01BA 6A 01 push 0x1 006C01BC 6A 00 push 0x0 006C01BE 6A 00 push 0x0 006C01C0 6A 01 push 0x1 006C01C2 6A 00 push 0x0 006C01C4 6A 69 push 0x69 006C01C6 8BCE mov ecx, esi 006C01C8 E8 D3974A01 call 01B699A0 这个CALL看上去只有一个地方是变量,那就是ecx 这是上一次启动Dxf的ecx 498E2940, 这是这一次的ECX 46E62940 , Ecx = 4C172940 他们是会变化的,那么我们需要先测试一下,看一下这个到底是不是我们需要找的技能CALL 我们把ecx直接修改为刚刚得到的值,然后利用工具去调用CALL测试,发现可以 push 0x1 push 0x0 push 0x0 push 0x1 push 0x0 push 0x69 mov ecx, 46E62940 call 01B699A0
我们去这个CALL里面看下释放其他技能是什么样子的,我们发现有个技能的第二个参数没有处理就会引发游戏崩溃。其他的不涉及到第二个参数是没有问题的,我们去副本中测试一下,看如果我们没有拥有这个技能,是否也可以释放出来。 0019EB94 00000065 0019EB98 0019EBB4 0019EB9C 00000001 0019EBA0 00000000 0019EBA4 00000000 0019EBA8 00000001
可以看到,我们就算是没有这个技能,也是可以通过调用这个CALL来实现释放这个技能的,我们可以看到,这个CALL有个地方是变量,游戏每次启动的都不一样,那我们怎么定位这个地方呢,我们打开CE,利用指针搜索扫描这个地址,扫描完成后,我们重新打开游戏,然后再次搜索变化的地址,再次拿到ecx的值4C6E2940,在CE中重新扫描 我们得到了许多的多级地址,我们这里采用简单原则,越简单越不容易出错的原则,选用级数最少的那个 [[[[Dnf.exe + 0x49f5700] + 0x1b4]+0x6f8]+4fc]我们去od中测试一下 [[[00400000 + 0x49f5700] + 0x1b4]+0x6f8]+4fc(这里由于疏忽找错了数据,下文已经更正,视频中已重新分析,此说明针对word投稿特意说明) 这样,我们就得到了地址,而且我们发现就算ecx不一样,调用其它技能也是没有问题的 我们去采集下不同职业的大招 无尽侵蚀: 0019ED00 00000069 0019ED04 00000000 0019ED08 00000001 0019ED0C 00000000 0019ED10 00000000 0019ED14 00000001
我们可以看到第二个参数需要再处理,这里我们先用别的 破灭斩:
0019ED00 0000002E 0019ED04 00000000 0019ED08 00000001 0019ED0C 00000000 0019ED10 00000000 0019ED14 00000001
坠蚀之雨 0019ED00 00000066 0019ED04 00000000 0019ED08 00000001 0019ED0C 00000000 0019ED10 00000000 0019ED14 00000001
我们目前采集完了,现在就该把我们刚刚的多级地址配合这个CALL转换成汇编的样子了 [[[[[Dxf + 49F5700]+1B4]+80]+54]+1F8]+4FC 写好的代码如下:刚刚写错了,现在我们要开始编程实现自己的程序了
pushad pushfd mov eax,0x0400000 mov eax,[eax + 0x49f5700] mov eax,[eax + 0x1b4] mov eax,[eax + 0x80] mov eax,[eax + 0x54] mov eax,[eax + 0x1f8] add eax,4fc mov ecx,eax
push 0x1 push 0x0 push 0x0 push 0x1 push 0x0 push 0x69 call 01B699A0
popfd popad
3. 测试4. 编程打开我们之前的VS工程 ,下面来测试一下,由于我们刚刚找的基址不对,游戏重新开始后,基址变化了,我们需要再用CE搜索一边,所以在搜索指针的时候一定要确认3遍以上 下面我们使用新的地址测试 [[[[[Dxf + 49F5700]+1B4]+80]+54]+1F8]+4FC
没问题了,我们把其他的地址也修改 5. 总结1. 根据无CD找到判断技能的关键点,然后再利用这个找到真正释放技能的函数 2. 根据技能释放的参数,找到多级偏移并且利用 3. 学习如何编写动态CALL 4. 编程实现CALL的注入以及如何测试CALL 5. 本文所讲解的功能仅供学习交流,请勿用作非法用途 来源:邮件投稿 *转载请注明来自游戏安全实验室(GSLAB.QQ.COM) GSLAB网站投稿文章仅代表作者本人的观点,与本网站立场无关。 |
最新评论
发表评论