返回

代码层面基于 unicorn + capstone 动态分析生成 objc_msgSend 交叉引用并导入 IDA

IOS

众所周知,在使用 IDA 进行 iOS 逆向工程时,仅仅依赖静态分析很难直接确定方法的 Callers,借助于 Decompiler 和 IDA 自己的分析能力仅能分析出非常有限的 objc_msgSend 交叉引用。目前一般的解法是借助于动态调试的 backtrace 或是 Hook 相关的方法,这些方法往往因为依赖大量的 IDA 手动分析工作量巨大,而对于一些拥有众多 Objective-C 方法的 App,分析起来更是苦不堪言。本文将为大家介绍一种利用 unicorn 和 capstone 动态分析生成 objc_msgSend 交叉引用并导入 IDA 的方法。该方法可以帮助逆向工程师更好地了解 iOS 应用的运行时行为,并定位潜在的安全漏洞。

一、原理

Unicorn 是一个功能强大的仿真框架,可以模拟各种硬件和软件平台。Capstone 是一个轻量级的反汇编框架,可以将机器码反汇编成汇编指令。

我们可以利用 Unicorn 来仿真 iOS 应用的运行,并将 Capstone 集成到 Unicorn 中,这样就可以在 Unicorn 仿真 iOS 应用时,使用 Capstone 对 iOS 应用的机器码进行反汇编。

在反汇编过程中,我们可以提取出所有的 objc_msgSend 调用,并将这些调用记录到一个文件中。

然后,我们可以使用 IDA 将这个文件导入到 IDA 中,这样就可以在 IDA 中查看所有的 objc_msgSend 调用了。

二、实现

1. 准备工作

首先,我们需要安装 Unicorn 和 Capstone。

brew install unicorn capstone

然后,我们需要下载 iOS 应用的二进制文件。

xcrun -sdk iphoneos lipo -extract MyApp.app/MyApp MyApp.bin

2. 编写 Unicorn 脚本

接下来,我们需要编写一个 Unicorn 脚本,用于仿真 iOS 应用。

import unicorn
import capstone

# 加载 iOS 应用的二进制文件
unicorn_emu = unicorn.Unicorn(unicorn.UC_ARCH_ARM64, unicorn.UC_MODE_ARM)
unicorn_emu.mem_map(0x100000000, 0x10000000)
unicorn_emu.mem_write(0x100000000, open("MyApp.bin", "rb").read())

# 集成 Capstone
cs = capstone.Cs(capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM)

# 设置 Unicorn 的回调函数
def hook_code(uc, address, size, user_data):
    # 反汇编机器码
    for i in cs.disasm(unicorn_emu.mem_read(address, size), address):
        # 提取 objc_msgSend 调用
        if i.mnemonic == "bl" and i.op_str.startswith("objc_msgSend"):
            # 记录 objc_msgSend 调用
            with open("objc_msgSend.txt", "a") as f:
                f.write("%#x\n" % i.address)

# 设置 Unicorn 的回调函数
unicorn_emu.hook_add(unicorn.UC_HOOK_CODE, hook_code, None)

# 仿真 iOS 应用
unicorn_emu.emu_start(0x100000000, 0x100000000 + 0x10000000)

3. 导入 IDA

最后,我们可以使用 IDA 将 objc_msgSend.txt 文件导入到 IDA 中。

File -> Import -> Text File...

选择 objc_msgSend.txt 文件,然后点击 "OK" 按钮。

IDA 会将 objc_msgSend.txt 文件中的所有地址导入到 IDA 中。

三、结语

通过本文介绍的方法,我们可以轻松地生成 iOS 应用的 objc_msgSend 交叉引用并导入 IDA。这可以帮助逆向工程师更好地了解 iOS 应用的运行时行为,并定位潜在的安全漏洞。