2019年3月8日星期五

Android 某pubgm辅助原理简单分析

第一步查看apk信息
拖进jdex,apk处理的比较简单,没发现有什么加密和加壳
 


奇怪的是里面并没有lib文件,猜测可能是打开软件才会下载。
安装好软件,发现的确需要下载一些东西。二话不说,先卸载apk
配置好fiddler之后,再次打开辅助,抓到了一个请求。
下载到本地的是一个名字叫pg_x86的文件(我是模拟器环境,试着改url为pg_arm,也可以下载文件)
原以为是一个so文件,拖到IDA之后,发现是一个upx加壳后的程序。
github(https://github.com/upx/upx)下载最新版本的upx程序,先解压下

解压之后,再次拖进ida

第二步,处理下载后的文件

 



发现是一个可执行程序,并不是一个so文件。而且函数名字也不能正常解析,全部是sub命名,刚开始以为是做了混淆
 
shift+f12先看下字符串里有什么。
 
发现了很多runtime.的字符串在gopclntab段
恍然大悟,这个可执行程序是go写的。
go语言目前可以跨ios/android平台,而且对x86和arm都能支持到。

go语言在ida下面的分析,先要解决符号问题,不然函数没办法展示
github ida插件(https://github.com/sibears/IDAGolangHelper)
alt+f7打开插件后,选rename functions
 
go程序有个特点,底层会给每个函数前面加上包名,
所以在main包下的函数,都是加main前缀的。直接搜main关键字,看到了一堆函数

 

第三步,分析原理

pubgm基于ue4
一般,world, level等基址都是 作为常量写到程序里的,这里我们不做研究,
我们主要分析 这款辅助 是怎样跨进程 读写内存的

看到有一个函数叫ain__ptr_gameMem_GetGamePointer,进去F5看下代码
 


这个函数会调用main_rpm,我们继续跟进,
到了main_rpm这里,发现它调用了一个syscall_Syscall6。和之前讲到的一样,go语言函数前面的部分是包名,后面的是函数名(所以go官方不建议开发使用 _)
那么这个函数就是syscall包下的Syscall6

 
这里go语言的syscall 和 c语言syscall 一致
函数的第一个参数是命令字,这款辅助读内存用到的347号命令字是什么意思呢?
我们登陆一台linux主机,查找下syscall 347号命令字


在/usr/include//asm/unistd_32.h 里面,我们发现了347 对应的调用是__NR_process_vm_readv
 
百度下process_vm_readv,这里是它的介绍

 
后面,继续看了下其他函数,发现它和apk进程通信的方式基于tcp
go程序会创建套接字来和apk程序通信

附上apk程序 和 原始go二进制程序
链接:https://share.weiyun.com/5AZxzAf 密码:3mce7z

没有评论:

发表评论