iOS逆向(五)-lldb手动砸壳并修复Mach-O

iOS逆向(五)-lldb手动砸壳并修复Mach-O

ios上一键脱壳的工具非常多,但原理基本都相同。都是运行app后从内存中dump出解密后的内容再重写回文件,替换原本的加密的二进制文件重新打包生成ipa,就完成了脱壳。

了解脱壳的原理,我们可以尝试使用手动脱壳,这样对ios的逆向理解也会更加深刻。

难度

★★☆☆☆

工具

  • 越狱IOS 14.4
  • ipatool
  • otool
  • lldb
  • debugserver
  • dd
  • 010 editor

工具安装

ipatool

https://github.com/majd/ipatool

ipatool是一个命令行工具,可以在App Store上搜索 iOS 应用程序并下载应用程序包的副本,称为ipa文件。而使用ipatool下载的ipa文件是未经过砸壳,正好方便手动砸壳。

通过命令行安装,然后登录自己的AppStore的账号。

brew tap majd/repo
brew install ipatool

lldb和otool

LLDB全称Low Level Debugger ,是轻量级的高性能调试器,内置于Xcode。在macOS系统中,可以使用Xcode命令行工具来安装LLDB和otool。

xcode-select --install

debugserver

LLDB和debugserver通信过程

在越狱设备上安装debugserver非常方便,直接在cydia商店搜索安装即可。

手动砸壳过程

ipatool下载ipa包

我们以某火锅app为例,使用ipatool搜索关键词找到对应的bundleID然后下载。

ipatool --format json search -l 5 海底捞
ipatool download -b app.haidilao.HaidilaoMobileDistribution --purchase

otool分析mach-o文件

下载完成后先解压ipa包。

unzip app.haidilao.HaidilaoMobileDistribution_553115181_8.3.8.ipa -d haidilao

将ipa解压到haidilao的目录。

cd haidilao/Payload/HaiDiLao.app

其中与包名同名的文件就是要解密的二进制文件。

otool -arch arm64 -l ./HaiDiLao | grep -C5 LC_ENCRYPTION

每个字段的含义如下:

  • cmd:这是load command的类型,表示这个load command包含了64位的加密信息。
  • cmdsize:表示此load command的大小为24字节。
  • cryptoff:表示加密数据在文件中开始的偏移量,单位是字节。表示加密数据从文件的16384字节处开始。
  • cryptsize:表示加密数据的大小,单位是字节。表示加密数据的大小为31014912字节。
  • cryptid:这是一个标志,表示文件是否被加密。如果cryptid的值为0,那么文件未被加密。
  • pad:这是一个填充字段,用于保证数据对齐。

其中 cryptoffcryptsize 就是文件的加密位置的起始偏移地址和大小。这两个值需要记下来,后面会用到。

debugserver 监听端口

在ios设备上运行debugserver监听端口,这里我们用的usb数据线链接的iOS设备,就用iproxy转发端口映射。

//在mac上执行
iproxy 2222 22 &
iproxy 8888 8888 &
ssh root@127.0.0.1 -p2222

//在ios设备上执行
debugserver 127.0.0.1:8888 -a HaiDiLao

LLDB dump内存二进制文件

process connect connect://127.0.0.1:8888
image list -f -o HaiDiLao
memory read 0x00000001047f8000+16384 -c 31014912 --force --binary -outfile ./HaiDiLaoDecrypted

利用memory命令从内存中dump出解密后的二进制数据,保存到文件。

image list -f -o HaiDiLao
[  0] /private/var/containers/Bundle/Application/B24DD689-8666-41FA-AC86-12B0689352A0/HaiDiLao.app/HaiDiLao 0x00000000047f8000(0x00000001047f8000)

需要注意的是这里不是获取ASLR的偏移量,而是要内存加载地址(0x00000001047f8000)。

修复Mach-O头部

因为dump出来的数据是没有Mach-O头部信息的,需要修复才能使用。这里采用最快捷的办法,将dump出来的数据重新写回到砸壳前的文件从而替换加密的数据。

dd if=./HaiDiLaoDecrypted of=./HaiDiLao bs=1 seek=16384 conv=notrunc

用dd命令将文件按照偏移量重新覆写回去。

这里用010 editor把Mach-o修改为cryptid重新修改为0。

zip -r haidilao.ipa haidilao/

使用zip命令重新打包回ipa文件,就完成手动砸壳了。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论