【Android】Jadx动态调试应用

news2024/12/24 22:09:09

【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://www.coloradmin.cn/o/604073.html

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

相关文章

[数据挖掘02] pandas的分配和聚合函数(1)

一 说明 窗口函数是什么?窗口函数是时间序列的局部属性处理函数,比如,一维卷积滤波、移动平均、指数平均本篇我们将针对pandas对象的窗口函数展开讨论,并以示例展示他们的概念实质。 二 窗口函数、分组函数( GroupBy …

2023年18个最佳的ChatGPT AI插件

​关注文章下方公众号,可免费获取AIGC最新学习资料 导读:ChatGPT已经将人工智能提升到了一个新的高度。ChatGPT 4不仅是聊天机器人,还可以很好地与第三方插件配合使用。我们挑选出了2023年目前18款最佳的插件来介绍给您。 本文字数&#xff…

【运维知识进阶篇】Ansible Jinja2模板详解

哈喽大家好,我是koten,本篇文章给大家介绍jinja2模板,这是python的全功能模板引擎。在Ansible中,通常会使用jinja2模板来修改被管理主机的配置文件(saltstack中也会用到) Ansible中使用的jinja2模板其实就…

【软件测试】软件测试管理

软件测试管理 软件测试环境测试环境的要素测试环境管理员 软件测试计划⭐测试计划目标测试计划主题测试计划制订过程定义工作进度的过程测试策略 软件缺陷(bug)管理缺陷的主要属性如何报告缺陷⭐如何跟踪缺陷缺陷度量 软件配置管理(SCM)软件配置管理的基…

计算机网络传输层1.0

功能 传输层提供进程到进程的逻辑通信 复用和分用 传输层对收到的报文进行差错检测 TCP/UDP 提供进程到进程的逻辑通信 网络层是提供主机间逻辑通信 从网络层来看,通信双方为两台主机,IP数据包首部给出两台主机的IP地址 而实际上的两台主机通信时两台…

Makefile路径处理:执行路径、绝对路径与相对路径的处理

问题描述 最近编写了一个 编译设备树 的 Makefile,遇到了使用 make -f xx/Makefile,执行路径变了,造成 Makefile 里面的一些操作路径不正确,无法执行 获取当前目录 make 内置的 $(CURDIR),可以把当前路径的全路径打印…

Three.js--》实现图片转3D效果展示

目录 项目搭建 初始化three.js基础代码 加载图片纹理 设置着色器 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写th…

逻辑推理与集合

逻辑推理与集合是同一个过程的不同展示方式,这两者具有不同的特点。 逻辑推理通常是一种思维过程、语言文本的形式。 而集合则很容易采用一种可视化的方式进行展示,并且集合很容易进行交集、并集、补集、差集等计算。 把语言的逻辑推理过程转换为集合…

0602-指针和数组

数组名 数组名是一个地址常量,不允许赋值。它表示数组首元素的地址。 指针操作数组元素 指针访问数组 指针类型变量\常量1等同于指针保存的内存地址sizeof(指针指向的数据类型)。 2个相同类型的指针相减,得到的结果是2个指针的偏移量。其中偏移单位…

STL模型转有限元网格

随着计算机图形学、硬件和3D打印技术的发展,基于曲面三角网格的图形渲染及其文件格式越来越流行。 在有限元分析(FEA)中,工程师有时会得到基于三角形网格的几何文件(如STL文件等)并进行后续分析。 由于曲面…

华为OD机试真题 Java 实现【检查是否存在满足条件的数字组合】【2022Q4 100分】

一、题目描述 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 规则:A B 2C 二、输入描述 第一行输出数组的元素个数。 接下来一行输出所有数组元素,用空格隔开。 三、输出描述 如果存在满足要求的数,在同一行…

【MySQL】不允许你不会SQL语句之DDL

目录 前言: 一.DDL数据库语句 1.1语句讲解 1.2总结 二.DDL表语句 2.1语句讲解 2.2总结 三.DDL字段语句 3.1语句讲解 3.2总结 四.MySQL数据类型 五.结尾 前言: 在从零到一入门MySQL一篇中,我们对数据库已经有了一定的了解&#xf…

Linux 设备树手动反编译 dtb 生成 源文件dts

验证平台 win10 64 位 VMware Workstation Pro 16 ubuntu 20.04 dtc 工具: 来自 linux-6.3.5 中的 scripts/dtc/ 安装 dtc 工具 其实可以通过安装 dtc 软件包,但不建议这么做,最好通过编译Linux 最新的内核,获取这个 dtc 工具…

利用Web Serial API实现Vue与单片机串口通信

一、Web Serial API介绍 Web Serial API 是一项 Web 技术,用于在浏览器中访问串行端口设备(如 Arduino、传感器等)并与之通信。它提供了一组 JavaScript 接口,使得 Web 应用程序可以通过 USB 串行端口连接到硬件设备,并…

华为OD机试真题 Java 实现【报数游戏】【2022Q4 100分】

一、题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少&#xff…

【JavaSE】Java基础语法(四十五):TCP UDP 全解

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】5. UDP发送数据6. UDP接收数据【应用】7. UDP通信程序练习【应用】8. UDP三种通讯方式 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装,使…

chatgpt赋能python:Python删除文件目录

Python删除文件目录 Python是一种高级编程语言,广泛应用于开发各种类型的应用程序。Python的许多功能使其成为开发者的首选编程语言之一。在这篇文章中,我们将讨论如何使用Python删除文件和目录。 文件和目录的区别 在开始之前,让我们了解…

16_Linux内核启动流程

目录 链接脚本vmlinux.Ids Linux内核入口stext mmap_switched函数 start_kernel函数 rest_init函数 init进程 链接脚本vmlinux.Ids 要分析Linux启动流程,同样需要先编译一下Linux源码,因为有很多文件是需要编译才会生成的。首先分析Linux内核的连接脚本文件arch/arm/kem…

【Python】Python系列教程-- Python3 字符串(十一)

文章目录 前言Python3 字符串Python 访问字符串中的值Python 字符串更新Python 转义字符Python 字符串运算符Python 字符串格式化Python三引号f-stringUnicode 字符串Python 的字符串内建函数 前言 往期回顾: Python系列教程–Python3介绍(一&#xff…

计算机网络-网络层1.0

传输单位 网络层将分组从源端传到目的端,为分组交换网上的不同主机提供通信服务,传输单位为数据报 路由器 完成路由选择和分组转发 路由选择:按照分布式算法,根据从相邻路由器所得到的的关于整个网络拓扑的变化情况&#xff0…