转:http://blog.csdn.net/oyzhx/article/details/38339129
在《
iOS应用逆向工程》4.6.2节中,我们曾推荐使用iPhoneCake源的AppCrackr 1.7版给App砸壳。这种方式简单粗暴,省时省力,但正是因为它过于方便有木有,导致几乎所有iDevice用户都可轻松上手,随便亵玩,所以不少用户都拿它来破解程序,而不是学习《iOS应用逆向工程》,简直可以说是婶可忍叔不可忍!这也导致了iOS越狱开发社区普遍认为这个软件助长了盗版的气焰,没有脱离低级趣味,对iPhoneCake源进行了强烈谴责,责令其限期整改。迫于压力,iPhoneCake在前段时间将AppCrackr下架,而书中提到的xsellize源中的AppCrackr则是1.5旧版,已不能在高级系统中使用。所以,为了响应业界反盗版的呼声,提倡毛主席“自己动手丰衣足食”的革命精神,让“砸壳”这件事恢复单纯的研究目的,在这里我们会使用更偏geek一些的dumpdecrypted方式来给App砸壳,不再推荐AppCrackr、Clutch、Crackulous等纯UI方式。由于dumpdecrypted刚经历过一次大升级,目前网上可以找到的使用教程均已过期,所以这里我们手把手带大家进行一次完整的“砸壳 + class-dump”,请大家准备板凳瓜子汽水,开始围观。如果能对着电脑,边看边做,善莫大焉!楼猪才疏学浅,如有纰漏,敬请斧正,洗耳恭听,污言秽语,免开尊口,感谢支持!
1. 下载dumpdecrypted的源码
源码下载地址是
“https://github.com/stefanesser/dumpdecrypted/archive/master.zip”,下载后请将其解压至你习惯的位置,例如楼猪为“/Users/snakeninny/Code/”,解压后生成“/Users/snakeninny/Code/dumpdecrypted-master/”。
2. 确认你的iDevice系统版本
打开
“设置”,点击“通用”……喂!这个还要我教吗?像话吗!自己解决!今天是2014年2月26日,我小声问一句,看到这里的朋友,你的iDevice上跑的应该是是iOS 5/6/7吧?没有3和4的了吧?有的请举手我看一下,好的,没有。
3. 修改Makefile中的SDK字段
dumpdecrypted必须使用与iOS版本相同的SDK版本编译,才能正常工作。打开“终端(Terminal)”,输入
- xcrun --sdk iphoneos --show-sdk-path
复制代码
,查看输出,看看目前的默认SDK是什么版本,例如楼猪的是“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk”。这里分2种情况:
i. 如果你使用的iOS版本同以上输出的SDK版本符合(例如楼猪使用的正是iOS 7.0.4),则无需对dumpdecrypted工程中的文件作任何改动;
ii. 如果你使用的iOS版本同以上输出的SDK版本不符(例如楼猪的另一台iPhone 4S使用的是iOS 6.1.3,iPhone 4使用的是iOS 5.0.1,请问有谁想同土豪楼猪交朋友?仅限女生,请自拍一张素颜照片并@iOS应用逆向工程,择优录取哦亲),则需要更改Makefile中的
- SDK=`xcrun --sdk iphoneos --show-sdk-path`
复制代码
为iOS版本相同的SDK版本。什么,你只有一个SDK?去 https://developer.apple.com/downloads/index.action下载旧版本的Xcode,然后把里面的SDK提取出来。什么,不会提取?自己去Google一下,罚你今晚表睡觉了!提取出了旧版的SDK后,楼猪习惯把它们放在新版SDK相同的目录下,然后将
- SDK=`xcrun --sdk iphoneos --show-sdk-path`
复制代码
改为
- SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.X.sdk
复制代码
或
- SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.X.sdk
复制代码
,即iOS版本需要与SDK版本相同。注意,5.1版SDK编译出的dylib是向下兼容的,可以用于iOS5.0,6.1版SDK同理。
4. 修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c
如果你的iOS/SDK版本是7.0,则goto "这里继续:"。如果并不是7.0,则需要修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c。将Makefile中的
- GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64
复制代码
改为
- GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s
复制代码
,再将dumpdecrypted.c第76行的
- if (lc->cmd ==LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)
复制代码
改成
- if(lc->cmd == LC_ENCRYPTION_INFO)
复制代码
,保存。这里继续:接着直接cd到“/Users/snakeninny/Code/dumpdecrypted-master/”下,然后输入“make”并回车,生成“/Users/snakeninny/Code/dumpdecrypted-master/dumpdecrypted.dylib”。
5. 太麻烦?直接下载楼猪编译好的文件
https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_5.dylib
https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_6.dylib
https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_7.dylib
打开链接后,点击“Raw”即可下载。
6. 将dumpdecrypted.dylib通过scp或iFunBox等工具拷贝至iOS
楼猪习惯放在“/var/tmp/”下,这里大家随意就好。
7. 定位倒霉催的App的可执行文件
iFunBox,iFile,还是
- find /var/mobile/Applications/ -name Victim
复制代码
?自由发挥,见仁见智,但我们的目标都是可执行文件,定位后记录其全路径,类似于“/var/mobile/Applications/XXXXXX/Victim.app/Victim”的形式。Today, I want to apologize to every...受害者……
8. 开始砸壳
cd到dumpdecrypted.dylib所在的目录,例如楼猪是“/var/tmp/”。然后输入
- DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/XXXXXX/Victim.app/Victim
复制代码
回车,坐等砸壳。如果出现如下报错:
- dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
- dumpdecrypted.dylib: stat() failed with errno=1
-
- Trace/BPT trap: 5
复制代码
则说明因沙盒的原因,dumpdecrypted.dylib不能在当前目录下工作。以笔者的经验来看,将dumpdecrypted.dylib拷贝到App目录下的任一文件夹后,在那里重新运行砸壳命令即可,如下所示:
- Touch5:/var/mobile/Applications/71C51582-9552-48DD-9811-B99C991F55BE/tmp root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/71C51582-9552-48DD-9811-B99C991F55BE/MicroMessenger.app/MicroMessenger
- mach-o decryption dumper
-
- DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
-
- [+] detected 32bit ARM binary in memory.
- [+] offset to cryptid found: @0x4abc(from 0x4000) = abc
- [+] Found encrypted data at address 00004000 of length 23347200 bytes - type 1.
- [+] Opening /private/var/mobile/Applications/71C51582-9552-48DD-9811-B99C991F55BE/MicroMessenger.app/MicroMessenger for reading.
- [+] Reading header
- [+] Detecting header type
- [+] Executable is a plain MACH-O image
- [+] Opening MicroMessenger.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 abc
- [+] Closing original file
- [+] Closing dump file
复制代码
如果出现如下报错:
- dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
- dumpdecrypted.dylib: mach-o, but wrong architecture
-
- Trace/BPT trap: 5
复制代码
则说明dumpdecrypted.dylib与待砸App可执行文件的处理器架构不匹配,不满足DYLD_INSERT_LIBRARIES的执行条件,不能在当前设备上砸壳。这句话是什么意思呢?我们都知道iPhone 4的处理器是armv7架构,iPhone 5是armv7s架构,iPhone 5s是arm64架构,每种架构的处理器对arm指令是向下兼容的,也就是说,一个只含有armv7指令的可执行文件是可以在iPhone 4、5、5s上执行的,一个只含有armv7s指令的可执行文件可以在iPhone 5和5s上执行
。但这种规则不适用于dylib——在iOS上运行的dylib必须跟当前处理器的架构一样,即armv7架构的dylib只能在iPhone 4上使用,在iPhone 5和5s上是得不到加载的。那么举例来说,对于一个iPhone 5s,其可用的dumpdecrypted.dylib文件中必须含有arm64架构的部分,否则根本得不到加载;进一步,DYLD_INSERT_LIBRARIES要求命令中的dylib和exe拥有相同架构,即arm64的dylib必须对应arm64的exe,否则就会出现上面的报错。
而对于绝大多数App来说,为了缩小其exe体积,exe中一般是不含有arm64架构的部分的,也就是说,这些App在iPhone 5s上不能通过这种方式砸壳。同时,因为很多常用工具对arm64的支持性还不好,所以我们也不建议大家使用arm64机器作为越狱调试机。
当命令执行成功后,当前目录下会多出一个Victim.decrypted文件,表明这个App的壳被砸掉了。将它拷贝到OSX中,洗净备用。
9. class-dump丫
在崭新的21世纪,App的可执行文件一般都是fat binary,也就是说一个二进制文件里包含适合多个CPU架构使用的可执行文件,虽然CPU架构是向下兼容的(也就是说armv64可以执行armv7s的指令,反之则不行),但向下兼容一般会导致一部分性能的牺牲。这
样如果一个binary既包含适用于armv7架构的可执行文件,又包含armv7s的,还包含arm64的,就意味着它可以在iPhone 4(armv7),4s(armv7),5(armv7s),5s(arm64)上都发挥100%的性能。
虽然除了处女座以外的其他星座用户一般是感受不到这个性能的提升的~但是,机器比处女座还要处女座,它在执行一个fat binary时,会选择最适合自己CPU的那个可执行文件,其他的可执行文件其实是没有得到执行的。因此dumpdecrypted.dylib起作用的只有实际得到执行的那一个可执行文件,举个例子,如果Victim里含有armv7和armv7s这2种架构,而我们的操作机是一台iPhone5/4,那么dumpdecrypted砸掉的是armv7s/armv7那部分的壳,armv7/armv7s部分仍是有壳的。自然地,class-dump的作用对象必须是砸掉壳的binary,所以我们要在class-dump时指定目标,在本例中,就是
- class-dump --arch armv7s Victim.decrypted
复制代码
或
- class-dump --arch armv7 Victim.decrypted
复制代码
注(简单脱壳使用流程):
"D:\Program Files (x86)\usbmuxd-1.0.8\python-client\tcprelay.py" -t 22:2222
cd /path/to/TargetApp/Document
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/TargetApp
需要砸壳后,在进行瘦身,否则在越狱机也会闪退
lipo -thin armv7s /path/to/TargetApp -output /path/to/TargetApp
chmod 777 /path/to/TargetApp
chown mobile:mobile /path/to/TargetApp