本帖最后由 nisodaisuki 于 2020-5-20 17:47 编辑
[TOC]
虽然Java层代码包含了许多有用的信息,但是一般稍微注重安全的应用都会把核心代码放到Native层,所以对Native层的调试就显得尤为重要了。
动态调试步骤
使用工具:
am + pm +IDA, 其中am和pm为安卓系统自带
复制android_server 到设备中,并执行。
android_server 的目录为:IDA目录 >dbgsrv >android_server
注意:
android_server 分版本的,使用对应的版本。
//复制到设备上
adb push android_server /data/local/tmp
//修改权限,使之能执行
chmod 777 /data/local/tmp/android_server
//执行
cd /data/local/tmp
./android_server
adb forward tcp:23946 tcp:23946
等待附加。
用pm 确定要调试apk的包名
pm(package manager)包管理工具.
列出所有的包信息:pm list packages [filter]
- pm过滤器
- -d:只显示禁用的应用的包名
- -e:只显示可用的应用的包名
- -s:只显示系统应用的包名
- -3:只显示第三方应用的包名
用am 启动被调试应用
am是activity manager的缩写
am 启动程序命令:am start -D -n com.example.testarm/.MainActivity
am start -D -n 调试模式打开应用
com.example.testarm 要调试启动的包名
.MainActivity Lunch Activity
启动后等待调试器的链接。
<img src="https://gitee.com/nisodaisuki/pictures/raw/master/img/Screenshot_20200518-155216_TestArm.png" style="zoom: 25%;" />
设置IDA调试器
开始附加程序
设置主机和端口
选择要调试的程序进行附加
弹出对话框表示全部加载完成了.
此时会显示出PC 的位置
IDA 按F9 ,继续执行.
jdb连接
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
8700为apk运行的端口, 根据实际情况更改.
确定port的方法
触发断点
same
Yes
调试快捷键
F2 下断点
F7 单步步入
F8 单步步过
F9 执行到下个断点
可能的错误
-
由于没有设置参数,所以经常有下面的错误提示, 忽略或者随便给个参数
-
没有进行端口映射
adb forward tcp:23946 tcp:23946
-
android_server未开启
-
可附加的程序过少
启动android_server 的用户权限低.用root用户运行android_server 来监听.
-
ida调试版本的so和正在运行的so不一致
-
jdb连接失败
-
ida打开的so文件名要和运行apk中的so名一致. 如果不一致会导致断点无效.
|