使用 lldb 对应用砸壳

进行 iOS 越狱开发的第一步,通常就是对从 AppStore 上下载安装的应用进行砸壳。我们常用的工具就是 dumpdecrypted 或者 Clutch,关于这两个工具的使用,在之前的文章 已经进行过介绍了。

事实上,除了使用工具帮助我们进行砸壳,我们还可以直接使用 lldb 进行手动砸壳。

原理

手动砸壳的原理其实很简单,在应用被加载完成后,对应的解密工作就已经完成了。

这个时候,我们就可以通过 loadCommand 中的 LC_ENCRYPTION_INFOLC_ENCRYPTION_INFO_64 信息,找到对应的偏移,然后将解密后的数据从内存中 dump 出来,再使用这份数据对原来的可执行文件进行补丁,这样我们就得到了一个砸过壳的可执行文件了。

了解过原理后,下面就可以直接动手了。

准备工作

在开始真正进行砸壳之前,要先将 iphone 设备上的可执行文件拷贝到本地。

由于从 AppStore 安装的应用都是在 Application 目录下的,因此我们可以使用 ps 配合 grep 命令来找到我们的目标应用。

iphone$ ps -e | grep Application

  2815 ??         0:02.32 /var/mobile/Containers/Bundle/Application/577995FB-298A-40DC-88BE-FC9C7804D1E8/LuoJiFM-IOS.app/LuoJiFM-IOS

接着就可以使用 scp 命令将可执行文件拷贝到本机上。

# 拷贝到 Mac 的桌面上
osx$ scp root@<device_ip>:/var/mobile/Containers/Bundle/Application/577995FB-298A-40DC-88BE-FC9C7804D1E8/LuoJiFM-IOS.app/LuoJiFM-IOS ~/Desktop

查看可执行文件信息

将可执行文件拷贝到本地之后,我们就可以使用 otool 来查看它的信息了。

osx$ otool -fh LuoJiFM-IOS

Fat headers
fat_magic 0xcafebabe
nfat_arch 2
architecture 0
    cputype 12
    cpusubtype 9
    capabilities 0x0
    offset 16384
    size 21302352
    align 2^14 (16384)
architecture 1
    cputype 16777228
    cpusubtype 0
    capabilities 0x0
    offset 21331968
    size 25417728
    align 2^14 (16384)
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      12          9  0x00           2    63       6280 0x00218085
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777228          0  0x00           2    63       7008 0x00218085

可以看到这个可执行文件是一个多架构的文件,它包含 32 位与 64 位的架构。选择想要砸壳的架构查看它的加密信息,我这里选择的是 64 位架构。

osx$ cd ~/Desktop
osx$ otool -arch arm64 -l LuoJiFM-IOS | grep crypt

     cryptoff 16384
    cryptsize 19972096
      cryptid 1

其中,cryptoff 是加密信息的偏移,cryptsize 是加密信息的大小,而 cryptid 为 1 证明这个可执行文件是加密的。

有了这些信息后,我们就可以开始进行砸壳了。

使用 lldb 砸壳

配合 debugserver 并祭出 lldb 神器,附加到进程上。

iphone$ debugserver *:1234 -a LuoJiFM-IOS
# debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-320.2.89 for arm64.
# Attaching to process LuoJiFM-IOS...
# Listening to port 1234 for a connection from *...

osx$ lldb
(lldb) process connect connect://<device_ip>:1234

Process 2815 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x0000000196d24e0c libsystem_kernel.dylib` mach_msg_trap  + 8
libsystem_kernel.dylib`mach_msg_trap:->  0x196d24e0c <+8>: ret
libsystem_kernel.dylib'mach_msg_overwrite_trap:    0x196d24e10 <+0>: mov    x16, #-0x20
    0x196d24e14 <+4>: svc    #0x80
    0x196d24e18 <+8>: ret
libsystem_kernel.dylib'semaphore_signal_trap:    0x196d24e1c <+0>: mov    x16, #-0x21
    0x196d24e20 <+4>: svc    #0x80
    0x196d24e24 <+8>: ret
libsystem_kernel.dylib'semaphore_signal_all_trap:    0x196d24e28 <+0>: mov    x16, #-0x22

接着,找出可执行文件的偏移地址:

(lldb) image list LuoJiFM-IOS
[  0] 426D3B7D-5433-3EA3-9E8C-384830B6A104 0x0000000100010000 /private/var/mobile/Containers/Bundle/Application/577995FB-298A-40DC-88BE-FC9C7804D1E8/LuoJiFM-IOS.app/LuoJiFM-IOS (0x0000000100010000)

在此例中,偏移地址为 0x0000000100010000

然后,dump 出可执行文件被加密部分的二进制信息。命令如下:

(lldb) memory read --force --outfile ./decrypted.bin --binary --count <cryptsize> <image offset>+<cryptoff>

将以上命令的 cryptsizeimage offset 以及 cryptoff 都替换为你自己的数据。对于这个例子而言,实际的命令如下:

(lldb) memory read --force --outfile ./decrypted.bin --binary --count 19972096 0x0000000100010000+16384

# 19972096 bytes written to './decrypted.bin'

有了这个补丁文件,就可以对原来的可执行文件打补丁了。开始之前,先备份下原来的可执行文件。

# 先退出 lldb 并回到桌面
(lldb) exit
osx$ cd ~/Desktop
osx$ cp LuoJiFM-IOS LuoJiFM-IOS-bak

decrypted.bin 文件的内容写入到可执行文件中:

osx$ dd seek=21348352 bs=1 conv=notrunc if=./decrypted.bin of=./LuoJiFM-IOS

# 19972096+0 records in
# 19972096+0 records out
# 19972096 bytes transferred in 25.058427 secs (797021 bytes/sec)

上面命令中的 21348352=21331968+16384,其中 21331968 是架构的偏移(即上面 otool -fh 打印出的信息中对应架构的 offset 字段),而 16384 是 cryptoff 的值。

至此,我们就使用 lldb 完成对应用的手动砸壳。

最后,为了让可执行文件适用于某些应用(如 class-dump-z),我们需要将 cryptid 字段手动置为 0。这一步可以通过 MachOView 来完成。

将上面的 Cyrpt ID 改成 0,并保存即可。

验证

为了验证我们的砸壳过程是否成功,可以使用 class-dump 来测试导出头文件。如果头文件导出成功,则说明我们已经成功砸壳了。

osx$ class-dump --arch arm64 -H LuoJiFM-IOS -o Headers
osx$ cd Headers
osx$ ls -l | wc -l
#    2989

可以看到,我们导出了 2989 个头文件,说明整个砸壳过程是正确的。

小结

大概瞄了下 dumpdecrypted 的源码,貌似它的原理就是本篇文章中使用的方法。而对于 Clutch,由于还没有看过它的源码,因此目前还不知道它的实现方法,之后有时间来学习学习。

参考资料

关注

如果你喜欢这篇文章,可以关注我的公众号,随时获取我最新的博客文章。

qrcode_for_gh_6e8bddcdfca3_430.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容