那些年用ida动态调试so所踩坑坑
本帖最后由 nisodaisuki 于 2020-5-20 17:47 编辑虽然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
```
等待附加。
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114133241217.png)
## 用`pm`确定要调试apk的包名
pm(package manager)包管理工具.
列出所有的包信息:`pm list packages `
- pm过滤器
- -d:只显示禁用的应用的包名
- -e:只显示可用的应用的包名
- -s:只显示系统应用的包名
- -3:只显示第三方应用的包名
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518154700.png)
## 用`am`启动被调试应用
> am是activity manager的缩写
`am`启动程序命令:`am start -D -n com.example.testarm/.MainActivity`
> `am start -D -n`调试模式打开应用
>
> `com.example.testarm`要调试启动的包名
>
> `.MainActivity`Lunch Activity
启动后等待调试器的链接。
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/Screenshot_20200518-155216_TestArm.png)
<img src="https://gitee.com/nisodaisuki/pictures/raw/master/img/Screenshot_20200518-155216_TestArm.png" style="zoom: 25%;" />
## 设置IDA调试器
- 用IDA打开想要调试的so库。
- 选择`Remote ARM Linux/Android debugger`。
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114135209000.png)
- 设置调试选项
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114135506566.png)
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114135633613.png)
## 开始附加程序
**设置主机和端口**
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114141153011.png)
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200114141217407.png)
**选择要调试的程序进行附加**
弹出对话框表示全部加载完成了.
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518174344.png)
此时会显示出`PC`的位置
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518174449.png)
**IDA 按`F9`,继续执行.**
## jdb连接
```
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
```
> 8700为apk运行的端口, 根据实际情况更改.
**确定port的方法**
- 使用ddms(monitor)
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200520103736.png)
**注意:以前monitor为Android Studio自带, 从2019年下半年开始的Android Studio删除了这些工具.**
提取的ddms:https://www.jianguoyun.com/p/DWps1OsQ9oe6CBjP15oD (访问密码:HrhFnH)
## 触发断点
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200520154012.png)
**same**
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200520154335.png)
**Yes**
## 调试快捷键
`F2`下断点
`F7`单步步入
`F8`单步步过
`F9`执行到下个断点
# 可能的错误
- 由于没有设置*参数*,所以经常有下面的错误提示, 忽略或者随便给个参数
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518161959.png)
- 没有进行端口映射
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/image-20200317201613639.png)
> `adb forward tcp:23946 tcp:23946`
- android_server未开启
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518162850.png)
- 可附加的程序过少
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518163814.png)
启动`android_server`的用户权限低.用root用户运行`android_server`来监听.
- ida调试版本的so和正在运行的so不一致
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518165932.png)
- jdb连接失败
![](https://gitee.com/nisodaisuki/pictures/raw/master/img/20200518173807.png)
- **ida打开的so文件名要和运行apk中的so名一致. 如果不一致会导致断点无效.** 1.如果我们下断点的位置非常早,可以启动JDWP调试器的目的提前在原生层下断点:am start -D -n com.example.testarm/.MainActivity,否则直接IDA附加就可以了。
2.要知道安卓分为两个调试器一个是JDWP调试器用来调试虚拟机,另一个是原生调试器用来调试so代码。IDA附加后仅仅连接了原生调试器,此时JDWP还在等待中程序并未运行。
3.DDSM查看和jdb附加的目的就是为了正在等待JDWP调试器的程序恢复运行,在这里可以不借用DDMS和jdb来恢复运行,可以借助JEB附加连接JDWP调试器再分离同样可以达到目的。 nisodaisuki 发表于 2020-5-20 17:39
ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选 ...
小木曾雪菜 发表于 2020-5-20 17:00
触发断点那里为什么会弹出来对话框呀?
ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选择了 不再提示, 以后就没有了 看了不会系列! 支持楼主分享! 求最后图那个壁纸{:1_932:} 酷鸟 发表于 2020-5-20 14:21
求最后图那个壁纸
https://www.jianguoyun.com/p/DfK3gBIQh-vgBxiQ0poD 触发断点那里为什么会弹出来对话框呀? 小木曾雪菜 发表于 2020-5-20 17:00
触发断点那里为什么会弹出来对话框呀?
ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选择了 不再提示, 以后就没有了, ida可以用模拟器调试吗https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif 期待多交流 感谢楼主的教程