所谓的反编译也就是砸壳,为什么要砸壳?为了更好的掌握IOS结构,简单的说可以了解诸如微信这样的牛掰的App的架构,我们通过对砸壳出的文件进行分析,还可以推敲出更多有用的东西。
准备工具:
- 一台越狱后的iPhone
- PP助手 可访问越狱应用市场的第三方软件
- iTools Pro iPhone 越狱文件管理工具
- class-dump 导出App头文件(前提是 App 在AppStore上加的密已经解除)
- dumpdecrypted 解密App在AppStore加的密(砸壳)
ipa安装包获取途径
获取要被砸壳的App的ipa安装包,获取途径有两种
- iTunes 下载安装包。下载的ipa安装包肯定是加密后的,需要砸壳。
- PP 助手下载越狱应用。下载的ipa安装包已经被解密,可直接使用导出头文件。
环境配置
安装配置所需工具
- class-dump。下载最新版class-dump.dmg并打开,将class-dump.dmg安装包内的class-dump文件拷贝到 /usr/local/bin 目录下,有两种方式
- 打开class-dump.dmg安装包,打开 /usr/local/bin ,拖拽安装包内class-dump 至 /usr/local/bin 目录下
- 打开class-dump.dmg(安装包目录),拖拽class-dump至mac桌面,再通过以下命令拷贝至 /usr/local/bin
localhost:~ wany$ cd ~/Desktop/
localhost:Desktop wany$ sudo scp class-dump /usr/local/bin
- dumpdecrypted。Github上下载最新的dumpdecrypted源码,进入下载的dumpdecrypted目录(我这里是 ~/Download/dumpdecrypted-master),dumpdecrypted目录下执行以下命令编译出dumpdecrypted.dylib
localhost:~ wany$ cd ~/Download/dumpdecrypted-master
localhost:dumpdecrypted-master wany$ make
`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-
......省略部分输出.......
honeOS9.3.sdk/System/Library/PrivateFrameworks'
localhost:dumpdecrypted-master wany$ ls
Makefile dumpdecrypted.c dumpdecrypted.o
README dumpdecrypted.dylib
localhost:dumpdecrypted-master wany$
- 越狱的iPhone,通过Cydia 安装openSSH。启动Cydia->搜索,输入 openssh 关键字查找,安装。
导出头文件(微信为例)
ipa安装包来自AppStore。
砸壳。每个App都有自己的沙盒,App启动,沙盒也会自然启动。在App 沙盒的tmp目录下放入动态解密库dumpdecrypted.dylib,App运行时通过加载该动态解密库dumpdecrypted.dylib,对代码进行解密,重新生成一个解密后的程序文件WeChat.decrypted
-
如果iPhone 中已安装微信可跳过本步骤,否则连接iTunes 安装该微信(重装微信需谨慎,微信聊天记录、图片、等重要数据可能会丢失)
-
ssh 连接iPhone。这里我的ip为192.168.00.00,iPhone 和 Mac必须在同一网络下。
localhost:~ wany$ sudo ssh root@192.168.00.00
-
获取iPhone中微信沙盒的路径。这个寻找比较麻烦,我是通过iFunbox 找到的,寻找到微信的沙盒,iFunBox 下方会显示微信的沙盒路径。一定还有更简单的方法获取该路径,请自行探索。
-
获取iPhone中微信安装包路径。这个寻找比较麻烦,我是通过iTool Pro 找到的,一般都存放在 /var/mobile/Containers/Bundle/Application/ 下的某一个项目里面,如果显示的不是一个36位的字符串,可以尝试点击iTools Pro 下的导出按钮,导出到Mac桌面,保存到Mac桌面时名字就是一个36位的字符串。 一定还有更简单的方法获取该路径。
-
dumpdecrypted.dylib 拷贝至 沙盒路径/tmp 目录下
-
执行砸壳命令
wany-iPhone:~ root#
wany-iPhone:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/B209E97B-607B-4217-8AD5-0DABEAB48B3E/WeChat.app/WeChat
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: @0xc4a4c(from 0xc4000) = a4c
[+] Found encrypted data at address 00004000 of length 42450944 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/B209E97B-607B-4217-8AD5-0DABEAB48B3E/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] 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 4a4c
[+] Closing original file
[+] Closing dump file
wany-iPhone:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp root#
6)断开Mac和iPhone ssh连接
wany-iPhone:~ root# logout
Connection to 192.168.00.00 closed.
localhost:~ wany$
导出iPhone 中刚刚生成的WeChat.decrypted 到 Mac电脑桌面
localhost:~ wany$ scp root@192.168.00.00:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp/WeChat.decrypted ~/Desktop/
- 砸壳
localhost:~ wany$ cd ~/Desktop/
localhost:Desktop wany$ class-dump -s -S -H WeChat.decrypted WeChatHead (执行后,等待片刻,控制台无任何输出)
//头文件导出成功
localhost:Desktop wany$
如果砸出的文件夹WeChatHead中只有一个名为CDStructures.h 的文件,说明解密是不完整的
查看是否解密完成。cryptid这个标志位判断是否解密,1的代表未解密,0的代表解密。
localhost:Desktop wany$ otool -l WeChat.decrypted | grep crypt
WeChat.decrypted (architecture armv7):
cryptoff 16384
cryptsize 42450944
cryptid 0
WeChat.decrypted (architecture arm64):
cryptoff 16384
cryptsize 45678592
cryptid 1
由此可见,arm64 还处于未解密的状态,我们刚才只是解密了armv7。所以我们导不出任何有用的东西。继续使用以下命令
localhost:Desktop wany$ class-dump --arch armv7 WeChat.decrypted -H -o WeChatHead
如果依然导不出任何有用的东西,我也不清楚了,还在学习中。
ipa安装包来着pp助手越狱应用市场。
寻找下载的ipa目录所在目录(简称该目录为xxx),解压ipa安装包。
我这里下载的微信ipa 名为 ‘微信 6.3.25(越狱应用).ipa’ ,为了方便下面介绍的使用,这里更名为‘WeChat_YueYu.ipa’
localhost:~ wany$ cd xxx
localhost:xxx wany$ unzip WeChat_YueYu.ipa
localhost:xxx wany$ ls
WeChat_YueYu WeChat_YueYu.ipa
localhost:xxx wany$ cd WeChat_YueYu
localhost:WeChat_YueYu wany$ ls
META-INF iTunesArtwork
Payload iTunesMetadata.plist
localhost:WeChat_YueYu wany$ cd Payload
localhost:Payload wany$ ls
WeChat.app
//砸壳
localhost:Payload wany$ class-dump -H WeChat.app -o WeChatHead (执行后,等待片刻,控制台无任何输出)
//头文件导出成功
localhost:Payload wany$ ls
WeChat.app WeChatHead
localhost:Payload wany$ open WeChatHead
接下来就开始愉快的分析微信头文件吧,你一定会更上一层楼的。
如果再砸壳中出现以下问题
class-dump[12985:861374] Error: Cannot find offset for address 0x300000000100b925 in stringAtAddress:
那么这个软件很可能使用的swift编程语言(非OC),目前还没有出现swift 砸壳工具,还有一种很小的可能性是该软件做了反砸壳机制 ,看这里。
参考书籍 : 《IOS 应用逆向工程 2》
网友评论