Home avatar

di da di! di da di!

Maps特征检测对抗

maps文件在Android中一般指/proc/pid/maps,记录着每个进程的内存映射信息,也就是每个进程都会有一个对应的文件。在之前的特征分析中,发现像dobby hook框架、frida等工具都会造成maps中的数据改变,因此想深入分析下这种特征的形成原因以及可以采用什么方式进行对抗

以微信进程为例,看看它的maps文件

Super分区定制

  • 设备:红米note11(MIUI12 Android11)
  • 原生super.img镜像文件,参考下载网站
  • 编译支撑系统:ubuntu14(经测试不受版本影响,正常来说ubuntu都可以安装所有的工具)
  • simg2img
  • lpunpack/lmake
  • imjtool

正常image镜像都是Android sparse image格式的

Riru原理理解

什么是riru?正如它Github上面所提到的那样,它提供的能力是允许模块能够将自己的代码注入到各个App进程或者是system_server进程中,而这一切的实现就是基于它对于zygote进程的注入。

那具体是怎么对于zygote进行注入的呢?文档中也提到,在早期的版本中,riru通过替换libmemtrack.so这个系统库的方式,原因是一方面zygote会加载该系统库,另一方面则是因为这个库足够小,仅仅只有十个函数,也就意味着替换掉它所造成的影响面是很小的,但是后续来看,由于使用到这个so的进程比较多,除了zygote还有SurfaceFlinger(用于显示系统)、mediaserver(用于媒体处理)等等,因此会造成一些意想不到的错误。

Riru MomoHider源码分析

同样的,作为一个riru模块,从该项目的简介中,就可以发现它的主要作用了

Riru - MomoHider (aka IsolatedMagiskHider)

主要针对isolated进程所做的隐藏,MomoHider提供了几个配置选项来从多个角度隐藏MagiskHide,如下

配置项 说明
isolated 对每一个isolated processes卸载magisk相关的文件,但是无法控制卸载时机,可能会导致部分模块无法正常使用
setns 在isolated processes中能够更快隐藏Magisk
app_zygote_magic 让momo无法检测到MagiskHide是运行状态
initrc 隐藏修改init.rc的堆栈

这些配置应该是作者最初的想法,现在某些配置已经无法正常使用了,所以还是从源码中看看现在这个模块具体做了哪些事

Riru Unshare源码分析

在之前的Magisk检测方式的文章中,提到过isolated process的概念,MagiskHide无法处理这种进程,因为它和zygote共同使用同一个namespace,如果对这类进程进行unmount的话,会导致所有app都无法正正常访问到su,对于这种情况,可以使用riru-unshare模块来处理使指定的独立进程不与zygote共享namespace

红米Note11内核编译流程

涉及到需要隐藏设备特征,所以需要编译内核来抹除暴露出的特征。小米内核有现成的源码,可以根据自身设备的型号来选择,下面简单描述下编译流程

  • 设备:红米note11(MIUI12 Android11)
  • 源码:selene版本内核源码

    需要注意的是note11(selenes)是国内的叫法,而国际版对应的是红米10(selene)