好友
阅读权限10
听众
最后登录1970-1-1
|
rlive
发表于 2016-7-24 12:19
本帖最后由 rlive 于 2016-7-24 13:04 编辑
第一次分析游戏,如果有志同道合的朋友,可以一起交流学习,共同进步,PM我!
CE分析的时候,忘记了截图,好在相关代码都复制了。
注意:我已关闭游戏客户端的随机基址,因此,本帖代码中游戏主模块的基址都是400000。
CE分析步骤:
1.切入点:游戏点击小地图,自动寻路开始,并提示自动寻路中
2. 判断游戏中必有标志位,当标志位置位,则开始自动寻路,并在屏幕显示"自动寻路中"提示,当标志位复位,则停止自动寻路,并去除"自动寻路中"的提示
(我自己分析代码可能为
if(flag == true)
{
//自动寻路
})
3.ce反复搜变动,不变的数值,定位标志位
4.定位出数千个,无法再定位了
5.直接在剩余的数千个数据中,定位0和1(不得已而为之,好在也实现了目的)
6.找到数个疑似地址,开始逐个分析
对疑似地址的判断,我是很暴力的,根据call的上下文,要么将其Nop掉观察游戏反应,要么将其内部改写为直接返回,若call本身有返回值供下层调用,我改写时也同样提供返回值并观察游戏反应。
最终确定一个call, 也就是图片中有显示第一层的那部分代码
然后跟进这个call,观察其内部 也就是图片中有显示第二层的那部分代码,在这一层发现有一些意料之中的操作,比如读取当前坐标和目的地坐标的值
然后再进入一层,也就是到第三层,也就是图片中有显示第三层的那部分代码
看的差不多,决定写代码测试此功能:
mov ebp,esp
sub esp,60
mov eax,011e88c4
mov dword ptr[eax],0c2a14fbc //手工放入目标坐标1
mov dword ptr[eax+4],4357082d //手工放入目标坐标2
mov dword ptr[eax+8],420a3e76 //手工放入目标坐标3
mov dword ptr[ebp-14],0 //手工构造1个结构体,赋全0值
mov dword ptr[ebp-10],0
mov dword ptr[ebp-4],0
lea eax,[ebp-14]
push 0
push 1
push 1
push 47ae30d8 //人物基址 == mov eax,dword ptr [11CC74C] mov eax, dword ptr [eax+34] mov eax, dword ptr [eax+90] 最后1个eax就是基址了 这里偷懒直接写的基址
mov dword ptr[esp],0bf800000
push 0
push 1
push 1
push 0
push 0
push eax //一个结构体指针,包含3个成员 初始为空,带入函数 因为原始call的代码中可以看出它就是这么写的
push 1
push eax
mov dword ptr[esp],3dcccccd
push 2
push 1
push 011e88c4 //常量,3个成员,0:0值,1:X值,2:Y值 目标地址的值,调call时填入 也是个结构体
push 6
mov eax, dword ptr [11CC74C]
mov eax, dword ptr [eax+34]
mov eax, dword ptr [eax+90]
mov ecx,eax
mov ebx,008015d0
call ebx
|
|