好友
阅读权限 10
听众
最后登录 1970-1-1
本帖最后由 御坂00001号 于 2020-4-16 17:17 编辑
导言
直入主题,通过找转化CALL谈一些找CALL技巧@永恒岁月
工具准备
[Asm] 纯文本查看 复制代码
内存工具:CE7.0
游戏本体:AOE II:HD 过程分析
分两步,第一步根据游戏内某动作进行逻辑分析,第二步根据逻辑分析进行CE分析
# 逻辑分析
任务:主要是根据游戏动作与CALL的相关性(这一点可以在CE中的Ultimap功能展现) ,通过拆分游戏动作步骤而找出直接或间接相关数据 ,从而可以利用CE进行分析
对AOE II:HD的逻辑分析
首先,在游戏中执行僧侣施放转化这个技能的完整动作,通过分析,可以得出一个相近的逻辑过程 :选中某僧侣 -> 选中转化技能 -> 选中某敌人 -> 检查转化条件 -> 吟唱过程 -> 吟唱(转化)完成 -> 信念值减少
其次,对这些步骤进行分析 ,找出蕴含的直接或间接相关的数据,比如选中某敌人,可能选中ID(某敌人数据结构的标识)这个数据会改变,也可能选中地址(某敌人数据结构的基址)也会改变,甚至选中/未选中这个标识(某敌人数据结构的状态)也会改变
最后,开始对目标CALL进行正向(找前一个CALL)或逆向(找后一个CALL)的筛选(见总结更详细分析原因) ,这里我们找的是转化CALL(即要对转化完成过程进行分析),就可以正向对吟唱过程进行分析,或者逆向对信念值减少过程进行分 析,当然也可以直接对 转化完成过程进行分析,这里对转化完成过程分析并假设敌我存在某种标识来决定转化完成,敌人可以加入我方,所以只需要根据这种标识变化,进程CE分析并找到关键代码
# CE分析
任务:主要是根据逻辑分析阶段找出的相关数据,通过CE工具来查找并找出关键代码,再通过关键代码找出关键CALL
对AOE II:HD的CE分析
第一步,通过查找某敌人血量,来找到某敌人结构的动态内存区域,这里血量偏移是esi+30,esi即为某敌人结构的基址 - 附加说明:这里所说的基址是相对于动态内存块的开始地址,一般是相对于结构而言,比如人物结构,它包含+4处的ID,+30处的血量等
第二步,通过执行转化动作并监视某敌人结构的动态内存区域,可以看到esi+8处8字节数据发生改变,再找到另一敌人结构的动态内存区域,把esi+8处的8字节数据复制到被转化敌人结构的esi+8处,可以发现esi+8即为某敌人结构的敌我标识
第三步,通过执行转化动作并查找什么改变了esi+8处的值,可以得到关键代码 - 附加说明:我只对esi+0c处进行了分析,发现结果符合,如有兴趣,可以对esi+08进行分析
第四步,现在开始使用“向上跟踪法”(见我另一篇贴: 向上跟踪法 )找关键赋值代码,可以得到关键数据来源这个CALL(函数)的第一个参数
这里esp(即栈顶)往低地址移动共5个位+1个位(eip),而esp+18表示第7个位,所以可以获得此CALL存在一个传入参数
第五步,知道关键数据是CALL前push的参数后,我们返回这个CALL,来到调用CALL的层,可以看到CALL前明显的push,对它进行下断点分析,可以分别得到参数含义,这时转化CALL初步找到 - 附加说明:这里ecx通过与找edi来源时一起分析
第六步,转化CALL找到了,但是这还只是程序的代码段,而我们需要把它变成我们的代码段并对它进行一些操控,因此这里我们需要分析参数的指针来源 - 附加说明:这里主要对ecx指针来源进行分析,其它参数不变
通过对ecx找指针(直接搜索ecx值并选择第1个找什么读取了它),可以发现代码 mov eax,[ecx+edx*4] 中的edx的值类似人物ID,因此我们需要继续找选择ID指针(怎么找?每次选择一个敌人施法技能,选择ID就会改变)
第七步,这样我们就可以控制人物的敌我标识了,脚本如下[Asm] 纯文本查看 复制代码
[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
// 首先得到目标ID指针
push edi
push ebx
mov edi,["AoK HD.exe"+527378]
mov edi,[edi+70]
mov edi,[edi+34]
// 其次得到基址指针
mov ebx,["AoK HD.exe"+5264DC]
mov ebx,[ebx+edi*4]
// 最后赋给ecx
mov ecx,ebx
mov eax,[esi+08]
mov eax,[eax+0C]
mov edx,[edx+4C]
pop ebx
pop edi
push eax
call edx
jmp "AoK HD.exe"+1413B
originalcode:
//mov eax,[esi+08]
//mov eax,[eax+0C]
jmp newmem
exit:
jmp returnhere
"AoK HD.exe"+1412F:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"AoK HD.exe"+1412F:
mov eax,[esi+08]
mov eax,[eax+0C]
mov edx,[edx+4C]
push eax
call edx
//Alt: db 8B 46 08 8B 40 0C
总结
# 对找CALL的理解
找CALL的本质还是归根于 游戏动作与CALL的相关性 ,这里前面已经说过,CE中Ultimap就是一个典型,但Ultimap功能有限很多游戏不能附加,所以还是得回归CE工具的本质-数据分析
因此,我们在游戏动作与CALL之间,通过数据分析来连接它们。这里 分析游戏中转化技能得施放动作 ,可以得到相关数据,接着 通过分析相关数据 ,可以得到关键CALL
# 对找CALL的方法总结
方法无非两种,一种是找直接变化的数据,这个类似找什么写入(我称之为主相关);另一种是找间接访问的数据,类似找什么访问(我称之为副相关)
我们对逻辑过程:[选中某僧侣 -> 选中转化技能 -> 选中某敌人 -> 检查转化条件 -> 吟唱过程 -> 吟唱(转化)完成 -> 信念值减少]进行分析
1. 主相关举例
过程:此篇找转化CALL就是如此,先找敌我标识,然后得到关键代码,接着得到关键CALL,最后转化为可控制脚本
说明:这里转化结束会修改敌我标识
2. 副相关举例
过程:先找到信念值数据,然后在信念值未满的情况,使用技能,这时我们可以得到检查条件的关键代码,继续顺藤摸瓜,可以找到其他检查条件:科技树检查、英雄检查、转化检查等
说明:这里检查条件的关键代码会访问信念值,只有当信念值 >= 100才能成功
# 对正推与逆推的筛选的说明
正推:一般是分析所找CALL的步骤的前一步骤,当然实在无奈再前一步骤也行
逆推:一般是分析所找CALL的步骤的后一步骤,当然实在无奈再后一步骤也许
适用情况:正推、逆推都是在当对所找CALL无头绪时,对前后步骤分析,可以向所找CALL逼近,而且对无参CALL(全局参数传入情况)特别有效,且对无知有参CALL(对参数不明的情况)也有效
# 对数据的捕捉总结
我把它分为两种:动态数据以及固定数据。 动态数据是随游戏某动作而改变的,而固定数据从游戏加载就不会发生改变(这里与静态数据不同),但是它会被访问(不被访问就是“废数据”了)
动态数据常见有
1. 开关式(比如选中/未选中),一般搜0/1
2. 数值式(常见的),按数据类型搜
3. 循环式(在某个自定义范围内增减,而不是数据类型的范围内),只能搜变化数值
4. 特殊式(在几个特殊值之间来回变化),对于有规律情况可以搜增减,对于极端情况只能搜变化数值
5. 共有指针(点击不同的人物出现不同的值,包括各级指针值),这个暂时没有好的办法去寻找
6. 相关式(比如:植物大战僵尸的香蒲攻击方式,先遍历,再获取坐标,最后子弹跟踪。这个时候只改子弹跟踪的跳是会崩的),需要找到全部相关值并一起修改
其它待补充......
固定数据常见有
1. 初始化值,比如植物大战僵尸的植物攻击力/攻击间隔/攻击范围等,固定数据的修改只能依赖与它相关的动态数据,并找到它的初始化关键代码
2. 独有指针,比如根据某个动态数据独有的关键代码,找到的指针,它的各级指针是不会变化的(也存在某级指针存在几个值得情况)
3. 静态区域,比如基址的存放处,全局变量的存放处等,可以被间接访问
其它待补充......
以上说明只是某种做法,可以随不同情况而变,但其本质不变......
End
有问题的欢迎在帖子下留言,我会找时间帮助解答;也欢迎其它交流
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。