新的一年,先祝看雪各位成员新年快乐!另外也要多注意身体和卫生,今年与往年大大不同,这次瘟疫大爆发且气象异常搞得人心不安,不要在这样一个欢喜的节日里把自己交代了。在次也希望武汉能挺过这次大劫,武汉加油!
昨天得到一款PubgLite辅助,然后看到一些好玩的功能就尝试着去分析一下,看看能不能为我所用。分析的第一步,当然是先运行查看效果。由于该辅助会被游戏检测,所以只放一张菜单图。
从左上方的菜单我们可以看到有很多功能,首先透视功能基本就是通用公式算出来的,本文主要注重分析其他功能的一个实现。Tip:该游戏位64位游戏,在启动辅助的时候,会加载一个用于读写的驱动,但是火绒报毒说该驱动存在后门,至于真实性不做考察,大家如果想下载来运行一定要注意。
首先PE工具查壳,显示为无壳且32位程序(本次只采用ida原地手撕,至于为什么不用动态调试有两点:1、该辅助实在太lj,开了直接检测,然后秒封号,根本没法调试。2、有后门)。
知道大概信息后,我们直接打开32位的ida,扔进去加载。
老规矩,直接搜索字符串,因为该程序没有加壳,所以搜索到的东西都是明文。
此时我们可以看到字符串中有VMP保护壳的相关字符串,既然前面查壳的时候是无壳,那么这个保护壳,我估计是给驱动文件加的,并不影响我们的分析。我们看看其他内容。
可以看到一些辅助相关的内容。第一张图片可以看看到游戏进程名和类名,还有一些类似特征码和地址、偏移的东西;第二张图就可以看到辅助菜单的内容。那么我们如何通过这些字符串去分析呢?在这里,我给大家普及一下目前市场上辅助大致的绘制流程。
Emmm,有点丑。。。。这张流程图中间的三个模块是在一个死循环里面的。
1)、第一个模块是用来获取游戏数据的,用来对后面功能作为一个初始化。
2)、第二个模块该项功能是整个辅助的核心部分,里面存在多种算法和数据处理,比如透视常用的矩阵算法或者三角函数算法、自瞄用的角度算法、雷达透视用的朝向算法等等,但是这些算法大多都是已经另外封装,这里面只是对其调用。
3)、第三个模块辅助菜单功能模块,就是用来显示和开关用的,里面通常会通过读取控制某个功能开关的变量来判断是否要打开功能。
上面三个模块执行完后就开始一个新的循环。
以上就是目前市场上辅助的大致绘制流程。我们简单了解之后,思考一下怎么去分析,怎么去下手。在上面字符串中我们已经搜索到了菜单的字符串,那么我们就可以直接通过这个字符串来作为突破口。
我们通过ida的交叉引用和F5功能来到了这里,我们大概看了一下,这里面都是菜单内容,而且最让人注意的是它每个功能都会有一个变量来判断开和关(和我上面所说的流程一致)。
这里的标签是我在分析的是注释的,我们现在只需要注意这个地方。我们把这个段代码拉到顶部,也就是函数头的位置,按下X,看看什么地方有调用这个函数。
发现只有一个地方在调用,那么这个地方只可能在绘制流程内。
我们点击确定进行跳转。
我们可以看到我们来到了一坨函数的调用。那么这个地方,就和我说的流程一样了,只不过该辅助呢分的模块比较多。这里我已经分析完了,所以标签和注释什么的都写的一清二楚。接下来将带领大家来分析,看看如何得到这些东西。
先贴出绘制菜单模块的代码:
我们可以看到,这部分只有绘制菜单的代码,而且每一个子菜单的代码部分都是基本相同。
这部分的if只是用来判断和显示功能是否打开,里面并未存在任何其他代码,说明真正的功能开关在别处,而且在功能开启时菜单的内容也有所改变,所以一定会修改到控制变量。我们直接在控制变量上按下X,看看哪里有对他赋值或者判断。(我这用内存屏息作为例子,因为涉及到透视的功能存在算法会稍微复杂)
我们看到该处有多个交叉引用,我们发现后面三个都是在我们这一个函数内,所以不用看。主要就看前三个,第一个时进行判断,第二第三个存在于同一个函数内,而且时相邻代码,可以知道他这里是修改了该控制变量,我们直接跳过去看看。
我们发现这里面都是对所有功能的控制变量进行一个取反操作。那我们就知道这个函数只用于对控制变量的一个赋值,我们在函数头交叉引用看看。
发现还是来到这个地方,那么我们就已经分析出两个函数了。现在我们返回对控制变量的交叉引用,我们这次看cmp的那个语句。
我们直接跳转到了这里,很显然这里基本上就是对功能的一个开关。他这里判断如果控制变量为=1就执行。其实这里如果对易语言熟悉的人,脑海中基本可以浮现出这一段所对应易语言代码。
他首先是对14D8这样一个临时进行一个十六进制到十进制的转换,然后对其临时字符串释放(这个也是我在本次逆向分析的时候学到的)。其实他这一句,可能就对应着易语言的进制_十六到十()的这个命令。继续转换之后就开始地址之间的加法,这里也要注意的是,由于程序位32位,游戏为64位,所以指针大小也不同(32位4字节,64位8字节)。Ida这里直接用double计算(一个double 8字节),然后再转为int64也是我这次学到的。最后进行读写操作。这里他是驱动读写,并且在分析的时候发现如果是+44(十进制)那么就为读操作,如果是+64(十进制)就为写操作。大概了解之后,这个函数的代码基本就可以阅读完了。都是对地址+偏移后读,然后再内容。这里就顺便看一下他的屏息如何实现的。
首先是获取一个对象地址,然后让该地址+0x14d8第一层,再加上0x458得到目标地址,最后对该地址写入0就实现了屏息。其他功能都是一样的,现在我们返回函数头部按下X跳出去看看。
我们来到这,发现他来源另一个值,我们看看另一个值怎么来。
我们发现它来源于V5,而v5又是读一个值得到的,那么再往上看,就会发现这里其实就是再遍历对象数组。
64位一个地址相差刚刚好是0x8。知道这个后,这一段的代码其实已经很清晰,首先去遍历对象数组,然后去判断血量是否>0和<=100,成立的话就是继续判断是否为本人或者敌人,再成立的话,就进行一个本人对象的赋值和读取对象坐标。这里贴分析后注释的代码。
这里只分析了本人,敌人的也一样而且敌人还额外去读取了一些值估计是其他的属性,这里就不列出来分析。现在按照同样的操作,函数头交叉引用返回出去。
依旧是熟悉的地方。那么接下来我们就来分析一下,它的对象数组怎么来的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课