hluda已经过不了某些加固了,总结一下加固中遇到的反调试、模拟器检测、xposed 家族检测和 frida 检测,最后给出绕过frida检测的方法

反调试总结


  • 打开 /proc/self/status ,拿到 TracerPid 的值,不是0就检测出被调试
  • 从 libart.so 找到 _ZN3art3Dbg8GoActiveEv_ZN3art3Dbg12DdmConnectedEv ,如果是 libdvm.so ,则找到 dvmDbgActive ,hook 它们在入口处调用 exit 的 syscall
  • 读取 /proc/self/wchan ,返回的字符串不是 sys_epoll_wait 就检测出被调试
  • jni 调用 android/os/Debug 的 isDebuggerConnected

虚拟机检测


  • 调用 access 检查 /dev/qemu_pipe/dev/socket/qemud 文件是否存在,注意这个 access 是系统调用

  • 读取 /proc/tty/drivers ,检查是否有名为 goldfish 的 tty 设备

  • 使用 system_property_get 获取 persist.nox.devicepersist.nox.baseband 的值,这个是检查夜神模拟器

  • 读取 init.svc.qemud

  • 读取 /proc/self/maps 匹配特征,检测 va ,匹配 io.va.exposedio.virtualapp.sandvxposed

magisk检测


  • 调用 access 检查 /sbin/.magisk/system/bin/magisk/data/data/com.topjohnwu.magisk 文件是否存在

  • 读取 /proc/self/maps ,根据内存属性和权限过滤出目标内存段,然后在这些内存段中做逐字节的内存搜索,对于32位匹配 /.magisk 字符串,对于64位匹配 MAGISK_INJ_ 字符串

xposed家族检测


  • 读取 /proc/self/maps ,遍历读出来的每一列,匹配特征 xposed.installerapp_process_xposed,注意这个 strstr 是壳自己实现的

  • 读取 /proc/self/maps,匹配特征 libriru_/data/misc/edxp_libxposed_art.solibriruloader.soapp_process_zposed




  • 读取 /proc/self/maps ,找到权限为 “r-xp” ,内存大于8192字节的的段,然后对该段做内存搜索匹配字符串 liblspd.solibriru_edxp.so


    而且如果内存段映射路径有以下特征就 pass 掉,不检查

  • 调用 system_property_get 读取 ro.dalvik.vm.native.bridge ,riru 开启时会将这个属性设置为注入 so 的路径

  • 调用 access 查找 /system/lib/libriruloader.so

脱壳机检测


  • /proc/self/maps 匹配特征,查找 top.niunaijun.blackdexxposed.Fdex2mapp.rm-/FunDex/lib/com.example.FunDex-/data/local/tmp/libFupk3.so



  • 反 dexhunter,hook dexReadClassDataDumpClass 等函数

    以及反 fupk,也是 hook fupkInvokeMethod 这些特征函数,不细说。

  • 调用 access 检测 /data/dexname 文件,这个是 dexhunter 的特征

  • 调用 FindClass 查找 cn/youlor/Unpacker 类,这是 youpk 的特征

  • 使用 dlsym 查找 libart 的符号,寻找 Unpacker::dumpAllDexesAupk::aupkArtMethodmyfartInvoke


  • 调用 access 检测 /data/local/tmp/ 下有没有 unpacker.configaupk.config ,前者是 youpk 的配置文件,后者是 aupk 的配置文件,以及检查 fart 工作目录 /data/fart

frida检测


  • /proc/self/maps 匹配特征,查找 /data/local/tmp/re.frida.server/data/local/

  • 同样是读取 /proc/self/maps 做内存搜索,找到权限为 “r-xp” ,内存大于 8192 字节的的段,这个其实是 frida 注入到目标进程的 frida-agent.so ,它的内存中含有 frida-agent 的字符串特征

frida检测绕过


圈内流行的绕过 frida 检测的方法是 hook pthread_create ,让线程函数不执行,但是有点麻烦,我想修改 frida 源码直接过掉检测,下面就基于 hluda 来修改,版本是 14.2.12。

  1. 首先是消除特征 re.frida.server ,找到 frida-core/server/server.vala ,在 main 函数处定义工作文件夹的名字,随便取一个

  2. 然后是工作目录不能再是 /data/local/ ,找到 frida-core/src/linux/system-linux.c ,修改 /data/local/tmp/data/tmp

  3. 接着是内存中不能出现 frida-agent 字符串,hluda 有一个 python 脚本会 patch 掉 frida-agent.so 的线程特征,就在 frida-core/src/anti-anti-frida.py 下,可以在末尾处增加以下代码 patch 掉 frida-agent

    同时我发现还有一个线程特征 gdbus 没有 patch 掉,那么顺便增加以下代码

结束


编译运行,可以愉快的 hook 了。