【Android】Jadx动态调试应用

article/2025/10/14 22:15:20

【Android】Jadx动态调试应用

1. 前言

Jadx已支持动态调试APP,但一直没试过,从逆向角度尝试走一遍流程并熟悉,方便日后翻阅。

2. 相关知识

2.1 动态调试原理

动态调试的原理可以概括为以下几个步骤:

  • 启动应用程序进程:使用调试器或其他工具启动应用程序进程,并将其连接到调试器。

  • 注入调试代码:在应用程序进程中注入调试代码,以便在应用程序运行时捕获相关信息。通常,调试代码会在应用程序的某些关键点设置断点,并在断点处暂停应用程序的执行。

一种常见的注入调试器代码的方法是使用操作系统提供的动态链接库(DLL)或共享库(SO)机制。在这种情况下,调试器会通过操作系统API加载一个特定的DLL或SO库,并将其注入到目标进程中。这个库可以包含调试器代码,也可以是其他形式的代码(例如钩子或代理),以便在进程运行时进行调试操作。

  • 与调试器通信:一旦应用程序暂停,调试代码会与调试器通信,并将应用程序的状态和行为传递给调试器。调试器可以查看应用程序的栈、变量、线程等信息,并执行一些调试操作,例如单步执行、变量修改、内存查看等。

恢复应用程序执行:当调试器完成调试操作时,调试代码会通知应用程序继续执行,并从断点处恢复应用程序的执行。

2.2 调试器与目标进程通信

调试器与目标进程之间的通信可以通过以下几种方式实现:

  • 基于套接字的通信:调试器和目标进程之间可以通过本地网络套接字进行通信。在应用程序中,调试器可以打开一个本地套接字,并监听来自目标进程的连接请求。一旦目标进程连接到套接字,调试器就可以向进程发送调试指令,并接收进程的执行状态和结果。

  • 基于共享内存的通信:调试器和目标进程之间可以通过共享内存进行通信。在应用程序中,调试器可以创建一个共享内存区域,并将其映射到目标进程的地址空间中。一旦共享内存被映射到目标进程中,调试器就可以向内存中写入调试指令,并从内存中读取进程的执行状态和结果。

  • 基于进程间通信的通信:调试器和目标进程之间可以通过进程间通信(IPC)机制进行通信。在应用程序中,调试器可以使用IPC机制(例如管道、消息队列、信号等)发送调试指令,并从目标进程中接收执行状态和结果。

2.3 debuggable

debuggable是一个Android应用程序的属性,它指定应用程序是否允许调试器连接到应用程序进程。当debuggable属性设置为true时,调试器可以连接到应用程序进程,并且可以查看和修改应用程序的状态和行为。

在开发和测试应用程序时,将debuggable属性设置为true通常很有用,因为它允许开发人员使用调试器来快速定位和解决问题。例如,开发人员可以使用调试器来查看变量的值、执行代码行、设置断点等等。

然而,在将应用程序发布到生产环境之前,应该将debuggable属性设置为false,以提高应用程序的安全性。如果应用程序的debuggable属性设置为true,那么黑客可以使用调试器来查看应用程序的敏感数据、执行恶意代码等等,这将对应用程序的安全性造成极大的威胁。

需要注意的是,如果应用程序被加固或者使用了其他防护技术,可能无法将debuggable属性设置为true。此外,某些Android系统版本可能会限制应用程序的debuggable属性,因此在设置debuggable属性之前,请确保您了解应用程序的环境和限制。

在Android 4.2及更高版本中,Google对debuggable属性进行了限制,只有当应用程序的签名与系统签名相同时,才允许将debuggable属性设置为true。这是为了提高应用程序的安全性,防止黑客利用调试器来窃取应用程序的敏感信息。

在Android 7.0及更高版本中,Google进一步加强了对debuggable属性的限制,只有在应用程序的AndroidManifest.xml文件中显式声明android:debuggable="true"时,才允许将debuggable属性设置为true。这是为了防止应用程序在生产环境中意外地启用了调试功能,从而降低了应用程序的安全性。

2.4 ro.debuggable

ro.debuggable是 Android 系统属性,它表示整个 Android 系统是否处于调试模式下。当设置为 1 时,整个系统可以被调试器连接并进行调试。当设置为 0 时,整个系统不能被调试器连接,这可以增加系统的安全性。

要将整个系统设置为调试模式,需要将系统属性 ro.debuggable 设置为 1。这可以通过在设备的命令行界面上运行以下命令来实现:

adb shell setprop ro.debuggable 1

通过将 ro.debuggable 设置为 1,整个 Android 系统就可以在调试模式下运行,并允许调试器连接到系统上的所有应用程序进行调试。

2.5 开发者模式-调试开关

开发者模式打开 debuggable 选项只是允许该应用程序在调试模式下运行,并允许该应用程序通过调试器进行调试。实际上,如果系统的 ro.debuggable 属性设置为 0,即使在开发者模式下打开了 debuggable 选项,该应用程序也无法在系统调试模式下进行调试。

动态调试复现

基于上述基础知识,如下提供两种调试思路

