主要内容:定位植物大战僵尸游戏中阳光数据的全局地址;
介绍:学习windows逆向分析的简单例子之一,主要使用ce以及od工具;
1,结论
|
反推可知,包含阳光数据的结构体基地址: 0x006A9EC0 |
2,逆向分析过程(使用ce工具)
2.1,ce工具以及使用方法
|
ce工具: Cheat Engine 6.6 +中文***
|
2.2分析过程
(1)
|
由2.1可知,现在的阳光数据是放在15D97218,难道这个含阳光数据的地址? 由od工具可知,内存结构,15D97218应该是个堆地址,这个地址是动态申请,所以不可能是基地址; 正常猜测基地址应该是在00699000~0075E000全局地址; |
(2)分析地址15D97218
|
既然这个地址是个堆地址,猜测阳光的数据是new出来的,然后给一个全局地址保存,不给全局变量保存,很难全局访问,除非都是靠传参; int sun; g_sun = new int
(2.1)分析地址方法1:此时想到搜索这个地址,有没有全局数据来保存,或者保存这个15D97218的地址有没有提供其他信息: 好像没有,这里的地址不是很靠谱;
(2.2)分析地址方法2:另一种思路是查询一下,有没有谁在访问/写入这个15D97218地址: 发现有两个地方经常访问地址15D97218,也就是经常把阳光的值[15D97218]给其他地方使用; 这里注意到:[esi+00005560] == [15D91CB8+00005560] == [15D97218] ==阳光的数量; 15D91CB8可认为是一个结构体基地址;
可以想象这是个结构体: Struct sun Sun { ... [+00005560] == 阳光 ... } StructSun sun g_sun = new StructSun
|
(3)继续搜索查询15D91CB8
|
(3.1)分析地址方法1:此时想到搜索这个地址,有没有全局数据来保存,或者保存这个15D91CB8的地址有没有提供其他信息: 1>分析全局地址 首先看这两个全局地址,貌似很有可能是存储结构体的全局地址,但是经个人分析,这两个地址每次启动游戏后保存的数据都不是结构体基地址; 2>分析18984c 3>分析23AA4F0 发现在访问这个23AA4F0地址时,有一个[eax+00000768], EAX=023A9D88; [23AA4F0] ==[023A9D88+00000768] ==15D91CB8 阳光数量= [15D97218] == [15D91CB8+00005560] == [[023A9D88+00000768]+00005560] 现在重点搜索查看地址023A9D88;
(3.2)分析地址方法2:另一种思路是查询一下,有没有谁在访问/写入这个15D91CB8地址: |
(4)继续搜索查询023A9D88
|
(4.1)分析地址方法1:此时想到搜索这个地址,有没有全局数据来保存,或者保存这个023A9D88的地址有没有提供其他信息: 1>分析全局地址006A9EC0 发现这个:006A9EC0 == PlantsVsZombies.exe+2A9EC0 PlantsVsZombies.exe == 006A9EC0 - 2A9EC0 =00400000(PlantsVsZombies.exe模块首地址) 有点类似:进程主模块首地址+一个偏移 =006A9EC0; 这个全局变量地址一直不变,所以需要查找的全局地址应该就是006A9EC0了;
结构体公式: 阳光数量= [15D97218] == [15D91CB8+00005560] == [[[PlantsVsZombies.exe+2A9EC0]+00000768]+00005560] == [[[006A9EC0]+00000768]+00005560]
|
(5)验证
|
[[[006A9EC0]+00000768]+00005560] == [ [023a9D88 +00000768]+00005560] == [ [23AA4F0] +00005560] == [ 15d91cb8+00005560] ==[15D97218] ==0x96==150 正确;
验证2:重新打开游戏,按照006A9EC0这个地址来找 [[[006A9EC0]+00000768]+00005560] ==[ [00839d90 +00000768]+00005560] ==[ [83A4F8]+00005560] ==[ 15D84920+00005560] ==[15D89E80] ==0X0190 = 400 正确;
总结: 006A9EC0 |