class-dump 和 dumpdecrypted砸壳

前言

在《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刚经历过一次大升级,目前网上可以找到的使用教程均已过期,所以这里我们以一个虚构的TargetApp.app为例,手把手带大家进行一次完整的“砸壳 + class-dump”,请大家准备板凳瓜子汽水,开始围观。如果能对着电脑,边看边做,善莫大焉!楼猪才疏学浅,如有纰漏,敬请斧正,洗耳恭听,污言秽语,免开尊口,感谢支持!

ps:引自 http://bbs.iosre.com/t/dumpdecrypted-app/22

当然,我们从App Store下载安装的应用都是加密的,所以我们需要用一些工具为下载的app解密,俗称“砸壳”。

环境

  • iOS端

    • iOS 10.1(越狱,iPhone6)
    • Cydia 64_1.1.30(zh-cn)
    • Cycript 0.9.594
  • Mac端

    • OS X 10.12
    • Xcode 8.1
    • class-dump 3.5

下载dumpdecrypted的源码

  1. Github地址:
    https://github.com/stefanesser/dumpdecrypted/
  2. git命令下载
git clone https://github.com/stefanesser/dumpdecrypted.git

编译

cd /Users/guogh/Downloads/dumpdecrypted-master #CD到你下载的目录
  • 执行下面的命令,直接cmd + c到终端

    make
    `xcrun --sdk iphoneos --find gcc` -Os  -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 armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c 
    `xcrun --sdk iphoneos --find gcc` -Os  -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 armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o
上面的make命令执行完毕后,会在当前目录下生成一个dumpdecrypted.dylib文件,这就是我们等下砸壳所要用到的榔头。此文件生成一次即可,以后可以重复使用,下次砸壳时无须再重新编译。

签名

我在编译后,上传手机使用中,发现无法使用,故此处需要签名
列出证书
 security find-identity -v -p codesigning
签名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib #后面的证书复制你上个命令输出的证书

上传签名后的 dumpdecrypted.dylib

SSH登陆到越狱的iPhone

guogh:dumpdecrypted-master guogh$ ssh [email protected]
[email protected]'s password:  #密码默认alpine,我的已改,输入你自己的
Guoghde-iPhone:~ root# 

手机端打开目标App,然后查看App路径

ps -e

用Cycript找出TargetApp的Documents目录路径。(自己实践发现dylib文件放在手机位置并无需求,我放在了 /usr/lib目录,则可以省略查看沙盒目录这一步)

cycript -p TargetApp_PID #注入目标app进程
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"

scp上传到手机

scp dumpdecrypted.dylib [email protected]:/usr/lib/dumpdecrypted.dylib

开始砸壳

命令

DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable

实际操作:

DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E-0E2C6541F879/TargetApp.app/TargetApp

我这里命令执行路径,我一般是先 su mobile , 然后 再 cd ~ 执行

这样砸好的文件在/var/mobile/目录中

注意

下文引用自:iosre

赶紧把砸壳后的文件拷贝到OSX上备用吧,class-dump、IDA等工具已经迫不及待啦。
以上6步还算简洁明了,但可能会有朋友问,为什么要把dumpdecrypted.dylib拷贝到Documents目录下操作?
问得好。我们都知道,StoreApp对沙盒以外的绝大多数目录没有写权限。dumpdecrypted.dylib要写一个decrypted文件,但它是运行在StoreApp中的,与StoreApp的权限相同,那么它的写操作就必须发生在StoreApp拥有写权限的路径下才能成功。StoreApp一定是能写入其Documents目录的,因此我们在Documents目录下使用dumpdecrypted.dylib时,保证它能在当前目录下写一个decrypted文件,这就是把dumpdecrypted.dylib拷贝到Documents目录下操作的原因。
最后来看看如果不放在Documents目录下,可能会出现什么问题:

FunMaker-5: /var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents root# mv dumpdecrypted.dylib /var/tmp/
FunMaker-5: /var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents root# cd /var/tmp
FunMaker-5:/var/tmp root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /private/var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E-0E2C6541F879/TargetApp.app/TargetApp
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

这里errno的值是1,即Operation not permitted,砸壳失败。

class-dump

一个Github源码:
https://github.com/nygard/class-dump

官网:
http://stevenygard.com/projects/class-dump/

这里我下载的是 class-dump-3.5.dmp。然后把 class-dump执行文件放到/usr/local/bin目录下, 然后chmod 777 class-dump ,在终端输入 class-dump,显示 class-dump的版本后,就可以正常使用 class-dump 命令了

class-dump -H 砸壳后文件 -o headers存放目录