总概
积累的一些安卓反调试方式。
模块基础检测
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
| 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
app_process32_xposed app_process64_xposed libxposed_art.so XposedBridge.jar
EdHooker_ SandHookerNew_ libsandhook.edxp.so
libsubstrate.so libsubstrate-dvm.so libAndroidCydia.cy.so
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检测
获取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、内存模块扫描
扫描内存模块名,有以下特征就会死
如果是so,还可以定位到文件来一个ELF解析,扫描dynsym,包含frida_agent_main
或FRIDA_AGENT_1.0
,或者DT_SONAME
包含frida-agent
,那么也死了。
判断内存和文件前0x1000字节是否一样,如果被篡改过,直接扫这0x1000个字节,判断是否有frida_agent_main
和FRIDA_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、调试模块检测
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
这个目录中子目录的数量。