0x00背景
需要在手机上构建一个环境对root过的设备进行伪装,让设备里面的应用将该设备当成未root的设备。
1
0x01 Root检测手段
1.检查已安装的APK包:
SuperSU应用程序或者一键root的程序:
(例如One Click Root,iRoot,360一键root,kingroot)
Root Apps:需要root权限才能使用其功能的应用程序。例如busybox,SetCPU,Titanium Backup。
Root Cloakers:隐藏设备是否已植根的应用程序。例如Root Cloaker,Root Cloaker Plus。
API挂钩框架:提供API挂钩功能的库。例如Cydia Substrate,Xpose Framework。

2.检查已安装的文件:
静态路径:
/ system / xbin / su,/ system / bin / su或/system/xbin/…/xbin/su(路径操作)
/ system / xbin / busybox以及BusyBox创建的命令的所有符号链接。
在生根期间或生根后安装的热门应用程序包的/ data / app / 或/ system / app / 。
动态路径:解析PATH变量,在每个条目后附加“/ su”; 在循环中打开每一个
检查BUILD标签:来自Google的股票Android图像是使用“release-keys”标签构建的。如果出现“ 测试密钥”,这可能意味着Android映像是开发人员构建或非官方构建。该值基本上来自“ro.build.tags”。

3.检查目录权限:
Root使某些根文件夹可读,如/ data或可写,如/ etc,/ system / xbin,/ system,/ proc,/ vendor / bin等。运行mount命令并检查是否有任何设备使用“rw”挂载标记,或尝试在“/ system”或“/ data”文件夹下创建文件。
尝试使用命令“ mount -o remount,rw / system ” 挂载“/ system”分区,并检查返回码。
C heck流程/服务/任务:
ActivityManager.getRunningAppProcesses方法返回当前正在运行的应用程序进程的列表。此API可用于确定是否有任何需要root权限的应用程序正在运行。
getRunningServices或getRunningTasks:获取当前正在运行的服务或任务。
使用Shell命令检查生根特征:使用Runtime.exec,ProcessBuilder或execve(“su”)

ps | grep :列出当前正在运行的进程。
ls - :检查文件系统中是否存在文件
包列表:
pm path :输出目标包的完整路径
cat /system/build.prop或grep ro.build.tags:检查是否= release-keys。该测试仅可用作指标,因为在野外存在许多相反的观察结果。
构建版本:“ ro.modversion ”可用于识别某些自定义Android ROM(例如CyanogenMod)

4.检查系统属性:
ro.secure = 0,表示adb shell将以root用户身份运行,而不是shell用户。
ro.debuggable = 1或service.adb.root = 1,然后adb也将以root身份运行。
毋庸置疑,这些技术可以通过功能挂钩或自定义构建Android ROM等来绕过。

开源的rootbeer就是用来查看是否运行在root环境
https://github.com/scottyab/rootbeer/blob/master/README.md

0x02 root反检测手段
原理:hook调用api的函数

开源的RootCloak用来对抗root监测
https://github.com/devadvance/rootcloak

参考:
https://www.blackhat.com/docs/eu-15/materials/eu-15-Benameur-All-Your-Root-Checks-Are-Belong-To-Us-The-Sad-State-Of-Root-Detection.pdf

Detecting Root on Android

https://blog.csdn.net/lintax/article/details/70988565
from:https://blog.csdn.net/tangsilian/article/details/85255929

最新文章

  1. MIT JOS学习笔记02:kernel 01(2016.10.28)
  2. Programming Erlang 学习笔记(一)
  3. oracle空表导出的问题
  4. BZOJ1409 : Password
  5. 【Android测试】【随笔】与 “58同城” 测试开发交流
  6. u-boot 源码修改 bootcmd,IP ,BOOTARGS等参数
  7. [C++程序设计]函数的递归调用
  8. python爬虫(五)_urllib2:Get请求和Post请求
  9. jar包后台启动--nohup篇
  10. 关于如何给<input type="date">设置默认当前日期的方法 和 给table固定宽度
  11. java之JVM(二)
  12. window下安装绿色版5.7
  13. MSSQL SQL Server代理 作业 设置(调用存储过程)
  14. Web API中常用Filter的执行顺序举例讲解
  15. 【详解】JNI (Java Native Interface) (四)
  16. Go map中一个很重要的特性
  17. Docker多主机网络 OpenvSwitch
  18. Centos 5.6安装Mysql(步骤,疑问)
  19. Mybatis基础及入门案例
  20. Arduino开发版学习计划--直流电机

热门文章

  1. SQL+C#:一次多语言混合编程的经验总结
  2. python(字符串函数)
  3. IDEA 显示Run Dashboard窗口的2种方式
  4. 51nod 2497 数三角形
  5. redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?
  6. WPF + SelfHost 实现窗体自宿主(API,API和窗体通信)
  7. machine learning (6)---how to choose features, polynomial regression
  8. C#向数据库中插入或更新null空值
  9. Dynamics 365 on-premises 安装
  10. c语言逆序