某pubgm辅助原理简单分析
本帖最后由 korzhao 于 2019-1-2 21:52 编辑第一步查看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
罗氏家族 发表于 2019-1-3 19:48
已知软件是根据tcp协议通信获取进入界面,而界面又受到DRM版本保护,问:在这种情况下怎么破解!(10分)
我尝试着按楼主的方式走到了一半就无法进行了。也不知道有人破解成功的嘛 嗯,用golang写了个TCP agent注入目标进程代{过}{滤}理操作,确实是个不错的主意,golang确实很好用这垮平台上,而且可以隔离代码逻辑的更新。非常好。就是这样就没法直接逆向外挂了哈哈 是鸡腿吗{:1_886:} 我还以为是exe的程序... 谢谢分享 谢谢分享 看的不是很明白。 膜拜大佬 看不太懂,不过还是感谢分享 还以为是exe的程序...{:1_908:} 不明觉厉,鞋鞋分享,马着以后学习