iOS 逆向学习系列之一:砸壳

App Store中下载的程序是加密后的,为了能够获取目标程序的类信息以便之后修改源码,我们需要对应用程序做一个解密,也就是砸壳。

硬件设备需要有一台越狱手机和一台装了开发环境的mac电脑。

以下以 微信 为例,进行操作。

1. 远程连接iphone

iphone 本质也是一台linux设备,所以可以用登录服务器的方式连接iphone。具体操作如下:

  1. 连到同一个wifi,在 设置-无线局域网 中查看iphone的ip,我这里是 192.168.1.116

  2. 使用 ssh 命令登录服务器

     ssh root@192.168.1.116
    

    登录过程中需要输入服务器密码,ios 默认密码为 alpine

2. 找到app路径和Document路径

  1. 用ssh连接上iOS设备后,我们打开想要砸壳的app,输入 ps -e,就可以在进程中找到这个app的二进制文件的地址:

    9281 ??         0:02.65 /var/mobile/Containers/Bundle/Application/23A70D56-542F-4843-B1F7-DAF3FB0CED25/WeChat.app/WeChat    ```
    
    **9281** 为微信的进程名,可执行文件目录为 
    ***/var/mobile/Containers/Bundle/Application/23A70D56-542F-4843-B1F7-DAF3FB0CED25/WeChat.app/WeChat***
    
    
  2. Cycript 找出 TargetApp 的 Documents 目录路径

    admin:~ root# cycript -p 9281
    cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
    #"file:///var/mobile/Containers/Data/Application/6A3EDE95-573D-4B8A-A107-6AA596C49DE3/Documents/"
    

    cycript -p process process 为第一步中拿到的进程名!
    cycript -p process process 为第一步中拿到的进程名!
    cycript -p process process 为第一步中拿到的进程名!

    现在得到 微信Document 目录
    file:///var/mobile/Containers/Data/Application/6A3EDE95-573D-4B8A-A107-6AA596C49DE3/Documents/

    也可以用PP助手类的工具直接获得Document目录

3. 编译dumpdecrypted

dumpdecrypted 工具就是要用的砸壳工具。他的原理是让app预先加载一个解密的dumpdecrypted.dylib,然后在程序运行后,将代码动态解密,最后在内存中dump出来整个程序。

Baiya:Ios baiya$ cd dumpdecrypted/
Baiya:dumpdecrypted baiya$ ls
Makefile    README      dumpdecrypted.c
Baiya:dumpdecrypted baiya$ 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/iPhoneOS9.3.sdk/System/Library/PrivateFrameworks'
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/PrivateFrameworks'
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/PrivateFrameworks'

即可得到dumpdecrypted.dylib文件。
一般SDK是向下兼容的,保证SDK版本与越狱设备的版本一致或者高于越狱设备版本即可。
使用xcrun --sdk iphoneos --show-sdk-path查看SDK版本。
如下:SDK版本是9.3。因为设备是iOS 8.4,所以没问题

Baiya:dumpdecrypted baiya$ xcrun --sdk iphoneos --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk

4. 砸壳

  1. 将生成的dumpdecrypted.dylib拷贝到设备目录,可以用scp命令PP助手

    Baiya:dumpdecrypted baiya$ scp dumpdecrypted.dylib root@192.168.1.116:/var/mobile/Containers/Data/Application/6A3EDE95-573D-4B8A-A107-6AA596C49DE3/Documents/
    root@192.168.1.116's password: 
    dumpdecrypted.dylib                                                     100%  193KB 192.9KB/s   00:00 
    
  2. 进入Document目录下面,执行DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib相关的命令

    admin:/var/mobile/Containers/Data/Application/6A3EDE95-573D-4B8A-A107-6AA596C49DE3/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/23A70D56-542F-4843-B1F7-DAF3FB0CED25/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.
    [-] This mach-o file is not encrypted. Nothing was decrypted.
    

    因为博主装的是没有加密的23333

    正常是:

    iPod:~ root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Scan.app/Scan
    mach-o decryption dumper
    
    DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
    
    [+] Found encrypted data at address 00002000 of length 1826816 bytes - type 1.
    [+] Opening /private/var/mobile/Applications/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Scan.app/Scan for reading.
    [+] Reading header
    [+] Detecting header type
    [+] Executable is a FAT image - searching for right architecture
    [+] Correct arch is at offset 2408224 in the file
    [+] Opening Scan.decrypted for writing.
    [-] Failed opening. Most probably a sandbox issue. Trying something different.
    [+] Opening /private/var/mobile/Applications/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/tmp/Scan.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
    [+] Closing original file
    [+] Closing dump file
    

    会生成app砸壳后的文件xx.decrypted. 这里就是WeChat.decrypted。如果是没有加密的,直接使用WeChat即可

取出解密后程序

还是scp命令或者PP助手

Baiya:dumpdecrypted baiya$ scp root@192.168.1.116:/var/mobile/Containers/Bundle/Application/23A70D56-542F-4843-B1F7-DAF3FB0CED25/WeChat.app/WeChat ~/Desktop/
root@192.168.1.116's password: 
WeChat                                                                                                                                             100%   97MB   2.2MB/s   00:45 

查看APP信息

  • 查询架构 file app

    Baiya:Desktop baiya$ file WeChat 
    WeChat: Mach-O universal binary with 2 architectures
    WeChat (for architecture armv7):    Mach-O executable arm
    WeChat (for architecture arm64):    Mach-O 64-bit executable
    

    微信支持两种架构 armv7arm64

  • 查询下它的加密情况 otool -l 主文件名 | grep crypt

    Baiya:Desktop baiya$ otool -l WeChat | grep crypt
         cryptoff 16384
        cryptsize 40910848
          cryptid 0
         cryptoff 16384
        cryptsize 43974656
          cryptid 0
    

    cryptid 1代表加密,cryptid 0代表未加密。两个分别对应着armv7和arm64,也就是它们都没有加密。

参考链接:

iOS逆向之dumpdecrypted的使用
iOS逆向 - Cycript基本用法
iOS逆向 - dumpdecrypted工具砸壳
用dumpdecrypted给App砸壳
iOS逆向之IPA脱壳
iOS 冰与火之歌番外篇 - App Hook 答疑以及 iOS 9 砸壳

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • #### 前言 从 AppStore 下载的 App 是被苹果使用 FairPlay 技术加密过的, 可执行文件被...
    善舞ice阅读 1,133评论 0 2
  • 逆向工具集的安装和使用 iOS 逆向工程的工具分类 检查工具如:Reveal(界面分析工具)、tcpdump(抓包...
    Yochi阅读 5,445评论 1 5
  • 我们需要用到的工作有 dumpdecrypted-github class-dump-github class-d...
    wdsh阅读 2,523评论 0 0
  • 1.砸壳前的准备 一台越狱iphone📱,根据以往经验,测试用的手机永远不要紧跟潮流升级系统,在越狱手机中打开Cy...
    I_m赵昊阅读 1,195评论 4 10
  • 这个就当做是日记吧,不算文章,因为我觉得我接下来写的东西应该完全没有条理,各种记忆和情感充斥着大脑,但又觉得不写不...
    S塔阅读 232评论 0 0