因为需要破解一个 App 的签名算法,开始学习逆向。本人没有逆向经验,也没有安卓开发经验,甚至没有 Java 开发经验。因此花了不少时间才完成任务,故整理了此文章,作为一个备忘。

由于是第一次实战,因此参考了很多文章,但是每篇文章都有一些没有提到的点(对新手而言),因此个人结合自己的情况,重新整理了一下遗漏的部分。

先上参考资料,建议每篇精读,你遇到的大部分问题可能文章已经提及。

  1. 看雪论坛的《[原创]新手关于ida动态调试so的一些坑总结》 在学习的过程,主要步骤都是参考该文章,因此本文也以该文章为骨架。

  2. 使用IDA进行动态调试与过反调试 IDA Pro 动态调试操作部分参考了该文章,写的很详细,适合刚入门的朋友。

  3. IDA Pro7.0使用技巧总结 建议先读,可以对 IDA Pro 有一个相对系统的了解。

本文中的截图大部分来自其他文章,故可能内容对不上,但是流程都是完整的。 作为练手,可以尝试复现《逆向练手——说一说捅MXX的过程》,按图索骥,抽丝剥茧。

系统环境

macOS Big Sur 11.0.1

工具准备

  • IDA Pro
  • am、pm(安卓自带)
  • adb
  • jadx
  • 一台 root 的手机(模拟器可能也可以?)
  • Android Studio(主要需要用到一个叫 ddms(monitor) 的工具)
  • jdb

工具安装

这部分只是记录我安装过程遇到的问题,大家可以根据自己的情况安装。

1.安装 adb

brew cask install android-platform-tools

2.安装 jadx Github 下载:https://github.com/skylot/jadx/releases

3.安装 Android Studio 在官网下载,直接安装即可。不过在使用 ddms(monitor) 时,遇到了一个报错:

JavaVM FATAL: Failed to load the jvm library

Google 搜索到 StackOverflow 上的问题:JavaVM FATAL: Failed to load the jvm library

因为对 Java 不熟悉,就直接按照其中一个回答的操作解决了,具体原理未深入研究。修复方法如下(注意替换 jdk 版本):

cd /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
cd lib
sudo ln -s ../jre/lib/server/libjvm.dylib libserver.dylib

动态调试步骤

手机端准备

1. 使用 pm 确定要调试的 apk 的包名

列出所有的包信息:pm list packages [filter] pm 过滤器选项:

  • -d 只显示禁用的应用的包名
  • -e 只显示可用的应用的包名
  • -s 只显示系统应用的包名
  • -3 只显示第三方应用的包名

-w450

2. 确定启动入口 Lunch Activity

使用 jadx 反编译 apk,找到 AndroidManifest.xml 查看程序入口。

图片来源:https://www.cnblogs.com/bmjoker/p/11891123.html 其中包名为:demo2.jni.com.myapplication 入口为:.MainActivity

3. 复制 android_server 到设备中,并执行

android_server 存储在:IDA安装目录/dbgsrv/android_server

android_server分版本的,使用对应的版本。

# 复制到设备上
> adb push android_server /data/local/tmp

# 修改权限,并执行(使用 root 权限)
❯ adb shell
shell@R9sPlus:/ $ cd /data/local/tmp
shell@R9sPlus:/data/local/tmp $ chmod 777 android_server
shell@R9sPlus:/data/local/tmp $ su
root@R9sPlus:/data/local/tmp # ./android_server
IDA Android 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017
Listening on 0.0.0.0:23946...

# 启用端口转发,后面会有用到
> adb forward tcp:23946 tcp:23946

4. 启用端口转发

IDA Pro 动态调试时,需要连接 debug 程序,所以需要在电脑与手机之间进行数据转发。

> adb forward tcp:23946 tcp:23946

5. 用 am 启动被调试应用

am start -D -n demo2.jni.com.myapplication/.MainActivity

启动后设备会出现类似如下界面,等待调试器的连接。 -w360

电脑端

1. IDA Pro 配置

1.用 IDA 打开想要调试的 so 库 2.设置调试器

3.设置调试选项

4.开始 attach 进程

设置主机和端口:

选择要调试的程序: -w315

2.使用 jdb 连接

1.确定 port 打开 ddms 查看

cd /Users/funnyang/Library/Android/sdk/tools/
./monitor

这就为什么要下 Android Studio 😂

使用真机调试时,可能看不到进程,需要开启真机调试。参考《真机打开调试功能 》,下载 mprop 工具,并开启真机调试,具体操作如下:

# 将下载的mprop 放入 /data/local/tmp 当中
> adb push mprop /data/local/tmp
> adb shell
root@R9sPlus:/data/local/tmp $ su
root@R9sPlus:/data/local/tmp # cd /data/local/tmp
root@R9sPlus:/data/local/tmp # chmod 755 mprop
root@R9sPlus:/data/local/tmp # ./mprop ro.debuggable 1

# 获取ro.debuggable 此处应该是 1
root@R9sPlus:/data/local/tmp # getprop ro.debuggable

# 重启adbd进程
root@R9sPlus:/data/local/tmp # stop;start

2.开始连接

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

8700 为第一步找到的端口, 根据实际情况更改.

执行上述命令之后,切换到 IDA Pro,按 F9 就可以进行调试了。

F9 之后,会发现手机端的 Wait For Debugger 界面消失

开始调试

不断按 F9,就会触发到断点,直到出现类似如下界面,说明进入了要调试的 so。

调试快捷键:

  • F2 下断点
  • F7 单步步入
  • F8 单步步过
  • F9 执行到下个断点
  • F4 执行到光标

小 Tips: 初期尝试时,可以一步一步按 F9,来熟悉操作。熟悉了之后,可以直接在 so 的代码中打断点,然后按 F4,更快地到达要调试的函数。

在调试的过程中,可能需要查看寄存器的值,对于新手来说还是挺懵逼的。我也是在阅读《使用IDA进行动态调试与过反调试》之后才学会如何操作的。原来需要先点击 Hex View,再点跳转。同样地,如果要定位 View-PC 的位置,也要先点击 IDA View-PC 窗口。其他窗口跳转方法同理。

图片来源:使用IDA进行动态调试与过反调试

其他涉及 IDA Pro 的知识,建议阅读推荐文章。