Android实战:过root检测

news2024/9/21 18:53:45

在启动这个app时,我们会看到一个提示,表示设备处于root环境。如下图所示:
在这里插入图片描述

为了过掉到这个root检测,我们可以通过直接Hook Toast.show()方法,并打印调用堆栈信息来实现定位关键代码。以下是相关的Frida脚本代码:

Java.perform(function () {
    function showStacks() {
        console.log(
            Java.use("android.util.Log")
                .getStackTraceString(
                    Java.use("java.lang.Throwable").$new()
                )
        );
    }
    // Hook the android.widget.Toast class
    var Toast = Java.use("android.widget.Toast");
    Toast.show.implementation = function () {
        showStacks();
        console.log("Toast.show() called!");
        console.log("Toast message: " + this.getView().getAccessibilityClassName());
        this.show();
    };
});

调用堆栈信息如下:

[Pixel 4::com.hoge.android.app.fujian]-> java.lang.Throwable                                 
        at android.widget.Toast.show(Native Method)                                          
        at com.hoge.android.util.CustomToast.showToast(CustomToast.java:172)                 
        at com.hoge.android.factory.welcome.WelcomeActivity$2$1.run(WelcomeActivity.java:260)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

从堆栈信息中,我们可以看到关键函数为com.hoge.android.factory.welcome.WelcomeActivity$2$1.run()。我们可以使用JEB反编译APK,并查看代码,发现如下内容:

  Util.getHandler(WelcomeActivity.this.mContext).postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if((SystemUtils.checkSuFile()) && SystemUtils.checkRootFile() != null) {
                            CustomToast.showToast(WelcomeActivity.this.mContext, WelcomeActivity.this.getString(0x7F11071B), 100);  // string:root_toast "当前设备可能处于root环境,继续运行应用将有风险"
                        }
                    }
                }, 1000L);

因此这里的关键函数为SystemUtils.checkSuFile()和SystemUtils.checkRootFile(),继续跟进这两个函数,看看究竟是怎么进行检测root环境的。checkSuFile()函数的代码如下:

public static boolean checkSuFile() {
    Process process0 = null; 

    try {
        // 尝试执行系统命令 "which su" 来检查是否存在 su 文件
        process0 = Runtime.getRuntime().exec(new String[]{"which", "su"});
        // 读取命令的输出,检查输出的第一行
        String s = new BufferedReader(new InputStreamReader(process0.getInputStream())).readLine();
    }
    catch (Throwable unused_ex) {
        if (process0 != null) {
            process0.destroy();
        }
        return false;  
    }
    catch (Throwable throwable0) {
        if (process0 != null) {
            process0.destroy();
        }

        throw throwable0;
    }
    // 如果读取到的结果不为null,说明设备上存在su文件
    if (s != null) {
        if (process0 != null) {
            process0.destroy();
        }

        return true;
    }
    if (process0 != null) {
        process0.destroy();
    }

    return false; 
}

checkSuFile()函数核心就是通过which su命令检测su文件是否存在。接下来继续查看SystemUtils.checkRootFile()代码:

public static File checkRootFile() {
    //包含可能存在的root文件路径
    String[] arr_s = {
        "/sbin/su", 
        "/system/bin/su", 
        "/system/xbin/su", 
        "/data/local/xbin/su", 
        "/data/local/bin/su", 
        "/system/sd/xbin/su", 
        "/system/bin/failsafe/su", 
        "/data/local/su"
    };
    
    File file0 = null;
    int v = 0;
    
    // 遍历所有路径
    while (v < arr_s.length) {
        File file1 = new File(arr_s[v]);
        
        // 检查当前路径的文件是否存在
        if (file1.exists()) {
            return file1;
        }

        ++v;
        file0 = file1; 
    }
    return file0;
}

checkRootFile()函数功能也相对简单,就是检测su文件可能存在路径。因此过掉这个这个root检测的方法很简单,只需要将checkSuFile()函数返回false,checkRootFile()函数返回null即可。Frida hook代码如下:

