首页
社区
课程
招聘
[分享]静态分析-绕过java层root检测
发表于: 2022-2-2 15:31 8768

[分享]静态分析-绕过java层root检测

2022-2-2 15:31
8768

  1.root介绍

root是安卓系统的超级用户,拥有系统最高权限,可以对任意用户的目录或文件进行读取和修改,安卓的沙盒隔离机制对root用户变得无效,我们常说的手机root了,就是拥有了手机的root权限。

  1.坏处

系统遭到病毒入侵的风险变高,手机系统可能会不稳定。

  1.介绍

由于root之后的手机环境变得不安全,可能对手机上的应用程序构成威胁,开发者为了保证自己开发的app在安全可靠的环境中运行,通常会进行root环境检测,阻止用户在root手机上运行app。

  1.方式

1)检测su文件,su命令在linux中是用来获取root权限的。

2)Superuser.apk,root后手机通过这个apk管理root权限,所以这也是一个特征。

3)检查busybox,安卓系统虽然是linux,但是很多命令没有,需要借助busybox工具箱,所以可以对其检测。

4)cat /system/bulld.prop | grep ro.bulld.tags,官方版本tags = release-key,通过这个可以判断是否第三方rom或者原生安卓系统,非官方版本。

  1.在模拟器中运行程序,提示设备root,被检测到了。

  2.将apk拖进Androidkiller工具,通过提示界面,可以看到有“安全警告”字样,使用工程搜索,没有搜索到,可能是中文编码格式的问题,使用编码转换功能,将文本进行Unicode编码再搜索

  3.双击过来,定位到代码,向上翻,看到if-eqz指令,如果v0是true就向下执行,否则就跳走,如果继续向下走,这里就弹窗警告了。

  4.再向上翻,找到给v0赋值的地方,发现执行这个静态方法后,isDeviceRooted()Z,Z代表函数返回值是布尔类型,move-result v0将返回值给v0。

  5.找到rootcheck.smali打开看看代码,里面有四个函数

通过adb命令看一下,先adb shell进入系统,然后输入cat /system/build.prop | grep tags:

检查这些目录下是否有su命令

第三个函数检查系统目录下是否存在Superuser.apk文件。

第四个函数调用了前面三个函数进行检测,只要有一个是true,函数返回值就是true。

  6.这里if-eqz,我可以对它逻辑翻转,改成if-nez,这样就会跳走到:cond_0,提示“设备安全”了,保存,编译,安装到模拟器再试试。

  7.如果对smali代码不熟悉,进入这个类后,可以点上面的工具查看java源代码:

 
 
 
 
 
 
 
 
 
 
 
if-eqz v0, :cond_0
 
.line 29
new-instance v0, Landroidx/appcompat/app/AlertDialog$Builder;
 
invoke-direct {v0, p0}, Landroidx/appcompat/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
 
.line 31
.local v0, "dialog":Landroidx/appcompat/app/AlertDialog$Builder;
const-string v3, "\u5b89\u5168\u8b66\u544a"
if-eqz v0, :cond_0
 
.line 29
new-instance v0, Landroidx/appcompat/app/AlertDialog$Builder;
 
invoke-direct {v0, p0}, Landroidx/appcompat/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
 
.line 31
.local v0, "dialog":Landroidx/appcompat/app/AlertDialog$Builder;
const-string v3, "\u5b89\u5168\u8b66\u544a"
invoke-static {}, Lcom/example/checkroot/rootcheck;->isDeviceRooted()Z
 
move-result v0
invoke-static {}, Lcom/example/checkroot/rootcheck;->isDeviceRooted()Z
 
move-result v0
checkrelease()Z  //检查固件版本
const-string v1, "dev-keys"  //测试版
const-string v1, "test-keys"  //测试版
checkrelease()Z  //检查固件版本
const-string v1, "dev-keys"  //测试版
const-string v1, "test-keys"  //测试版
aosp:/ # cat /system/build.prop | grep tags
ro.build.tags=release-keys  //发行版,官方版(模拟器可以随便改)
aosp:/ # cat /system/build.prop | grep tags
ro.build.tags=release-keys  //发行版,官方版(模拟器可以随便改)
.method public static checkRootPathSU()Z
 
const-string v1, "/system/bin/"
 
const-string v2, "/system/xbin/"
 
const-string v3, "/system/sbin/"
 
const-string v4, "/sbin/"
 
const-string v5, "/vendor/bin/"
.method public static checkRootPathSU()Z
 
const-string v1, "/system/bin/"
 
const-string v2, "/system/xbin/"
 
const-string v3, "/system/sbin/"
 
const-string v4, "/sbin/"
 
const-string v5, "/vendor/bin/"
.method public static checkSuperuserApk()Z
 
const-string v1, "/system/app/Superuser.apk"
.method public static checkSuperuserApk()Z
 
const-string v1, "/system/app/Superuser.apk"
.method public static isDeviceRooted()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkSuperuserApk()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkRootPathSU()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkrelease()Z
.method public static isDeviceRooted()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkSuperuserApk()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkRootPathSU()Z
 
invoke-static {}, Lcom/example/checkroot/rootcheck;->checkrelease()Z
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 31
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
请问例子在哪里可以下载呀
2022-8-7 03:18
0
雪    币: 706
活跃值: (723)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
请问例子在哪里可以下载呀
2024-1-26 15:20
0
游客
登录 | 注册 方可回帖
返回
//