- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
22.1 IDA 中的常用快捷键
前一章中使用 IDA 工具静态分析 so 文件,通过分析 ARM 指令,来获取破解信息,比如用打印的 log 信息来破解 apk。那时候就已经介绍了如何使用 IDA 工具,如图 22-1 所示。
图 22-1 IDA 工具的窗口视图
IDA 工具有多个窗口,也有多个视图,用到最多的如下所示:
·Function Window 对应 so 函数区域:在这里可以使用 ctrl+f 进行函数的搜索。
·IDA View 对应 so 中代码指令视图:在这里可以查看具体函数对应的 ARM 指令代码。
·Hex View 对应 so 的十六进制数据视图:在这里可以查看 ARM 指令对应的数据等。
下面先介绍 IDA 中一些常用的快捷键。
1.ARM 指令转化成 C 语言快捷键
强大的 F5 快捷键可以将 ARM 指令转化成可读的 C 语言,能帮助分析,如下所示:
首先选中需要翻译成 C 语言的函数,然后按下 F5,如下所示:
下面还需要做一步,就是还原 JNI 函数方法名。一般 JNI 函数方法名是一个指针加上一个数字,比如 v3+676。然后将这个地址作为一个方法指针进行方法调用,并且第一个参数就是指针自己,比如(v3+676)(v3…)。这实际上就是在 JNI 里经常用到的 JNIEnv 方法。因为 IDA 并不会自动对这些方法进行识别,所以当对 so 文件进行调试的时候经常会见到却搞不清楚这个函数究竟在干什么,因为这个函数实在是太抽象了。解决方法非常简单,只需要对 JNIEnv 指针做一个类型转换即可。比如说上面提到 a1 和 v4 指针,如下所示:
可以选中 a1 变量,然后按一下 y 键,如图 22-2 所示。
图 22-2 选中变量
然后将类型声明为 JNIEnv*,如图 22-3 所示。
图 22-3 设置 JNIEnv*指针
确定之后再来看,如下所示:
修改之后是不是瞬间清晰了很多。另外还总结了所有 JNIEnv 方法对应的数字、地址以及方法声明,如下所示:
2.打开字符串内容窗口快捷键
用 Shirt+F12 快捷键快速打开 so 中所有的字符串内容窗口,如图 22-4 所示。
图 22-4 so 中字符串内容窗口
有时候,字符串是一个非常重要的信息,特别是对于破解的时候,可能就是密码,或者是密码库信息。
3.定位 so 中段地址快捷键
Ctrl+S 快捷键有两个用途,在正常打开 so 文件的 IDA View 视图的时候,可以查看 so 对应的段信息,如图 22-5 所示。
图 22-5 打开 so 中的段信息
可以快速得到一个段的开始位置和结束位置,不过这个位置是相对位置,不是 so 映射到内存之后的位置,关于 so 中的段信息,已经在前面章节中详细介绍。
当在调试页面的时候,用 Ctrl+S 键可以快速定位到想要调试的 so 文件映射到内存的地址,如图 22-6 所示。
图 22-6 定位调试的 so 文件的内存地址
一般一个程序肯定会包含多个 so 文件,比如系统的 so 文件就有好多,一般都是在/system/lib 下面,当然也有自己的 so,这里可看到开始位置和结束位置就是这个 so 文件映射到内存中,如下所示:
这里可以使用 cat 命令查看一个进程的内存映射信息:
看到映射信息中有多个 so 文件,其实这不是多个 so 文件,而是 so 文件中对应的不同 Segement 信息被映射到内存中的,一般是代码段、数据段等,因为需要调试代码,所以只关心代码段。代码段有一个特点就是具有执行权限 x,只需要找到权限中有 x 的那段数据即可。
4.跳转到指定地址快捷键
在 IDA 调试页面的时候,可以使用 G 键快速跳转到指定的内存位置,如图 22-7 所示。
图 22-7 跳转到指定内存位置
这里的跳转地址是可以算出来的。比如现在想跳转到 A 函数,然后下断点,那么可以使用上面说到的 Ctrl+S 查找到 so 文件的内存开始的基地址,然后再用 IDA View 中查看 A 函数对应的相对地址,相加就是绝对地址,然后跳转到即可,比如这里的:Java_cn_wjdiankong_encryptdemo_MainActivity_isEquals 函数的 IDA View 中的相对地址是(也就是 so 文件的地址)E9C,如下所示:
上面看到 so 文件映射到内存的基地址为 74FE4000,如下所示:
那么跳转地址就是 74FE4000+E9C=74FE4E9C。
注意,只要程序没有退出,一般这里的基地址在运行中的值就不会变,因为程序的数据已经加载到内存中了。同时相对地址是永远不会变的,只有在修改 so 文件的时候,文件的大小改变了,可能相对地址会改变,其他情况下不会改变,相对地址就是数据在整个 so 文件中的位置。这里可以看到函数映射到内存中的绝对地址,如下所示:
有时候发现跳转到指定位置之后,看到的全是 DCB 数据,这时候选择函数地址,点击 P 键就可以看到 ARM 指令源码了,如下所示:
5.调试快捷键
调试快捷键包括:F8 单步调试,F7 单步进入调试,如下所示:
上面找到函数地址之后,可以下断点了,下断点很简单,点击签名的绿色圈点,变成红色条目即可,然后可以点击 F9 快捷键,或者点击运行按钮(绿色右箭头),即可运行程序,如图 22-8 所示。
图 22-8 F9 快捷键
其中还有暂停和结束按钮。运行之后再点击 so 的 native 函数,触发断点逻辑,如下所示:
这时候,看到进入调试界面,点击 F8 可以单步调试,看到有一个 PC 指示器。其实在 ARM 中 PC 是一个特殊的寄存器,用来存储当前指令的地址。
总结一下 IDA 在调试 so 文件的时候需要用到的快捷键:
·Shift+F12 快速查看 so 文件中的字符串信息。
·F5 可以将 ARM 指令转化成可读的 C 代码,同时可以使用 Y 键,修改 JNIEnv 的函数方法名。
·Ctrl+S 有两个用途,在 IDA View 页面中可以查看 so 文件的所有段信息,在调试页面可以查看程序所有 so 文件映射到内存的基地址。
·G 可以在调试界面快速跳转到指定的绝对地址,进行下断点调试。如果跳转到目的地址之后,发现是 DCB 数据的话,可以使用 P 键进行转化。
·F7 可以单步进入调试,F8 键可以单步调试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论