Java.perform(function() {
    var SystemUtils = Java.use('com.hoge.android.factory.util.system.SystemUtils');

    SystemUtils.checkSuFile.implementation = function() {
        console.log('checkSuFile() is call');
        return false;  // 返回 false
    };
    SystemUtils.checkRootFile.implementation = function() {
        console.log('checkRootFile() is call');
        return null;
    };
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esxi 安装 精简版win10

镜像来源&#xff1a;[【不忘初心】Windows10 22H2 (19045.4780) X64 无更新 纯净[深度精简版]1.27G](https://www.pc528.net/22h2s.html) 提供下载地址&#xff1a;https://www.123pan.cn/s/lYtRVv-Wmuf3?提取码:GaD4 先把下载esd 转成iso安装 把下载的esd 重命名为install…

如何使用ssm实现学生宿舍管理

TOC ssm094学生宿舍管理jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样…

YOLOv5改进 | 融合改进 | C3融合EffectiveSE-Convolutional【完整代码 + 小白必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

如何用comate快速生成一个剩菜好帮手

想法 上班后不想吃饭店的饭菜&#xff0c;时长想自己做一些饭菜&#xff0c;买完菜后却经常放到冰箱中&#xff0c;剩下的菜有无法一下子处理&#xff0c;单纯扔掉有些可惜&#xff0c;但是基于冰箱中的剩菜如何能做出一顿像样的饭菜一致困扰着我&#xff0c;查市面上的程序有…

在不修改应用数据源的情况下,如何确保应用程序能够正常访问adg切换后的主库?

在不修改应用数据源的情况下&#xff0c;如何确保应用程序能够正常访问adg切换后的主库&#xff1f; oracle12c rac测试通过&#xff1a; 1.修改原主库的scanip为某个临时ip&#xff0c;新主库的scanip修改为原生产 2.修改新主库的service_names&#xff1a;dgorcl为原生产的…

学习2d直线拟合

直线拟合算法&#xff08;续&#xff1a;加权最小二乘&#xff09;_加权拟合直线法-CSDN博客 直线拟合算法_相位拟合直线-CSDN博客 特别感谢博主无私分享 博文中提到的参考资料《机器视觉算法与应用&#xff08;双语版&#xff09;》[德] 斯蒂格&#xff08;Steger C&#x…

GPT-4o语音功能潜在风险分析与技术挑战

引言 近年来&#xff0c;随着大语言模型&#xff08;LLM&#xff09;技术的飞速发展&#xff0c;人工智能的能力在语音处理领域也取得了显著进展。OpenAI推出的GPT系列模型正成为人工智能领域的标杆。然而&#xff0c;在最新的GPT-4o版本中&#xff0c;尽管语音功能具备广阔的…

vue3 多文件下载zip压缩包

vue3多文件下载zip文件包 效果图 代码块 在这里插入代码片 <template><div><el-button type"primary" click"downLoadClick">下载文件zip</el-button></div> </template><script setup lang"ts"> i…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

4个学生党必备好用 AI 学术论文写作工具

随着人工智能技术的不断进步&#xff0c;AI论文写作工具已成为研究人员和学生的得力助手。学姐今天将介绍4个市面上广受好评的免费AI论文写作工具&#xff0c;它们能帮助用户高效地完成从论文大纲到最终校对的各个阶段。 一、梅子AI论文 梅子AI提供快速论文撰写功能&#xff…

Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(二)

自适应学习率 我们梯度下降在参数更新上&#xff0c;公式是 W t W t − 1 − η g t &#xff0c; η 是学习率&#xff0c; g t 是梯度 W_tW_{t-1}-\eta g_t&#xff0c;\eta是学习率&#xff0c;g_t是梯度 Wt​Wt−1​−ηgt​&#xff0c;η是学习率&#xff0c;gt​是梯度…

2024软件测试必问的常见面试题1000问!

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

数据结构——链式二叉树的实现与分治编程思维(c语言实现)

目录 前言&#xff1a; 1.前置说明 2.链式二叉树的遍历 2.1 前序&#xff0c;中序及后续遍历 2.2 前序遍历实现 2.3 中序遍历实现 2.4 后续遍历实现 3.结点个数以及高度等 3.1 结点个数 3.2 结点高度 3.3 叶子结点的个数 前言&#xff1a; 在之前的学习中&…

从“云、边、端”的统一管理,为传统工厂数字化转型赋能的智慧地产开源了

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…

这些软件测试面试题一定要会,自动化测试面试题(含答案)

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

多模态大模型技术详解(图像分块、特征对齐)

多模态 多模态发展图像预处理自适应图像切割弥补语义损失 视觉编码器视觉文本特征对齐线性映射或MLPCross AttentionPerceiver ResamplerQ-Former&#xff08;Querying Transformer&#xff09;模型结构表示学习 大语言模型 这篇文档主要讲解目前比较流行的缝合式的多模态大模型…

设计模式—装饰者模式

一、什么是装饰者模式 装饰者模式是一种结构型设计模式&#xff0c;它允许你动态地向对象添加新的行为而不影响其原有的行为。它在运行时给对象动态地添加一些额外的职责&#xff0c;通常是在原有的行为基础上&#xff0c;通过装饰器进行一些修饰&#xff0c;实现了更加灵活的代…

【软考】流水线

目录 一、指令控制方式1.1 说明1.2 顺序方式1.3 重叠方式1.4 流水方式 二、流水线的种类三、流水的相关处理3.1 说明3.2 RISC 中采用的流水技术3.2.1 超流水线(Super Pipe Line)技术3.2.2 超标量(Super Scalar)技术3.2.3 超长指令字(Very Long Instruction Word&#xff0c;VLI…

阿一网络安全之log4j2漏洞CVE-2021-44228复现

漏洞简介 Apache Log4j 2 是对 Log4j 的升级&#xff0c;它⽐其前身 Log4j 1.x 提供了显 着改进&#xff0c;并提供了 Logback 中可⽤的许多改进&#xff0c;同时修复了 Logback 架构中的⼀些固有问题。 2021 年 12 ⽉&#xff0c;在 Apache Log4j2 中发现了⼀个 0-day 漏洞。 …

倒计时7天!MoonBit 游戏挑战赛即将开启!

基于 Wasm4 框架的 MoonBit 游戏开发指南 MoonBit 即将面向全国举办“编程创新挑战赛”&#xff0c;并包含游戏赛道。本教程将介绍本次比赛中使用的框架 Wasm4&#xff0c;以及如何使用 MoonBit 在 Wasm4 框架中编写游戏。相关赛事详情见文末。 如果你曾访问过 mooncakes 或我们…