思路1:frida Hook debuggable属性值

ro.debuggable=0
debuggable=“false” 通过hook -》debuggable=“true”

使用Frida hook可以将应用程序的debuggable属性设置为true。

// 附加到指定应用程序并执行指定的函数
Java.perform(function () {// 应用程序包名var packageName = 'com.example.myapp';// 修改后的 debuggable 参数值var debuggableValue = true;// 查找 Application 类var Application = Java.use('android.app.Application');// 修改 debuggable 参数值Object.defineProperty(Application, 'debuggable', {get: function () {return debuggableValue;},set: function (value) {debuggableValue = value;}});// 打印调试信息console.log(`Successfully set debuggable to ${debuggableValue}`);
});

这个脚本将hook android.app.Application类,并将debuggable属性设置为true。要在应用程序中执行此脚本,控制台中输入以下命令在启动时执行:

frida -U -f com.example.app -l script.js

在这里插入图片描述
接下来应该用jadx选择要调试的进程就行,但是我的设备出现了问题,我应用进程都是空的,不太清楚为什么。
在这里插入图片描述

思路2:修改系统ro.debuggable值

ro.debuggable=0 修改-> ro.debuggable=1
debuggable=“false” 通过hook -> debuggable=“true”

先看看本机ro.debuggable值

 ~  adb shell getprop ro.debuggable

在这里插入图片描述

2.1 方法1:mprop

https://github.com/wpvsyou/mprop

在这里插入图片描述
结果:失败

2.2 方法2:直接覆盖/system/build.prop

在这里插入图片描述
提示Read-only
结果:失败

2.3 方法3:magisk命令修改

magisk resetprop
在这里插入图片描述
结果:成功
但重启后失效
在这里插入图片描述

2.4 Magisk模块重置

在这里插入图片描述
在这里插入图片描述
然后就可以使用props命令进行修改了
在这里插入图片描述
我直接选择4,本地并没有ro.debuggable,所以我又选了5添加一个option
在这里插入图片描述
重启之后发现永久生效
在这里插入图片描述

结果:成功

jadx动态调试

回到最开始的问题,最开始的问题就是jadx的debug进程不存在,当我们修改了系统的debuggable后,jadx的进程列表会不一样吗?
在这里插入图片描述
答案是肯定的,我们已经可以选择进程了
分两步
先选择要调试的行数,然后选择smali代码
在这里插入图片描述
按下f2打断点,按f9开始监听,当程序逻辑走到断点处,会阻断并开始调试,如图可见调用栈和参数信息。

后话

至此,jadx动态调试也复现完成。可以看到当我们把系统的debuggable参数设置为1的时候,即便我们应用debuggable不等于true也是可以动态调试的。


http://chatgpt.dhexx.cn/article/NiPBufWs.shtml

相关文章

移动安全工具-jadx

1 需求 官网链接&#xff1a; GitHub - skylot/jadx: Dex to Java decompiler 2 语法 jadx - dex to java decompiler, version: 1.4.5usage: jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab) options:-d, --output-dir …

jadx反编译工具的使用

目录 jadx工具介绍 jadx工具的安装 jadx工具的使用 jadx遇到的问题 jdk和jre的区别 jadx工具介绍 decompile Dalvik bytecode to java classes from APK, dex, aar, aab and zip files将Dalvik 字节码从APK&#xff0c;dex,aar,aab&#xff0c;zip文件里反编译为java类de…

Android 反编译利器,jadx 的高级技巧

一、前言 今天介绍一个非常好用的反编译的工具 jadx(Java,Dex反编译器) 。jadx 的功能非常的强大&#xff0c;对我而言&#xff0c;基本上满足日常反编译需求。 jadx 优点&#xff1a; 图形化的界面。拖拽式的操作。反编译输出 Java 代码。导出 Gradle 工程。 这些优点都让…

app逆向(11)| jadx反编译工具的安装

文章目录 一、什么是jadx二、安装一、什么是jadx JADX是一款优秀的Android反编译工具,支持命令行和图形化界面,能为我们省下大量的反编译时间。 二、安装 前提首先需要安装java的jdkjadx的github地址:https://github.com/skylot/jadx 进入,下载压缩包。 解压压缩包后,…

jadx:好用的反编译工具

最近换了新公司&#xff0c;新公司比较高大上都是用的mac电脑开发Android&#xff0c;让我这个window党情何以堪&#xff0c; 任务&#xff1a;我的导师给了我们的一个开发的apk&#xff0c;他让我看打包混淆了没&#xff0c;我就翻一下我以前的工具&#xff0c;尼玛&#xff…

Android反编译——jadx工具

Android反编译工具——jadx 介绍反编译jar包反编译apk文件jadx下载jadx使用反编译文件搜索功能查看类、变量或者方法使用情况添加注释反混淆 本篇博文为转载原创作者公众号&#xff1a;JavaGuide 介绍 jadx 是一款功能强大的反编译工具&#xff0c;使用起来简单方便&#xff08…

决策树原理总结(ID3、C4.5、CART)+ 常见面试问题

