首先以寻找 所有对怪物释放技能的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.03 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.

外挂学习之路(8)--- 释放技能call相关推荐

  1. 外挂学习之路(1)--- bp send 回溯寻找关键call

    先废话一下----好久没有更新博客了,更新一下.学习外挂也有几年时间了,零零散散没有学习到什么东西,更没有做出什么有用的项目,也没有什么总结文档,从头再来吧,人不立志难以成事. 以下文字都是自己的感悟 ...

  2. 外挂学习之路(15)---lua语言的使用,

    必学,,, =========================以下10:19 2018/8/21更新============================== Lua详细学习请看:https://b ...

  3. 外挂学习之路(14)--- 游戏中的二叉树

    最近有点懒了,两个月前就准备总结地传说中的二叉树在游戏逆向里是怎么回事,一直拖到现在,今天还是不能完成(慢慢知道自己最终不能成就什么大事的原因了, ,做什么事都不能持持之以恒),不过得先写下辩题提醒自 ...

  4. 外挂学习之路(12)--- 用CE搜索字符串和搜索字符数组的区别

    用VS2008写个小工程做测试,得到如下一些结论 代码如下: TCHAR test[50] = TEXT("你好啊"); void CasciiDlg::OnBnClickedBu ...

  5. 外挂学习之路(11)--- 背包数据的遍历

    查找数据主要包括:背包数据遍历.NPC数据遍历.怪物数据遍历.地面物品数据遍历.技能列表遍历.周围玩家数据遍历.地图数据的查找.人物信息的查找等等. 本次只讨论需要遍历的数据 为什么要遍历数据? 一般 ...

  6. 外挂学习之路(6)--- 选怪call

    选怪call就是指鼠标左键点中怪物准备攻击的动作,看别人教程非常容易找,分分钟的事情,自己实践起来还是费了一番功夫,做个总结希望下次再找的话可以更迅速点. 1.      先用CE找到怪物表示,无论是 ...

  7. 外挂学习之路(5)--- 写测试call的注意事项

    找到常量call之后要先找个代码注入工具测试一下是不是想要找的call,一般用CodeinEX这个工具.说下写测试call的时候要注意到的细节,当然在写代码的时候也需要同样的注意. 1.      p ...

  8. 外挂学习之路(4)--- 大海捞针找call call const法

    bp send 找call法相当流行和实用,然而很多游戏都是发包线程和调用线程不在同一个线程里面,从而导致这个方法只能回溯到循环发包里面,无法再向上回溯,而且在这里模拟调用call总是达不到预想效果, ...

  9. 外挂学习之路(3)--- 内存遍历工具

    一旦找到人物血量, 一般来讲这个人物的其他相关属性也在附近,这样遍历内存一个一个枚举和人物的相关属性一一对应就好了.介绍两个常见的内存遍历工具,龙龙内存遍历工具和结构化内存监视器. 利用这个方法可以找 ...

最新文章

  1. 手动删除EXCHANGE2010
  2. ASP网站程序自动升级实现的方法
  3. 矩阵乘法递推的优化艺术
  4. 蓝桥杯2016初赛-网友年龄-枚举
  5. filter动态参数 maven_使用Profile和Resources Filter隔离测试环境
  6. 【Antlr】Antlr 自动错误恢复机制
  7. ubuntu 18.04 conda 环境中编译 pytorch
  8. sql外键需要输入吗_sql_外键(foreignkey)
  9. android 2.3 源码编译,(转)android源码2.3编译——致命错误: bits/predefs.h
  10. 北斗导航 | 基于奇偶矢量法的RAIM算法(附代码)
  11. 简约商务风ppt模板推荐
  12. iOS开发之颜色渐变
  13. java过滤器不管用_java中过滤器不起作用的原因
  14. C语言库函数:memcmp/strcmp和strncmp的区别
  15. 3DMAx Panda Directx Exporter 导出 X插件
  16. Unity3D场景制作基本操作
  17. 处理tree 树状结构,
  18. java mq编程_MQ java 基础编程
  19. MATLAB 像素画绘制APP
  20. always@(*)和assign的区别

热门文章

  1. 课程分类管理-添加课程分类
  2. 数据验证和JSR303
  3. flume的概述和运行机制
  4. 大数据应用项目创新大赛_温州首届大数据应用创新大赛决赛名单公布!有你的单位吗?...
  5. 浅谈稳压二极管的选用和使用条件--摘自:工程师飞燕
  6. Java基础 — 异常
  7. 阿里云云客服平台正式商业化
  8. Saltstack-6:模块
  9. 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用...
  10. Andriod 测试 day1​andriod 工具介绍