因为需要破解一个 App 的签名算法,开始学习逆向。本人没有逆向经验,也没有安卓开发经验,甚至没有 Java
开发经验。因此花了不少时间才完成任务,故整理了此文章,作为一个备忘。
由于是第一次实战,因此参考了很多文章,但是每篇文章都有一些没有提到的点(对新手而言),因此个人结合自己的情况,重新整理了一下遗漏的部分。
先上参考资料,建议每篇精读,你遇到的大部分问题可能文章已经提及。 1. 看雪论坛的《[原创]新手关于ida动态调试so的一些坑总结》 在学习的过程,主要步骤都是参考该文章,因此本文也以该文章为骨架。
使用IDA进行动态调试与过反调试 IDA Pro 动态调试操作部分参考了该文章,写的很详细,适合刚入门的朋友。
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
只显示第三方应用的包名
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
启动后设备会出现类似如下界面,等待调试器的连接。
电脑端
1. IDA Pro 配置
1.用 IDA 打开想要调试的 so
库
2.设置调试器
3.设置调试选项
4.开始 attach 进程
设置主机和端口:
选择要调试的程序:
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 的知识,建议阅读推荐文章。
本文链接:https://blog.xiaoyuyu.cn/post/使用IDA Pro动态调试安卓so文件.html,参与评论 »
--EOF--
发表于 2020-12-08 14:00:00。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »
提醒:本文最后更新于 1557 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments