首页
社区
课程
招聘
[原创]dumpdecrypted砸壳高版本iOS(如iOS12)的正确姿势
2020-12-1 17:51 80008

[原创]dumpdecrypted砸壳高版本iOS(如iOS12)的正确姿势

2020-12-1 17:51
80008

dumpdecrypted砸壳高版本iOS(如iOS12)的正确姿势

 

目录

引言

​ 几年前用dumpdecrypted砸过iOS10系统中应用的壳,最近又有砸壳的需求,不过是iOS12系统。于是完全按照当年在iOS10中的砸壳步骤在iOS12中砸壳,遇到了种种错误。求助于百度和谷歌,用关键字"dumpdecrypted iOS12"搜索,得到的结论全部是dumpdecrypted在iOS12及其更高版本的iOS系统中不行了,然后就介绍其他的砸壳工具,如CrackerXI

 

​ 本人试了一下CrackerXI砸壳确实简单易用,但dumpdecrypted为什么不行却没有找到答案,而且由于dumpdecrypted的砸壳原理是注入动态库dylib进目标进程来dump相关解密数据,难道意味着在高版本的iOS中,也无法注入dylib做点其他事情了吗? 本着探索的精神在经过多次研究实验后,最后成功用dumpdecrypted砸出iOS12.1应用的壳。由于网上并没有看到dumpdecrypted砸高版本iOS系统中应用的壳的文章,故花点时间写个分享献给有需要的人。

dumpdecrypted砸壳高版本iOS过程

砸壳系统环境介绍

类别
电脑系统 macOS Catalina 版本10.15.6(19G20201)
手机环境系统 iphone 6 Plus 版本12.1.2(16C101) 已越狱并通过Cydia安装cycript、OpenSSH
Xcode版本 Xcode 12.1 对应的iOS SDKs版本号iOS 14.2

dumpdecrypted在高iOS系统中砸壳的正确步骤

(1) 源码下载:从如下地址下载源码 https://github.com/stefanesser/dumpdecrypted

 

(2) 修改Makefile文件:

 

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64改成 GCC_UNIVERSAL=$(GCC_BASE) -arch arm64

 

CFLAGS = 改成CFLAGS = -target arm64-apple-ios12.1

 

(3) 直接make编译生成dumpdecrypted.dylib

 

输出如下所示:

1
2
3
4
jay@MacBook-Pro dumpdecrypted % make
`xcrun --sdk iphoneos --find gcc` -Os -target arm64-apple-ios12.1  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c
`xcrun --sdk iphoneos --find gcc` -Os -target arm64-apple-ios12.1  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.2.sdk/System/Library/PrivateFrameworks'

(4) 用codesign和个人调试证书给dumpdecrypted.dylib签名:

 

security find-identity -v -p codesigning 查找可用的证书,然后用找到的证书签名

 

codesign --force --verify --verbose --sign "找到的可用证书名称" dumpdecrypted.dylib

 

本机输出如下所示:

1
2
3
4
5
6
jay@MacBook-Pro dumpdecrypted % security find-identity -v -p codesigning
  1) 3A1B91863D16D2B252A346CDB242AF451A73DEA1 "Apple Development: xx@qq.com (UN84ST6FLY)"
     1 valid identities found
jay@MacBook-Pro dumpdecrypted % codesign --force --verify --verbose --sign "Apple Development: xx@qq.com (UN84ST6FLY)" dumpdecrypted.dylib
dumpdecrypted.dylib: signed Mach-O thin (arm64) [dumpdecrypted]
jay@MacBook-Pro dumpdecrypted %

(5)签过名的dumpdecrypted.dylib上传iphone手机的/usr/lib/目录:scp -r dumpdecrypted.dylib root@10.0.52.63:/usr/lib/

 

(6)iphone运行要脱壳的应用,ssh root@10.0.52.63 连上手机,用ps -e | [grep -i xxx] 查看进程id和进程名

 

(7)cycript注入进程查看应用对应的Documents目录:

 

cycript -p 进程id值pid 注入进程 (待机等状态有时会导致注入卡主,可以iphone上随便动一下应用)

 

URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

 

本机输出如下所示:

1
2
3
4
5
6
shangshuhede-iPhone:~ root# ps -e | grep -i reader
12255 ??         0:04.09 /var/containers/Bundle/Application/35992D04-EB51-4A84-8F95-D9495004933E/YYReader.app/YYReader
12484 ttys002    0:00.01 grep -i reader
shangshuhede-iPhone:~ root# cycript -p 12255
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents/"

PS: 如果不确定进程是否正确,可以cycript中运行:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];查看应用名称,输出16进制字符串,将16进制字符串直接放到python里print("\xaa\xbb"')一下即可输出中文。

 

(8)cd到应用的Documents目录下,su mobile 切换到mobile账户下,然后用如下命令开始砸壳

 

DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib 进程名

 

本机输出如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
shangshuhede-iPhone:~ root# cd /var/mobile/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents
shangshuhede-iPhone:/var/mobile/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents root# ls
FP_IP.txt  FP_SEQ.txt  NAError  YYReader.decrypted  come2  first2  last2  tracker.db  userDefaults.plist/
shangshuhede-iPhone:/var/mobile/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents root# su mobile
shangshuhede-iPhone:~/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents mobile$ DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib /var/containers/Bundle/Application/35992D04-EB51-4A84-8F95-D9495004933E/YYReader.app/YYReader
mach-o decryption dumper
 
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
 
[+] detected 64bit ARM binary in memory.
[+] offset to cryptid found: @0x102950fc8(from 0x102950000) = fc8
[+] Found encrypted data at address 00004000 of length 26984448 bytes - type 1.
[+] Opening /private/var/containers/Bundle/Application/35992D04-EB51-4A84-8F95-D9495004933E/YYReader.app/YYReader for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a plain MACH-O image
[+] Opening YYReader.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset fc8
[+] Closing original file
[+] Closing dump file
shangshuhede-iPhone:~/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents mobile$

ls查看,有文件YYReader.decrypted 表示脱壳成功。

 

(9)拉出砸壳后的文件进行分析: scp root@10.0.52.63:/remotefile localfile

 

本机输出如下所示:

1
2
3
4
jay@MacBook-Pro dumpdecrypted % scp root@10.0.52.63:/var/mobile/Containers/Data/Application/78D09E74-BB1F-4871-BBC1-6E715C18718A/Documents/YYReader.decrypted YYReader.decrypted
root@10.0.52.63's password:
YYReader.decrypted                                                                                                             100%   32MB   9.4MB/s   00:03
jay@MacBook-Pro dumpdecrypted %

各种错误汇总

Killed: 9错误

这个错误没有任何其他提示,多种情况都会出现Killed: 9错误,包括:

 

(1) 未su mobile切换到mobile用户下而直接在root用户下运行注入dylib脱壳,

 

(2) dylib未签名或采用旧的ldid -S xx.dy

[-] Failed opening: Operation not permitted

未在Documents目录下运行,iOS10可以在应用的.app目录下注入脱壳,新版iOS12已经不行。

Abort trap: 6

这个错误在控制台会附带其他错误信息提示,根据错误信息提示不同可分为如下几类:

dyld: Symbol not found: ___chkstk_darwin

找不到符号错误,原因是编译dylib默认SDKs版本(本人的Xcode12.2 默认对应的iOS14.2)与iphone系统版本(本人的iOS12.1)不匹配, iOS12.1对应的Xcode版本为Xcode10.1(不同Xcode对应的sdk版本可参考:https://en.wikipedia.org/wiki/Xcode,也可通过xcodebuild -showsdks命令查看当前环境的SDK版本),网上千篇一律说安装多个版本Xcode的,然后用xcode-select命令选择对应的版本,当时下Xcode花了不少时间的,要多下一个10多G的Xcode只为了编译一个dylib,想想都可怕。当时想到Xcdoe写程序是可以指定目标操作系统,如下图所示:

 

通过修改该iOS系统参数值结合生成的命令行参数(PS:Xcode老早就已经不支持直接编译dylib了),找到-target arm64-apple-ios12.1参数,最后经过试验确实通过增加编译选项-target arm64-apple-ios12.1解决。

 

完整错误提示如下:

1
2
3
4
5
dyld: Symbol not found: ___chkstk_darwin
  Referenced from: /usr/lib/dumpdecrypted3.dylib (which was built for iOS 14.2)
  Expected in: /usr/lib/libSystem.B.dylib
 in /usr/lib/dumpdecrypted3.dylib
Abort trap: 6

code signature invalid

采用旧版ldid -S xx.dylib等不正确的签名方式,

 

完整错误提示如下:

1
2
3
4
dyld: warning: could not load inserted library '/usr/lib/dumpdecrypted.dylib' into hardened process because no suitable image found.  Did find:
    /usr/lib/dumpdecrypted.dylib: code signature invalid for '/usr/lib/dumpdecrypted.dylib'
 
Abort trap: 6

[说明:在iOS12中,内核增加了CMS(Cryptographic Message Syntax)校验,而业界常用的自签名工具ldid以及jtool中CMS都是为空的,导致上述解决方案失效][1]。

file system sandbox blocked mmap() of 'dumpdecrypted.dylib'

未将dylib放到/usr/lib/目录下

 

新版iOS不支持将dylib放在.app或Documents目录下来注入。

 

完整错误提示如下:

1
2
3
4
dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.  Did find:
    dumpdecrypted.dylib: file system sandbox blocked mmap() of 'dumpdecrypted.dylib'
...
Abort trap: 6

[-] This mach-o file is not encrypted. Nothing was decrypted.

dylib的版本跟iphone系统不匹配,我从网上下了一个低版本的dylib,添加签名后在系统运行提示了该错误。

 

完整错误提示如下:

1
2
3
4
5
6
mach-o decryption dumper
 
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
 
[+] detected 64bit ARM binary in memory.
[-] This mach-o file is not encrypted. Nothing was decrypted.

总结

​ 本文主要介绍了高版本iOS中用dumpdecrypted砸壳的过程,并汇总了各种错误情况,特别的通过对于增加编译选项-target arm64-apple-ios12.1来解决高版本Xcode中编译出dylib与目标iOS系统版本不兼容的问题。另外,注入dylib可以做的事情非常多,并不仅限于砸壳,故本文对于那些想注入dylib到目标进程做其他事情的人同样具有参考价值。

参考文件

https://www.freebuf.com/articles/terminal/184877.html "iOS 12完美越狱来了!漫谈iOS 12缓解机制"


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2020-12-1 18:08 被cjycjw编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (6)
雪    币: 63
活跃值: (783)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
CDGod 2020-12-2 11:01
2
0
Good
雪    币: 98
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
langjiawen 2020-12-18 10:35
3
0
有插件crackerXI1.4版本和bfdecrypt
雪    币: 3645
活跃值: (3818)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2021-1-25 10:49
4
0
支持下
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
llau 2022-11-24 12:29
5
0
Abort trap: 6
没有任何额外信息

环境
iOS 12.4.9

已改
GCC_UNIVERSAL=$(GCC_BASE) -arch arm64
CFLAGS = -target arm64-apple-ios12.4

......
objc[7854]: Class SSKeychain is implemented in both /System/Library/PrivateFrameworks/StoreServices.framework/StoreServices (0x1d37b1a90) and /var/containers/Bundle/Application/F544CC82-DA7C-4CD0-A33A-85E1ABBC3164/DingTalk.app/DingTalk (0x10ae92418). One of the two will be used. Which one is undefined.
Object_Creator constructor
Abort trap: 6
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
llau 2022-11-24 18:01
6
0

这个工具有没有verbose选项啥的,输出更详细的信息

最后于 2022-11-24 18:09 被llau编辑 ,原因:
雪    币:
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hustwcw 2023-5-6 15:19
7
0
使用上面的方案,在iOS16.2上成功砸壳。基于palera1n越狱,iPhone8。
游客
登录 | 注册 方可回帖
返回