iOS 逆向之砸壳

背景

#### 前言

从 AppStore 下载的 App 是被苹果使用 FairPlay 技术加密过的, 可执行文件被套上了一层保护壳, 而 class-dump Hopper 等工具无法作用于加密过的 App。 在这种情况下, 想要获取头文件, 需要先解密 App 的可执行文件, 俗称“砸壳”。 砸壳的工具有好多种,其核心原理就是将内存中已解密的镜像 “dump” 出来,再生成新的镜像文件,从而达到解密的效果。可执行程序要想运行起来,必须由操作系统把可执行文件加载进内存,iOS 中用的是 DYLD。

#### 一、dumpdecrypted

dumpdecrypted 就是由越狱社区的知名人士 Stefan Esser( @i0n1c) 出品的一款砸壳工具, 被越狱社区广泛运用在 iOS 逆向工程研究中。下面介绍怎么用 dumpdecrypted 给 app 砸壳。

下载 dumpdecrypted 地址为 https://github.com/stefanesser/dumpdecrypted/

下载完成后直接 make (如果安装了不同的 iOS SDK,可以调整 Makefile 文件),一切顺利的话会生成名为 dumpdecrypted.dylib 的动态库,先暂时放在这里留着备用。

#### 二、SSH 连接越狱 iDivice

为了书写和描述,我们把 iPhone、iPad、iPod 等 统称为 iDivice 。iDivice 越狱后有 root 和 mobile 两个账户,默认密码为 alpine ,建议马上修改这个默认的密码,防止其他人通过这个默认密码登录 iDivice 。修改命令如下:

``` bash

$ su root

$ passwd

Changing password for root.

New password:

Retype new password:

```

越狱 iDivice 使用 Cydia 搜索 openSSH ,安装即可。连接方式有两种

##### 2.1 WiFi 连接

首先确保 iDivice 和 电脑在统一局域网,连接操作如下

``` bash

$ ssh root@x.x.x.x

```

其中 x.x.x.x 为 iDivice 的 ip 地址。

##### 2.2 USB连接

##### 2.2.1 安装 usbmuxd

``` bash

$ brew install usbmuxd

```

##### 2.2.2 端口映射

``` bash

$ iproxy 2345 22

```

相当于把 iDivice 的 22 端口映射到电脑的 2345 端口

##### 2.2.3 连接

新开一个终端窗口,并且保持 2.2 中的终端窗口没有被关闭

``` bash

$ ssh -p 2345 root@127.0.0.1

```

#### 三、获取两个路径

查看 app 进程,这里以 WeChat 为例 ,这里要保证 WeChat 在前台运行

``` bash

$ ps -ef | grep /var/mobile/

  501  506    1  0  0:00.00 ??        1:19.23 /var/mobile/Containers/Bundle/Application/F14174A6-AEC8-4AD4-A09A-9049FDCBB55E/WeChat.app/WeChat

    0  1529  1482  0  0:00.00 ttys001    0:00.01 grep /var/mobile/

```

先记下这个路径备用

查看 app Document 路径

这个需要用到 cycript 这个工具。cycript 是混合了 oc 与 js 语法的一个工具, 让开发者在命令行下和应用交互,在运行时查看和修改应用,挂钩相关的进程后,我们就可以用 oc 的方法来查看 app Document 路径了。

挂钩进程

``` bash

$ cycript -p WeChat

cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]

@[#"file:///var/mobile/Containers/Data/Application/6475E209-3EF7-4264-ADC5-FBE0264516BF/Documents/"]

cy#

```

退出 cy# 模式的快捷键为 ctl + d,把上面输出的路径也记下来备用。

#### 四、把第一步中生成的 dumpdecripted.dylib 动态库拷贝到该 app 的 Document 目录下

该操作要用到 scp 命令。scp 是 secure copy 的缩写, 基于 ssh 登陆进行安全的远程文件拷贝命令。例子:两台机器IP分别为:A 192.168.11.10,B 192.168.11.11,如果想把 A 根目录上的 a.jpg 文件拷到 B 上,命令如下:在A服务器上操作 命令为:

``` bash

$ scp /a.jpg root@192.168.11.11:/

```

所以此时把生成的 dumpdecripted.dylib 动态库拷贝到该 app 的 Document 目录,命令如下:

在 mac的终端上操作

``` bash

$ scp dumpdecrypted.dylib root@x.x.x.x:/var/mobile/Containers/Data/Application/6475E209-3EF7-4264-ADC5-FBE0264516BF/Documents/

```

#### 五、开始砸壳

进入 Document 目录

``` bash

$ cd /var/mobile/Containers/Data/Application/6475E209-3EF7-4264-ADC5-FBE0264516BF/Documents/

```

砸壳

``` bash

$ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/F14174A6-AEC8-4AD4-A09A-9049FDCBB55E/WeChat.app/WeChat

mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 64bit ARM binary in memory.

[+] offset to cryptid found: @0x1000fcca8(from 0x1000fc000) = ca8

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

[+] Opening /private/var/mobile/Containers/Bundle/Application/F14174A6-AEC8-4AD4-A09A-9049FDCBB55E/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 ca8

[+] Closing original file

[+] Closing dump file

$ ls

00000000000000000000000000000000  MMResourceMgr  OpenImResource    db.globalconfig

CrashReport   MMappedKV SafeMode.dat   dumpdecrypted.dylib

LocalInfo.lst   MemoryStat WeChat.decrypted  heavy_user_id_mapping.dat

```

此时就可以在当前目录下看到被砸壳后的 WeChat.decrypted。

#### 六、获取可执行文件的所有头文件

从 iDvice 上把解密后的文件拷到电脑的桌面上,在电脑终端上操作

``` bash

$ scp root@x.x.x.x:/var/mobile/Containers/Data/Application/6475E209-3EF7-4264-ADC5-FBE0264516BF/Documents/WeChat.decrypted ~/Desktop/

```

获取 .h 文件需要用到 class-dump 工具,下载地址为 http://stevenygard.com/projects/class-dump/。把砸壳后的可执行文件的所有 .h 文件输出到 wechat_test_h 文件夹下

``` bash

class-dump -H WeChat.decrypted -o wechat_test_h

```

这时候就能看到所有 WeChat 的头文件了。

#### 七、相关链接

FairPlay https://en.wikipedia.org/wiki/FairPlay

dumpdecrypted https://github.com/stefanesser/dumpdecrypted/

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

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

推荐阅读更多精彩内容