教程长篇分享

安卓逆向:动态调试指南

学习吾爱破解论坛正己的《安卓逆向这档事》的笔记,视频和配套工具可以去课程主页获取:https://www.52pojie.cn/thread-1714727-1-1.html

工具

  1. 雷电模拟器
  2. 教程Demo
  3. MT管理器/NP管理器
  4. jeb
  5. XappDebug

动态调试环境配置

安装 jeb

配置 Java 环境

  1. 下载 jdk 并安装
  2. 配置环境变量

这里我之前装过,而且网上教程很多,就不演示了。

正己给的 Java 环境是 11 的,需要比这个版本高的,正好我之前装的是 19。

在命令行输入 java --version 测试一下:

image-20230331183818980

安装

解压了就行了,注册啥的正己都弄好了。

动态调试

获取 debug 权限

法一:修改 AndroidManifest.xml

在 AndroidManifest.xml 的 application 标签里添加:

android:debuggable="true"

修改androidmanifest

法二:XAppDebug 模块 hook 对应的 app

XAppDebug 项目地址:https://github.com/Palatis/XAppDebug

启用模块之后勾选系统框架(需要重启)和要进行 debug 的 app 即可。

XAppDebug

法三:Magisk 命令(重启会失效)

通过 adb 进入命令行或者用 MT 管理器的终端模拟器都可以。

  • adb 进入命令行(在你电脑终端里输):
adb shell
  • MT 管理器的终端模拟器:

mt shell

然后依次输入下面的命令就行了:

# 切换至超级用户
su
# 启用 debug
magisk resetprop ro.debuggable 1
# 一定要通过该方式重启
stop;start;

法四:刷入 MagiskHide Props Config 模块(永久有效)

下载 MagiskHide Props Config:https://github.com/Magisk-Modules-Repo/MagiskHidePropsConf/releases

在 Magisk 里找到模块,点击盒子按钮选择刚刚下载的 zip 文件即可开始刷入。

modules

出现 Done 说明刷入成功,重启设备。

done

进入终端,输入 props 命令,会出现一个菜单,选择Edit MagiskHide props (active),也就是输入 4

props menu

进入新菜单,找到 ro.debuggable 选项,并选择(我这里显示 enabled,表示已经是 1 了,就不用改了,否则需要改),将 ro.debuggable 的值设为 1

set debuggable prop

修改完后重启设备,然后使用以下命令验证 ro.debuggable 是否已经改为 1

getprop ro.debuggable

getprop ro.debuggable

端口转发以及开启 adb 调试权限

端口转发

雷电模拟器默认开启端口转发,其他模拟器需要用 adb 连一下,类似下面的命令:

adb connect 127.0.0.1:<port>

这个端口号不同模拟器不同,具体可以去查一下。

开启 adb 调试权限

进入开发者模式

按”设置->关于本机->版本号“顺序找到”版本号“,点击 7 次进入开发者模式。

version

开启 USB 调试

按”设置->系统->高级->开发者选项“顺序进入”开发者选项“,找到”USB 调试“选项并开启:

usb-debug

下断点

在对应 smali 代码处 Ctrl-B 下断点

debug 模式启动

命令行输入以下命令:

adb shell am start -D -n <package_name>/<activity_name>
  • adb:Android Debug Bridge 的缩写,它是一个用于在开发者计算机和 Android 设备之间建立通信的工具。
  • shell:指示 adb 命令将要在设备的命令行 shell 中运行。
  • am:代表活动管理器(Activity Manager),它是一个在 Android 设备上跟踪和管理应用程序活动的系统服务。
  • start:指示活动管理器启动一个新的应用程序或活动。
  • -D:指示在启动应用程序时要清除先前的任务和栈,以便该应用程序成为新任务的开始。
  • -n /:指示要启动的应用程序和特定的 activity。
    • `` 是应用程序的包名。
    • `` 是要启动的 activity 的名称。

比如这里要启动的名为 "com.zj.wuaipojie" 的应用程序中的 ".ui.MainActivity" 活动,命令将如下所示:

adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity

adb

这里不知道是我看视频看漏了还是怎么的,我的环境里好像没有adb,所以这里我去另外安装了一下。

然后模拟器会打开对应应用并等待调试器启动:

waiting for debugger

Jeb附加调试进程

在工具栏找到“调试器”一栏的”开始“并点击,或者通过菜单栏的”调试器->开始“,唤出“附加调试”菜单,然后找到对应的进程选择”附上“即可开始调试。

image-20230402015542027

接着在 app 中触发刚刚下断点处的逻辑,可以看到代码停在断点处了。此时就可以查看各种调试信息了,这里主要关注局部变量的信息:

breakpoint

快捷键:

  • Ctrl-F6:进入方法
  • F6:跳过方法
  • F7:跳出方法
  • Ctrl-R:运行到光标位置

这里在最后相等比较前的函数看到一个 base64 的值,复制下来放到 flag{} 之间就是密钥了。

key

我的密钥正确了:

success

这里调试的时候发现 v0 的值(也就是最后函数返回值赋给的变量)没有出现在局部变量里,正己说是因为模拟器的问题,真机就会有这部分值。


本文链接:https://linuxstory.org/android-reverse-dynamic-debugging-guide/
原文链接:https://www.52pojie.cn/thread-1714727-1-1.html

Linux Story 整理,对原文有删节、补充;转载请注明,否则将追究相关责任!

对这篇文章感觉如何?

太棒了
1
不错
0
爱死了
0
不太好
0
感觉很糟
0

You may also like

Leave a reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

More in:教程

教程

在 Ubuntu 像22.04 LTS Linux 安装 JUnit 5

JUnit 不仅简单而且是一种有效的方法来编写和执行 Java 应用程序的单元测试,因此它是开源类别中使用最广泛的测试框架。 JUnit的最新版本5发布时带来了许多改进。 所以,如果你使用Ubuntu […]
教程

同时运行多个 Linux 命令

了解如何在 Linux 中同时执行多个命令可以显著提高您的效率和生产力。本文将指导您通过各种方式在单行中运行多个 Linux 命令,甚至如何自动化重复的任务。 理解基础知识 在深入了解高级技巧之前,您 […]