本文是最近在使用 IDA 的过程中总结的小技巧,可供初学者适当参考。文中提及了三个使用 IDA 时会遇到的问题以及解决方法:
应用解密
查看 inline block 变量的函数定义
结构体变量成员的读写
应用解密
在使用 IDA 或 class-dump 这些工具前,必须先对应用进行解密。这里会用到一个叫 dumpdecrypted 的工具。
下载 dumpdecrypted 的源代码,在 Mac 上编译生成 dumpdecrypted.dylib,然后把 dumpdecrypted.dylib 拷贝到 iOS 设备上的一个路径,例如 /var/root。
ssh 到该 iOS 设备,改变当前目录为 /var/root,执行如下指令
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/4DB7910D-3235-4123-8CF7-6DF41C178F2E/ConfigWiFi.app/ConfigWiFi
这里 /var/mobile/Applications/4DB7910D-3235-4123-8CF7-6DF41C178F2E/ConfigWiFi.app/ConfigWiFi 是需要解密的应用的路径。
解密后的文件会在 /var/root 上生成。
查看 inline block 变量的函数定义
在 IDA 有时会遇到代码里用到 inline block 变量,有一个简单的方法可以找到这个 block 的定义。
首先在 IDA 左边的 Functions window 定位用到使用这个 block 的方法,然后点击 start,使窗口内的函数按地址从低到高排序。
这时紧接着这个方法的 sub_58F30, sub_590C8, sub_590E0 三个函数就是要找的 block 的定义。第一个函数就是 inline block 的定义。第二和第三个是这个 block 的 retain 和 release 的操作。
要注意的是,这种查看 inline block 变量的函数定义的方法只是在使用 IDA 的过程中发现的,至少目前还没遇到过不符合这个规律的情况。以后还需要通过研究 block 的内部实现来得到的理论支持。
结构体变量成员的读写
在 IDA 有时会遇到代码里对结构体变量的读写的情况,这时 IDA 反编译的伪代码看起来会很不方便。
在 IDA 中找到调用这个函数的方法,可以找到这个结构体变量的类型为 struct WifiGetNearByListHandler 。
这时先使用 class-dump 导出头文件,在生成的头文件中,有一个名字是 CDStructures.h 的文件。这个文件内有程序中用到的所有结构体的定义。
注意到 CDStructures.h 内有一个很熟悉的结构体类型的定义。
现在可以马上新建一个文件,例如 handler.h,文件内容如下:
然后在 IDA 导入 handler.h,按如下进入菜单选择文件。
这个时候可以回到之前对结构体变量成员读写的伪代码处,修改这个变量的类型。如图右键单击。
在弹出来的对话框中选择 WifiGetNearByListHandler ,点击 OK。
这时候伪代码中对结构体成员读写的部分会变得可读性更高。