IDA 使用小技巧

本文是最近在使用 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。

这时候伪代码中对结构体成员读写的部分会变得可读性更高。

你可能感兴趣的:(IOS开发)