nisodaisuki 发表于 2020-5-20 13:43

那些年用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名一致. 如果不一致会导致断点无效.**

金罡 发表于 2020-5-21 17:30

1.如果我们下断点的位置非常早,可以启动JDWP调试器的目的提前在原生层下断点:am start -D -n com.example.testarm/.MainActivity,否则直接IDA附加就可以了。
2.要知道安卓分为两个调试器一个是JDWP调试器用来调试虚拟机,另一个是原生调试器用来调试so代码。IDA附加后仅仅连接了原生调试器,此时JDWP还在等待中程序并未运行。
3.DDSM查看和jdb附加的目的就是为了正在等待JDWP调试器的程序恢复运行,在这里可以不借用DDMS和jdb来恢复运行,可以借助JEB附加连接JDWP调试器再分离同样可以达到目的。

cbhblb20211111 发表于 2021-11-16 13:41

nisodaisuki 发表于 2020-5-20 17:39
ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选 ...


小木曾雪菜 发表于 2020-5-20 17:00
触发断点那里为什么会弹出来对话框呀?

ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选择了 不再提示, 以后就没有了

如果我是DJ? 发表于 2020-5-20 13:51

看了不会系列!

不明嚼栗的根号2 发表于 2020-5-20 13:55

支持楼主分享!

酷鸟 发表于 2020-5-20 14:21

求最后图那个壁纸{:1_932:}

nisodaisuki 发表于 2020-5-20 15:19

酷鸟 发表于 2020-5-20 14:21
求最后图那个壁纸

https://www.jianguoyun.com/p/DfK3gBIQh-vgBxiQ0poD

小木曾雪菜 发表于 2020-5-20 17:00

触发断点那里为什么会弹出来对话框呀?

nisodaisuki 发表于 2020-5-20 17:39

小木曾雪菜 发表于 2020-5-20 17:00
触发断点那里为什么会弹出来对话框呀?

ida打开的文件是本地的文件, 动态调试的时候 运行的是apk中的so, ida要你确定这两个文件是一样..如果选择了 不再提示, 以后就没有了,

yuhan694 发表于 2020-5-20 19:49

ida可以用模拟器调试吗https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

A00 发表于 2020-5-20 21:47

期待多交流

夜步城 发表于 2020-5-21 00:00

感谢楼主的教程
页: [1] 2 3
查看完整版本: 那些年用ida动态调试so所踩坑坑