codeforce能用万能头文件吗_iOS攻防(四):使用Dumpdecrypted 砸壳 & class-dump 导出头文件...

我向来不怕得罪朋友,因为既是朋友,就不怕得罪,不能得罪的就不是朋友,这是我的一贯作风。由这一点你也可猜出,我的朋友为什么这么少。

——王小波《似水流年》

简介class-dump是用来dump目标对象的头文件信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的类/分类/协议等头文件信息提取出来并生产.h文件。

从AppStore下载的App是被苹果加密过的,可执行文件被套上了一层保护壳, 而class-dump无法作用于加密过的App。 在这种情况下,想要获取头文件,需要先解密App的可执行文件,俗称“砸壳”。 dumpdecrypted就是由越狱社区的知名人士Stefan Esser出品的一款砸壳工具,被广泛运用在iOS逆向工程研究中。

注意:如果不砸壳,直接使用class-dump现在已经无法dump出头文件的(之前可以dump出头文件但是是加密的),只会生成一个CDStructures.h文件.

所有资料文件&工具在这里

class-dump

下载安装class-dump关于的class-dump详细安装方法,请点击这里

class-dump 可用于查看闭源的应用、frameworks、bundles。

对比一个 APP 不同版本之间的接口变化。

对一些私有 frameworks 做些有趣的试验。

class-dump的简单使用

dump出Mac版微信的头文件1class-dump -H /Applications/WeChat.app -o ~/Desktop/dump/WeChat-dump

-H 要解析的文件

/Applications/WeChat.app 需要反编译的应用路径

-o 输出目录(后面跟路径)

~/Desktop/dump/WeChat-dump 头文件存放路径

也可以dump出系统库1

2class-dump /System/Library/Frameworks/AppKit.framework // AppKit

class-dump /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework // UIKit

dumpMac版微信结果执行完成后即可在指定输出目录查看dump的头文件信息

打开查看某个头文件的内容

dumpdecrypted我们都知道Clutch是一个非常厉害的砸壳工具, 那么为什么还需要dumpdecrypted这个工具呢?

因为Clutch并不是万能的,无法砸开含有兼容WatchOs2的App, 从AppStore下载的有些App(比如WeChat)并不能使用Clutch来进行砸壳, 使用Clutch工具来进行砸壳会失败。

我的准备MacOS 10.13.5

iPhone 5C 10.3.2

dumpdecrypted

class-dump

在Cydia中安装 cycript, 可以先不用管 cycript 是什么, 后续会单独详讲.

iTools或者其他助手工具

下载安装dumpdecrypted去 Github 下载dumpdecrypted源码, 源码就一个C源文件.

下载后解压,文件如下:

dumpdecryptedp编译下载后打开Makefile文件,注意第三行:

1SDK=`xcrun --sdk iphoneos --show-sdk-path`

这里填写的SDK必须与你越狱的iPhone系统版本需要一致,你可以使用如下指令先查看你Xcode的SDK版本:

1/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk

虽然我的Xcode的SDK版本是11.4,但是我查看了下支持的目录文件,是有10.3的支持文件的,所以可以直接编译,查看目录如下:

1

2// 进入Application内,Xcode右键显示包内容

/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

打开终端,进入下载的dumpdecryptedp文件夹目录, 执行make即可完成编译, 操作步骤如图所示:

1

2

3

4

5

6

7

8

9

10cd ~/Desktop/dumpdecrypted

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

ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'

ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'

ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'

编译成功后会在dumpdecryptedp文件目录下会生成dumpdecrypted.dylib和dumpdecrypted.o两个文件。

dumpecrypted.dylib 签名如果不对该文件进行签名, 后续砸壳的操作会失败.

先找到已经在电脑上面安装的苹果开发者证书, 操作如下:

1

2## 列出可签名证书, 找到 mac 上面已经安装的证书

security find-identity -v -p codesigning

dumpecrypted.dylib签名, 命令如下:

1codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib

"iPhone Developer: xxx xxxx (xxxxxxxxxx)" 为上一步找到的你已经安装的开发者证书名称。

dumpdecryptedp的简单使用

查找目标 App 所在进程推荐先清空手机后台运行的所有程序

打开微信应用

通过电脑终端ssh登录iPhone手机,查看当前运行的所有的进程

