首页
社区
课程
招聘
[原创]浅析找基址原理
发表于: 2017-5-1 15:18 5795

[原创]浅析找基址原理

2017-5-1 15:18
5795

现在很多视频都是只是讲如何找基址,而没有说为什么要这样找,所以我来说一下自己的见解。

本小菜第一次发帖,欢迎指正,勿喷

 

 

首先讲讲视频里找基址的套路:

1.       找出某个属性的地址

2.       查看是什么地址访问或写入该地址

3.       找到类似mov [eax+110],ebx这样的指令,然后继续搜索eax的值

4.       又找到类似mov ecx,[esi+120]这样的指令,然后步骤1的属性地址可表示为[esi+120]+110,继续搜索esi的值

5.       直到最后找到类似mov [0x00410086],119,这个地址就能表示为[[[[0x00410086]+…]+…]+120]+110

 

其中这样找的理由就是一般在游戏里某个属性位于某个结构或者类里。

比如这里有n个怪,我找到了其中一个怪的血量,然后怪物的结构定义为:

class monster

{

private:

         ….

         int hp;//怪物血量 +10

         int mp; //+14

….

} ;

然后这个血量的地址在汇编里就表示为esi+10,esi就是这个怪物的对象。

但是一个怪物对象不可能只是单单在这里,不好管理,需要有内存存储,所以第三步搜索eax的值就是寻找哪个内存存储这个地址。

这里我假设有n个怪物,游戏可能会把这n个怪物对象地址放在一个数组里,然后这个esi就表示为mov esi,[ebx+4*eax] 现在血量地址可表示为[ebx+4*eax]+10. ebx为数组首地址,eax为数组下标。

假设游戏里还有很多数组为了方便管理定义一个全局类,实例化一个全局对象,里面保存很多全局配置和一些数组的地址等,定义如下:

class  global

{

private:

         ….

         int width;//+4
         int height;//+8

         ….

         int * monsterlist;//怪物数组+4EC

         int *playerlist;//+4F0

        

….

} ;

global *G=new global();//这时候定义了一个全局对象,全局变量或者静态变量一般就为[0x00410086]这样的形式

         最后血量的地址就表示为 [[0x00410086] +4*eax]+10

 

 

PS:

1.为什么有时候得到[eax+10]搜索找不到eax的值,因为有时候eax的来源是

monster monsterlist[100];//sizeof(monster)=0x100,lea eax,[ebx+100*ecx],ebx为数组首地址,ecx为下标,所以根本没有内存存储这个地址

2.有时候最终地址就是局部变量怎么办?用HOOK得到地址



[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 990
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  看了楼主的说法有了一定的理解,以前只知道How  to  do  ,现在略微感觉到了Why  to  do  .  谢谢
2017-5-2 12:24
0
雪    币: 12876
活跃值: (9352)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3

你是没有见过那种把数值都加密的游戏

使用之前先g_player_health->decode()才能取到。

内存里想搜到真实数值?不存在的

2017-5-2 12:56
0
雪    币: 230
活跃值: (137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
赞同楼上的说法,内存与UI显示的数值要不一致,关键内存要加密
2017-5-5 23:06
0
雪    币: 263
活跃值: (122)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5

dalao们说的都对。加密的话,UI要显示,可能会有一个地址存储这个解密后的值,然后顺着这个地址分析解密函数找到真正的来源。或者就算是内存加密,值要改变还是要改变的,通过变化找出加密后的地址,跟踪他是如何解密的?dalao们有什么好方法吗?

2017-5-6 08:19
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ccj
6
内存中加密,还是会被找到,不过是增加了门槛而已,现在做个新游戏都要加班加点的,不会去做这样的功能了。
2017-5-6 09:39
0
雪    币: 12876
活跃值: (9352)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
Zn风扇 dalao们说的都对。加密的话,UI要显示,可能会有一个地址存储这个解密后的值,然后顺着这个地址分析解密函数找到真正的来源。或者就算是内存加密,值要改变还是要 ...
加密的一般都是从UI  一路ida撸回去的
2017-5-6 10:41
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
直接从UI上读,不关心真正的基址,只要读数就行了。
2017-5-6 16:32
0
雪    币: 263
活跃值: (122)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
。。。可以,很强
2017-5-7 09:31
0
游客
登录 | 注册 方可回帖
返回