系统梳理树类型算法原理加常见面试问题 类容按照决策树、Adaboost、GBDT、XGBoost、LightGBM 顺序进行梳理 本次的重点类容是决策树的CART树 ID3、C4.5介绍请转移到&#xff1a;ID3、C4.5的原理与案例介绍 1. CART树 ID3与C4.5虽然可以通过多叉树尽可能的挖掘特征信息&#…

机器学习之决策树算法

1-1 基本流程 决策树是一个有监督分类与回归算法。 决策树的生成只考虑局部最优&#xff0c;相对的&#xff0c;决策树剪枝则考虑全局最优。 一、概念&#xff1a; 决策树&#xff1a;是一种树形结构&#xff0c;其中每个内部节点表示一个属性上的判断&#xff0c;每个分支代表…

决策树挑出好西瓜

一、决策树 1、基本介绍 决策树&#xff08;decision tree&#xff09;是一种基本的分类与回归方法。其主要算法有&#xff1a;ID3、C4.5、CART。以及进化后的C4.5算法C5.0、分类有极大提升的Tsallis等算法。这些算法的区别就在于选择最优特征的方式。但C5.0的核心原理与C4.5…

1.决策树C4.5算法

文章目录 一、概述二、改进表现三、优缺点四、决策树1.特征选择2.决策树的生成3.决策树的剪枝 一、概述 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习&#xff1a;给定一个数据集&#xff0c;其中的每一个元组都能用一组属性值来描述&#xff0c…

python实现三种经典决策树算法

决策树实现ID3、C4.5、CART算法 Author: 浅若清风cyfDate: 2020/12/15 一、创建数据集 手动 def createDataSet():"""创建测试的数据集:return:"""dataSet [# 1[青绿, 蜷缩, 浊响, 清晰, 凹陷, 硬滑, 好瓜],# 2[乌黑, 蜷缩, 沉闷, 清晰, 凹…

数据挖掘--决策树C4.5算法(例题)

C4.5算法与ID3算法的不同点&#xff1a; &#xff08;1&#xff09;分支指标采用增益比例 &#xff08;2&#xff09;数值属性的处理 &#xff08;3&#xff09;处理缺少属性值的训练样本 &#xff08;4&#xff09;使用K次迭代交叉验证&#xff0c;评估模型的优劣程度&#xf…

决策树算法总结(上:ID3,C4.5决策树)

文章目录 一、决策树原理1.1 决策树简介1.2 基本概念 二、数学知识2.1 信息熵2.2 条件熵:2.3 信息增益 三、ID3决策树3.1 特征选择3.2 算法思路3.3 算法不足 四、C4.5决策树算法4.1 处理连续特征4.2 C4.5决策树特征选取4.3 处理缺失值4.4 过拟合问题 五、决策树C4.5算法的不足 …

决策树分类算法的案例(代码实现及运行测试)

1 案例需求 我们的任务就是训练一个决策树分类器&#xff0c;输入身高和体重&#xff0c;分类器能给出这个人是胖子还是瘦子。 所用的训练数据如下&#xff0c;这个数据一共有10个样本&#xff0c;每个样本有2个属性&#xff0c;分别为身高和体重&#xff0c;第三列为类别标签…

决策树cart算法实战

1、使用决策树预测隐形眼镜类型&#xff0c;隐形眼镜数据集(lenses.csv)是非常著名的数据集&#xff0c;它包含很多患者眼部状况的观察 条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括硬材质、软材质以及不适合佩戴隐形眼镜。 要求&#xff1a;读取lenses.csv中的隐形眼镜数…

人工智能决策树大作业

人工智能技术: 机器学习之决策树大作业 以西瓜集 2.0 为建模数据&#xff0c;采用交叉验证方法进行数据训练集和验证集的划分&#xff0c;实现决策树 “预剪枝”算法&#xff0c;要求:尽可能充分利用有限的西瓜集 2.0 数据所提供信息&#xff0c;建立泛化能力强的 决策树模型。…

决策树算法:原理与python实现案例

文章目录 决策树算法浅析决策树的介绍决策树最佳划分的度量问题决策树python案例 决策树算法浅析 决策树的介绍 决策树的定义&#xff1a; 决策树是一种逼近离散值目标函数的方法&#xff0c;学习到的函数使用树结构进行表示&#xff0c;完成决策任务。这里决策树可以是分类树…

决策树实例-ID3

决策树-ID3实例 参考书籍&#xff1a; 《机器学习》周志华&#xff0c;第1版 《统计学习方法》李航&#xff0c;第2版 用来记录自己对书中知识的理解&#xff0c;加强自己的理解和记忆&#xff0c;同时提出自己迷惑不解的地方&#xff0c;提高自己编辑的表达能力。 代码参考博…

决策树算法及Python 代码示例

决策树是一种基于树形结构的算法&#xff0c;用于在一系列决策和结果之间建立模型。它通过对特征和目标变量之间的关系进行划分&#xff0c;来预测目标变量的值。 决策树算法示例: 假设我们有一组数据&#xff0c;其中包含天气&#xff0c;温度&#xff0c;湿度和是否出门的特…