字库?不不,我有更好的选择----内存
- 您所在的用户组无法下载或查看附件
说你是否还在为字库的制作如此繁琐而烦恼,是否还在思索如何提高字库识别的效率,恩。。。这个可以通过控制搜索范围来提高哦,咳咳咳,其实我今天想说的是,我们直接用内存命令来解决这个问题吧。
- 您所在的用户组无法下载或查看附件
一、原理及思路(长篇大论~我也不想滴~orz)
在游戏中,我们看到酷炫的界面,精美的原画等等等等,都是经过运算后从内存中取出来的,因此,我们可以在内存中就获取到屏幕上所显示的内容,需要做的就是从茫茫多的内存数据中取出我们需要的数据做处理。
如此多的数据(几十至几百兆大小),不经过过滤的话基本上没有找出的可能性,因此我们需要过滤的条件。
首先我们需要了解一部分游戏制作的知识,游戏中的数据存放,肯定也是有规律的(程序猿们也要自己写的清楚明白不是?),或许是一个数据结构,或者是一个类,因此,我们可以依赖游戏中所显示的内容,作为我们查找的依据。
就从最简单的地方开始,我们知道的,游戏中肯定存在具体化的数值,可能是等级,可能是金币数,从这些可见的地方开始,肯定能拿到我们想要的东西----在内存中的位置,也叫地址:
- 您所在的用户组无法下载或查看附件
那么我们拿到这个地址能够直接使用吗?答案是否定的,安卓是跑在虚拟机上的,我们每次打开应用,系统分配的内存地址块都是不同的,我们两个打开应用得到的地址都不会是一样的。然后我们又想到,我们既然是根据等级金币等数据来获取内容,那么每个号的这些数据都不会是完全一样的,甚至来说是都不一样的。那么两个都无法确定的东西,我们要来干嘛?丢弃之。
咳咳,别打,先看个教程冷静一下:[按键精灵手机版2.5基础教程] 4.图色操作http://bbs.anjian.com/showtopic-585878-1.aspx。
好吧,我就是在打广告,但我肯定不会做这么单纯的事情,我们从这篇教程中看到了多点找色,也就是FindMultiColor这个命令,他用到了一个很好理解的东东----相对偏移,那么内存中是否也存在这样的关系,我们这么理解,有两个账号:
等级:20
等级:30
这两个号虽然等级不一样,但是他们的描述是一样的啊,我们是否可以去获取“等级:”的位置,在根据他们的偏移,来得到想要得到的等级呢?
实践是检验真理的唯一标准,我们立马尝试。。。。请看第二个步骤。二、具体操作步骤
下面以搜索游戏<武林萌主>的数据作为例子(搜索借助内存修改器):
1.打开游戏之后,点进人物详情页
- 您所在的用户组无法下载或查看附件
2.从人物详情中取出我们看到的数据,这边使用经验值作为搜索依据,打开内存修改器,我这边使用烧饼修改器联合搜索图中的数据,比如395和1118(经验值)
- 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
搜索到两对数据, 一般游戏内的相邻数据间隔是4,因此3和4这一对才是正确的地址(当然你可以两个都改改看就知道哪一组是对的~)
3.得到地址后,长按上图的第三条数据,点击查看附近内存:
- 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
4.接下来,我们就尝试在这个地址的附近找到可以用来定位的数据。(这里有个技巧,我们可以双开模拟器,在两个模拟器中打开不一样的账号,同时搜索同时滑动同样的距离)
- 您所在的用户组无法下载或查看附件
我们在经验值附近发现一个这样的数据(图中的5390),每个账号偏移相同的量的地方都是这个数据,于是我们的搜索定位用的数据就确定是这个数据了。
5.我们需要再次确认搜索用的数据,一个数据的搜索会有多个地址, 因此需要继续搜索这个数据附近的值,我们在这个5390附近发现了一个也是固定的数值,他和5389的偏移是24。
- 您所在的用户组无法下载或查看附件
6.至此,数据定位完毕,我们先到测试一下:
- 您所在的用户组无法下载或查看附件
图中冒号后的24就是数据间的偏移为24,点击搜索,能得到唯一的一对数据说明根据固定数值定位基址成功。
- 您所在的用户组无法下载或查看附件
OK,和预想的一致。三、代码实现
- Dim 当前应用包名
- 当前应用包名 = sys.GetFront()
- TracePrint 当前应用包名
- Dim addr = "0x0"
- Dim tb1 = {"lv":5389} //第一个数据(第二个步骤中定位的地址)
- Dim tb2 = {"lv":5390,"offset":24} //第二个数据,以及他相对于第一个数据的偏移(第二个步骤中定位的地址)
- //没错,如此漫长的定位,实际上就是为上面的两个table(T_T)
- Dim tb = {tb1, tb2}
- Dim t = TickCount()
- Dim A = Sys.MemorySearch(当前应用包名, True,addr, tb, "i32",0,1) //参数为包名,是否从上次结果中继续搜索(无上次搜索则开始新的搜索),地址起点,数据,数据类型,搜索模式(0为完整搜索),搜索数据条数 返回值为一个数组
- //内存命令暂时只支持4.4及以下的android系统
- TracePrint "搜索地址为:"&A(0)&",耗时"&(TickCount()-t) //A(0)为搜索到的第一个地址
- Dim 等级地址 = 地址相加(A(0), 116) //进行地址偏移(偏移116为等级地址)
- TracePrint "偏移后得到等级地址"&等级地址
- Dim t1 = TickCount()
- TracePrint "当前等级为:"&Sys.MemoryRead(当前应用包名,等级地址, "i32") //读取地址的值
- TracePrint "读地址耗时"&(TickCount()-t1)
- Function 地址相加(地址, 偏移) //简单封装一下偏移的函数
- Dim A = Right(地址,Len(地址)-2)
- Dim B = Clng("0x"&A)
- TracePrint B
- Dim C = B+偏移
- Dim D = Hex(C)
- Dim E = "0x"&D
- 地址相加 = E
- End Function
复制代码游戏下载地址
想知道更多吗?请继续偷偷关注13(T_T)
- 您所在的用户组无法下载或查看附件
(微信扫一扫,加关注按键精灵公众号)