从tg上扒了几个某四字游戏的外挂样本进行分析,不限于公益,付费,以下分析仅针对外挂样本原理探究不涉及真实游戏内存数据
不同的样本具有不同程度的混淆,这里简单的基于微码去掉太复杂的icall选择trace。样本运行后会在屏幕上绘制敌方玩家位置。
样本提供了多种跨进程读取方案
系统调用syscall
内核方案,ko内核和KPM内核
ko内核提供了多个版本,使用sh脚本一键安装,ko模块内嵌在sh脚本中
对这个驱动进行分析:
通讯功能如下
读写实现
缺页处理方面:它会检测无效 PTE/PFN,但不会主动触发缺页,也不会换入 swapped-out 页面。目标页面不驻留时直接失败。页表遍历还硬编码了 30/21/12 位移,因此实际只适合 4 KB 页内核
30/21/12
模块地址查询
它遍历目标进程 VMA,通过 d_path() 获取映射路径并进行子串匹配:
d_path()
断链隐藏自身驱动模块
其实这些内核模块功能类似,安卓上也不太能对内核做保护,没啥可分析的,也不知道为啥外挂作者喜欢赛一堆垃圾内核模块给用户。哦,可能和大部分安卓外挂作者自身水平有关,记得之前分析某外挂样本,什么云驱动内核,我还以为是什么东西以为和win一样壳加载云下发,结果是syscall vm_read ....
KPM则是使用杂鱼面具或者apatch加载
内核通讯方案,hook某个系统调用做后门和之前分析的差不多,反正安卓没PG随便hook
使用了imgui库底层使用的Vulkan 不是 OpenGL ES 看来外挂也在与时俱进, 创建独立 Surface 图层,以及把世界坐标投影后提交到屏幕 。 把图层放到游戏上方 ,并设置穿透属性不影响玩家正常触摸与游戏交互
f6aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3N6Y4m8Q4x3X3g2I4M7g2)9J5k6h3y4G2L8g2)9J5c8Y4N6W2j5U0t1H3x3e0j5H3y4g2)9J5c8X3A6K6i4K6u0r3K9r3g2J5L8$3I4A6M7%4c8Q4x3X3g2B7M7$3!0F1 下载英雄资料:
引流QQ 群:群号:打码
wy.llua.cn:80 使用的网络验证域名
wy.llua.cn:80
英雄详细资料页面按以下形式构造: d54K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3N6Y4m8Q4x3X3g2I4M7g2)9J5k6h3y4G2L8g2)9J5c8Y4N6W2j5U0t1H3x3e0j5H3y4g2)9J5c8X3S2W2M7X3!0V1k6i4c8S2K9h3I4Q4x3V1k6E0i4K6u0r3i4K6N6n7英雄ID或ename}.html
例如程序会把详情页面缓存成: /data/adb/yaziduck_icons/skill/hero_detail_{英雄ID}.html
英雄/皮肤头像资源按代码实际构造为: a14K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4j5h3#2W2i4K6u0W2k6%4c8A6L8h3N6Q4x3X3g2U0L8W2)9J5c8X3W2E0j5h3N6W2M7#2)9J5c8Y4W2^5P5X3A6Q4x3V1k6A6L8h3M7J5x3o6p5$3x3o6k6Q4x3V1k6Z5k6i4u0G2K9h3#2Y4i4K6u0r3i4K6N6n7英雄ID}/{皮肤资源ID}.png这里下载资源为了绘制后能显示对应的信息
该游戏在触发某些风控后会下发匿名内存shellcode对关键数据进行加密,很多样本对下发函数进行hook ret(那实在是太没技术了不如直接直装重打包),也有使用hook拿到解密后的数据,不过比较有含金量的是纯算法解密不动内存。下面讲解这个样本的模拟执行对抗
缺页反模拟执行Unicorn 只能访问已经通过 uc_mem_map() 建立的 Guest 地址。解密函数一旦跟随某个指针访问其他对象,就会产生:
uc_mem_map()
该样本使用UC_HOOK_MEM_UNMAPPED,缺页时执行:
Unicorn 是用户态 CPU 模拟器,没有 Android 内核。执行 SVC #0 时不能直接完成系统调用,只会触发 UC_HOOK_INTR,所以在shellcode中掺杂系统调用来干扰模拟执行
SVC #0
UC_HOOK_INTR
该样本解法:
捕获 Guest 的 SVC #0
Unicorn 产生中断,读取:
Guest 的 X0 是游戏进程中的 FD,不能被当前样本直接使用 要复制过来
在宿主执行真实 ioctl
将驱动输出复制回 Guest , 设置返回值并越过 SVC
最终流程:
游戏核心解密依赖于线程上线文环境
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!