安卓反调试新手教程

总概

积累的一些安卓反调试方式。

模块基础检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//hook相关
libxhook.so
libsandhook.so
libsandhook-native.so
libhookzz.so
libwhale.so
libfake-linker-21.so
libfake-linker-22.so
libfake-linker-23.so
libfake-linker-24.so
libfake-linker-26.so
libfake-linker-27.so
libfake-linker-28.so
libfake-linker-21.so
libfake-linker-30.so

//xposed相关
app_process32_xposed
app_process64_xposed
libxposed_art.so
XposedBridge.jar

//edxposed相关
EdHooker_
SandHookerNew_
libsandhook.edxp.so

//substrate相关
libsubstrate.so
libsubstrate-dvm.so
libAndroidCydia.cy.so

//taichi相关
libepic.so
libepic64.so
libexp824.so
libexp82464.so
taichi_magisk

//分析工具相关
libq3dtools_esx.so
libq3dtools_adreno.so
libVkLayer_GLES_RenderDoc.so
librenderdoccmd.so
libVkLayer_VirtualSwapchain.so
libVkLayer_GraphicsSpy.so
libgapii.so
ibGLES_layer_aga.so
libVkLayer_khronos_validation.so
libGlLayer_PowerVR_carbon.so
libVkLayer_PowerVR_carbon.so
libPVRCarbon.so

Root检测

root检测可以考虑从下几个方面下手

1、PATH检测

1
getenv("PATH");

获取path环境变量,判断是否存在su

2、常见SU路径检测

判断这些目录下面是否存在su

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/data/local
/data/local/bin
/data/local/xbin
/sbin
/su/bin
/system/bin
/system/bin/.ext
/system/bin/failsafe
/system/sd/xbin
/system/usr/we-need-root
/system/xbin
/cache
/data
/dev

3、常见root应用检测

判断这些目录是否存在即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/data/data/com.topjohnwu.magisk
/data/data/com.noshufou.android.su
/data/data/com.noshufou.android.su.elite
/data/data/eu.chainfire.supersu
/data/data/com.koushikdutta.superuser
/data/data/com.thirdparty.superuser
/data/data/com.yellowes.su
/data/data/com.kingroot.kinguser
/data/data/com.kingo.root
/data/data/com.smedialink.oneclickroot
/data/data/com.zhiqupk.root.global
/data/data/com.alephzain.framaroot
/data/data/com.zachspong.temprootremovejb
/data/data/com.ramdroid.appquarantine
/system/app/Superuser.apk
/system/etc/init.d/99SuperSUDaemon
/dev/com.koushikdutta.superuser.daemon
/system/xbin/daemonsu

4、magisk应用检测

扫描手机上的应用,即所有的base.apk,解析classes.dex的stringIdsOff字符串,如果安装包大小小于49151且classes.dex里面同时具有以下字符串

1
2
3
4
5
6
Ljavax/crypto/spec/SecretKeySpec;
Ldalvik/system/BaseDexClassLoader;
Landroid/content/pm/PackageInstaller;
Landroid/app/ProgressDialog;
Landroid/app/AppComponentFactory;
Landroid/database/Cursor;

那么可以认为手机上安装了root应用

5、判断ro.debuggable属性

检测ro.debuggable属性是否为1

6、内存扫描zygisk

扫描/memfd:jit-cache (deleted)内存,如果这块内存符合elf格式且出现zygisk_module_entry,那么可以认为是root了。

7、内存扫描stack

扫描第一块[stack]开头的内存,如果出现了MAGISK_INJ_1字符串,那么可以认为是root了。

8、检测安全属性

获取/proc/self/attr/prev,即最后一次执行命令时安全相关的属性,判断是不是有:zygote:

9、ns时间细节检测

1
2
3
4
struct stat mntStat = {0};
fstatat(AT_FDCWD,"/proc/self/ns/mnt",&mntStat,AT_SYMLINK_NOFOLLOW);
struct stat netStat = {0};
fstatat(AT_FDCWD,"/proc/self/ns/net",&netStat,AT_SYMLINK_NOFOLLOW);

判断这两个句柄的st_mtim更新时间,如果mnt比net大1秒以上,那么就认为是root了。

10、zygisk文件检测

检测一些特征文件,没什么好说的

1
2
3
4
5
/system/zygisk_magic
/system/lib/libzygisk_loader.so
/system/lib/libzygisk_injector.so
/system/lib64/libzygisk_loader.so
/system/lib64/libzygisk_injector.so

11、mounts挂载检测

检测/proc/self/mounts中是否出现/data/adb/modules或者zygisksu,如果有那么可以认为是root了

frida检测

1、内存模块扫描

扫描内存模块名,有以下特征就会死

1
2
frida-agent
frida-gadge

如果是so,还可以定位到文件来一个ELF解析,扫描dynsym,包含frida_agent_mainFRIDA_AGENT_1.0,或者DT_SONAME包含frida-agent,那么也死了。

判断内存和文件前0x1000字节是否一样,如果被篡改过,直接扫这0x1000个字节,判断是否有frida_agent_mainFRIDA_AGENT_1.0

2、默认端口检测

连接上端口27042,那么就可以认为是frida开了。

3、常见路径检测

1
2
3
/data/local/tmp/frida-server
/data/local/tmp/re.frida.server
/system/bin/frida-server

4、文件句柄检测

枚举/proc/self/fd,通过readlink拿到文件路径,如果包含frida或者linjector,那就不行了。

5、art检测

检查libart.so中的_ZN3art9ArtMethod12PrettyMethodEb函数是否不正常。

调试器检测

1、进程信息扫描

首先是扫描自身进程,还可以遍历/proc/pid/task,获取其它进程的句柄,再从这些进程句柄中找调试信息。

/proc/pid/status获取自身进程的状态,从里面找TracerPid

/proc/pid/wchan获取自身等待相关的信息,从里面找ptrace_stop

/proc/pid/stat判断出特殊信息

/proc/pid/comm中寻找JDWP相关信息。

2、调试模块检测

1
libjdwp.so

3、断点检测

在一些常见的系统api上面,可以检测函数开头一段部分是否出现了brk断点指令。

4、调试器文件检测

1
2
/data/local/tmp/android_server
/data/local/tmp/android_server64

5、调试服务端口检测

ida的是23946

6、java环境检测

android/os/Debug类里面的isDebuggerConnected

关于云手机检测

结合特定文件路径 + 系统属性 + 屏幕高宽哈希信息 + 安装应用 + 操作系统版本,综合判定。

模拟器检测

1、检测so的ELF架构

2、检查so的重定位表类型,例如R_386_JMP_SLOT

3、检测特定的系统属性

1
2
3
4
ro.enable.native.bridge.exec
ro.dalvik.vm.isa.arm
persist.sys.nativebridge
ro.dalvik.vm.native.bridge

4、检测特定的文件

5、检测特定的应用

6、检查/sys/class/power_supply这个目录中子目录的数量。


安卓反调试新手教程
https://fjqisba.github.io/2024/10/07/2024/安卓反调试新手教程/
作者
fjqisba
发布于
2024年10月8日
许可协议