1ps -e

会列出所有当前正在运行的进程,虽然我们杀掉了所有后台服务,但是会有很多的系统进程信息干扰,我们需要找到以WeChat结尾的进程,即是我们需要的微信进程PID 是微信进程的进程ID

CMD 是微信进程可执行文件的路径

WeChat.app 即是我们需要砸壳的目标app

1

2PID TTY TIME CMD

771 ?? 0:06.94 /var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat

补充查找可执行文件路径比较快的方法(如果知道可执行文件名称)

1find / -name WeChat.app

查找程序进程PID比较快的方法(如果知道可执行文件名称)

1ps aux | grep WeChat

查找目标app的Documents目录砸壳需要将我们编译生成的dumpdecrypted.dylib文件放入目标app的Documents目录下,所以我们需要找到目标app的Documents目录。

终端进入手机的根目录执行下面指令, 我们会进入cy#模式:771 是我们上一步查找到的微信的进程ID

1CoderBoy-iPhone:~ root# cycript -p 771

在cy#模式使用OC方法查找微信应用的Documents目录, 输入下面代码

1[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

成功后会输出微信应用的Documents目录路径,如下:注意: 执行过程中, 在iPhone上面打开运行一下微信, 不然上面的执行一直卡在那里不动.

成功后输入ctrl+d退出cycript

1#"file:///var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/"

砸壳拷贝dumpdecrypted.dylib这个之前编译签名好的文件到iPhone上面该目标APP的Documents目录.

方法一:直接在电脑上通过助手软件将dumpdecrypted.dylib放入到目标app的Documents目录。

方法二:也可以使用指令将dumpdecrypted.dylib放入到目标app的Documents目录,操作如下:在Mac上新建一个终端,如果当前是在手机root模式,也可以输入exit直接退出,输入如下指令:

1

2

3

4// ~/Desktop/dumpdecrypted/dumpdecrypted.dylib 编译签名好的dumpdecrypted.dylib文件路径

// /var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/ 上一步获取到的目标app的Documents目录

scp ~/Desktop/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.60:/var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/

进入到手机Documents目录, 查看dumpdecrypted.dylib文件是否存在

1

2

3

4

5ssh root@192.168.1.60

cd /var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents

ls -l

开始砸壳,注意DYLD_INSERT_LIBRARIES=后填写的是你刚刚传输到Documents目录的.dylib文件名,我的是 dumpdecrypted.dylib。

dumpdecrypted.dylib后的路径是需要砸壳的目标app的可执行文件路径,也即是之前查找目标app进程时获取到的路径,而不是Documents目录路径。

1YLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat

砸壳成功后输入信息如下:砸壳成功后会在Documents目录生成一个名为AppName.decrypted文件,如当前操作会生成一个WeChat.decrypted文件,可以使用ls -l指令查看。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18mach-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: @0x59a4c(from 0x59000) = a4c

[+] Found encrypted data at address 00004000 of length 54755328 bytes - type 1.

[+] Opening /private/var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat for reading.

[+] Reading header

[+] Detecting header type

[+] Executable is a plain MACH-O image

[+] Opening WeChat.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 a4c

[+] Closing original file

[+] Closing dump file

使用Mac的助手工具直接将生成的WeChat.decrypted文件拷贝到桌面即可,也可使用终端指令拷贝,如下退出手机Root模式,拷贝砸壳后文件到电脑桌面

1

2

3exit

scp root@192.168.1.60:/var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/WeChat.decrypted ~/Desktop/WeChat.decrypted

class dump 砸壳后的文件砸壳后的WeChat.decrypted文件就可以使用class-dump导出头文件,如下--arch armv7是指定架构,dumpdecrypted只会砸你手机处理器对应的那个壳,fat binary的其它部分仍然是有壳的

而class-dump的默认目标又不是被砸壳的那个部分,如果不指定架构只能导出CDStructures.h一个文件

1class-dump --arch armv7 WeChat.decrypted -H -o /Users/sevencho/Desktop/dump/Wechat-decrypted-dump

现在就可以看到别人整个APP的.h文件信息了,除了可以优雅的学习大厂App的接口命名及设计规范外,当然还可以依靠强大的运行时特性做一些其他有意思的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值