korzhao 发表于 2019-1-2 21:47

某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-12-24 14:54

罗氏家族 发表于 2019-1-3 19:48
已知软件是根据tcp协议通信获取进入界面,而界面又受到DRM版本保护,问:在这种情况下怎么破解!(10分)

我尝试着按楼主的方式走到了一半就无法进行了。也不知道有人破解成功的嘛

6767 发表于 2019-1-14 10:30

嗯,用golang写了个TCP agent注入目标进程代{过}{滤}理操作,确实是个不错的主意,golang确实很好用这垮平台上,而且可以隔离代码逻辑的更新。非常好。就是这样就没法直接逆向外挂了哈哈

ertcm 发表于 2019-1-2 22:18

是鸡腿吗{:1_886:}

Angle丶dianfeng 发表于 2019-1-2 22:22

我还以为是exe的程序...

ChenBeiXuan 发表于 2019-1-2 22:22

谢谢分享

eoo 发表于 2019-1-2 22:26

谢谢分享

linuxprobe 发表于 2019-1-2 22:30

看的不是很明白。

lsz520 发表于 2019-1-2 23:13

膜拜大佬

沐柒乀 发表于 2019-1-3 00:04

看不太懂,不过还是感谢分享

qyzseven 发表于 2019-1-3 00:06

还以为是exe的程序...{:1_908:}

疯啊疯灯 发表于 2019-1-3 01:14

不明觉厉,鞋鞋分享,马着以后学习
页: [1] 2 3 4 5 6 7
查看完整版本: 某pubgm辅助原理简单分析