【iOS逆向】- 脱壳

苹果手机的应用市场分为App Store和非App StorePP助手爱思助手)。

我们平时编写的代码最后发布到App Store的时候苹果会对包进行一个加密,生成一个壳程序,防止被篡改。也就是说在App Store上下载的程序都是被加过壳,其他越狱市场下载的一般是没有加过壳的。有很多方式可以看是否已经加过壳了,下面简单介绍一下。

class-dump方式

class-dump通过传入一个可执行文件,可以导出该文件的所有类的头文件,下载地址,下载后的文件建议放到/usr/local/bin目录下,就不用改环境变量了,也可以放到你的环境变量的目录下,通过下面的命令查看自己电脑的的环境变量

echo $PATH

15425400351609.jpg

我手机上有上面几个应用,除了网易严选其他都是从App Store上下载的,就拿淘宝网易严选做个对比看下这2个包分别使用class-dump后会生成什么。在手机上分别打开2个应用后使用命令ps -A找到安装目录,我这台手机上2个包的安装目录分别如下

网易严选

/var/mobile/Containers/Bundle/Application/A0149F19-C83C-4800-B5A4-27AF0ECCCB1B/NeteaseYanxuan.app/NeteaseYanxuan

淘宝

/var/mobile/Containers/Bundle/Application/52E9162D-FB0C-4E79-A711-D94DCD7C102A/Taobao4iPhone.app/Taobao4iPhone

找到对应的文件,复制到我们的Mac下,自己找个目录存放着,我这里放到我的电脑的~/Desktop/jailbreak/testClassDump,分别执行class-dump命令

淘宝

➜  taobao class-dump -H Taobao4iPhone -o headers // -H 表示导出头文件  -o 表示导出的东西放置到headers文件夹下

此时的目录如下

➜  taobao tree
.
├── Taobao4iPhone
└── headers
    └── CDStructures.h

1 directory, 2 files
➜  taobao

发现在headers下只会生成一个CDStructures.h,一般导出这个的就是加过壳的程序了.再来看看网易严选


➜  wangyiyanxuan  tree  | more
.
├── NeteaseYanxuan
└── headers
    ├── A2BlockInvocation.h
    ├── A2DynamicBKURLConnectionInformalDelegate.h
    ├── A2DynamicClassDelegate.h
    ├── A2DynamicDelegate.h
    ├── A2DynamicMFMailComposeViewControllerDelegate.h
    ├── A2DynamicMFMessageComposeViewControllerDelegate.h
    ├── A2DynamicNSCacheDelegate.h
    ├── A2DynamicNSURLConnectionDelegate.h
    ├── A2DynamicUIActionSheetDelegate.h
    ├── A2DynamicUIAlertViewDelegate.h
    ├── A2DynamicUIImagePickerControllerDelegate.h
    ├── A2DynamicUIPopoverControllerDelegate.h
    ├── A2DynamicUIWebViewDelegate.h
    ├── AFActivityIndicatorViewNotificationObserver.h
    ├── AFAutoPurgingImageCache.h
    ├── AFCachedImage.h
    ├── AFCompoundResponseSerializer.h
    ├── AFHTTPBodyPart.h
    ├── AFHTTPRequestSerializer.h
    ├── AFHTTPResponseSerializer.h
    ├── AFHTTPSessionManager.h
    ├── AFImageCache-Protocol.h
    ├── AFImageDownloadReceipt.h
    ├── AFImageDownloader.h
    ├── AFImageDownloaderMergedTask.h
    ├── AFImageDownloaderResponseHandler.h
    ├── AFImageRequestCache-Protocol.h
    ├── AFImageResponseSerializer.h
    ├── AFJSONRequestSerializer.h
    ├── AFJSONResponseSerializer.h

    ....
    

有很多文件,这里就不全部列举了,像这种的能解析出很多的头文件的一般就是没有加壳的了。

随便挑一个文件看看里面的内容以_BKObserver为例

//
//     Generated by class-dump 3.5 (64 bit).
//
//     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//

#import "NSObject.h"

@class NSMutableArray;

@interface _BKObserver : NSObject
{
    _Bool _isObserving;
    int _context;
    id _observee;
    NSMutableArray *_keyPaths;
    id _task;
}

@property(readonly, nonatomic) int context; // @synthesize context=_context;
@property(readonly, nonatomic) id task; // @synthesize task=_task;
@property(readonly, nonatomic) NSMutableArray *keyPaths; // @synthesize keyPaths=_keyPaths;
@property(readonly, nonatomic) id observee; // @synthesize observee=_observee;
- (void).cxx_destruct;
- (void)dealloc;
- (void)stopObserving;
- (void)_stopObservingLocked;
- (void)stopObservingKeyPath:(id)arg1;
- (void)startObservingWithOptions:(unsigned long long)arg1;
- (void)observeValueForKeyPath:(id)arg1 ofObject:(id)arg2 change:(id)arg3 context:(void *)arg4;
- (id)initWithObservee:(id)arg1 keyPaths:(id)arg2 context:(int)arg3 task:(id)arg4;

@end

可以看到有很多方法和成员变量,不由得会问是所有的方法都dump出来了吗,我们写个demo工程测试一下

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

{
    @public // 共有变量
    int  age;
    
    @private // 私有变量
    double nums;
}

// 属性变量
@property(nonatomic, copy) NSString *name;


// 暴露的对象方法
- (void)testFunction;

@end


.m

#import "ViewController.h"

@interface ViewController ()

// 类扩展的属性
@property (nonatomic , copy) NSString *innerName;

@end


// 静态全局变量
static int innerStaticAge = 0;

// 全局变量
int globalNum = 0;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)testFunction {
    
}

// 内部方法
- (void)innerFunction {
    
}

// 静态方法
static int staticFunction () {
    return 0;
}

@end


发现class-dump以后

#import "UIViewController.h"

@class NSString;

@interface ViewController : UIViewController
{
    int age;
    double nums;
    NSString *_name;
    NSString *_innerName;
}

@property(copy, nonatomic) NSString *innerName; // @synthesize innerName=_innerName;
@property(copy, nonatomic) NSString *name; // @synthesize name=_name;
- (void).cxx_destruct;
- (void)innerFunction;
- (void)testFunction;
- (void)viewDidLoad;

@end

除了静态方法、静态变量、全局方法都dump下来了,也就是属于这个类的都dump下来了,不禁会想有些重要的敏感数据可以考虑放到全局或者静态中去,因为就dump来说,一般是查看不到的,达到一定的防破解的能力。

class-dump 失败

如果class-dump的时候报下面的错误


Cannot find offset for address 0xXXX in stringAtAddress

很可能这个项目是ocswift混编的,请参照这篇文章解决

使用MachOView工具

MachOView是专门用来查看MachO文件的工具,官网的下载地址安装会有闪退,这里我自己修改了下并重新生成点击下载安装,分别拖进工具中查看load commands中的LC_ENCRYPTION_INFO中的Crypt ID这个值为1就是加过壳了,为0就是没有加壳

15425419163089.jpg

otool命令

使用-l参数就是load command的意思。

➜  wangyiyanxuan otool -l  NeteaseYanxuan | grep crypt
     cryptoff 16384
    cryptsize 27557888
      cryptid 0
     cryptoff 16384
    cryptsize 30539776
      cryptid 0
➜  wangyiyanxuan cd ..
➜  testClassDump ls
taobao        wangyiyanxuan

➜  testClassDump cd taobao

➜  taobao otool -l  Taobao4iPhone | grep crypt
     cryptoff 16384
    cryptsize 51838976
      cryptid 1
     cryptoff 16384
    cryptsize 56737792
      cryptid 1
➜  taobao

如果查到有2个,就是这个二进制里面有2个架构的包而已。

脱壳-Clutch

脱壳的意思就是把App Store上加的壳程序给去掉,下面介绍2个常用的吧。

<1>. 下载:Clutch,下载地址

<2>. 安装:要想命令行能直接使用,最好放在手机的/usr/bin目录下;

如果权限不够的话,可以增加下权限,chmod使用介绍

chmod 777 /usr/bin/Clutch

<3>. 使用:

使用i可以查看所有需要脱壳的应用

iPhone:~ root# Clutch -I
Installed apps:
1:   京东-好物好玩上京东 <com.360buy.jdmobile>
2:   淘宝 - 双11全球狂欢节 <com.taobao.taobao4iphone>
3:   SuperVPN - 超好用的VPN <com.simple.VPN>
4:   网易云音乐 <com.netease.cloudmusic>
5:   腾讯课堂 <com.tencent.edu>
6:   优酷视频-火星情报局第四季全网独播 <com.youku.YouKu>
7:   爱思加强版 <com.pd.A4Player>
8:   抖音短视频 <com.ss.iphone.ugc.Aweme>
9:   微博 <com.sina.weibo>
10:  腾讯视频-风味人间独播 <com.tencent.live4iphone>
iPhone:~ root#

使用d可以对应用进行脱壳

Clutch -d com.taobao.taobao4iphone

脱壳成功的话在最后会有生成的路径

DONE: /private/var/mobile/Documents/Dumped/com.taobao.taobao4iphone-iOS8.0-(Clutch-2.0.4).ipa // 这个就是脱壳成功的ipa

Finished dumping com.taobao.taobao4iphone in 112.4 seconds

脱壳 - dumpdecrypted

<1>.下载

<2>.放到/var/root目录下,其他当前用户有读写权限的目录下都可以

<3>.使用


DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib   可执行文件路径

方式如下

iPhone:~ root#  DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib  /var/mobile/Containers/Bundle/Application/52E9162D-FB0C-4E79-A711-D94DCD7C102A/Taobao4iPhone.app/Taobao4iPhone
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: @0x100034f20(from 0x100034000) = f20
[+] Found encrypted data at address 00004000 of length 56737792 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/52E9162D-FB0C-4E79-A711-D94DCD7C102A/Taobao4iPhone.app/Taobao4iPhone for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 73777152 in the file
[+] Opening Taobao4iPhone.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 465cf20
[+] Closing original file
[+] Closing dump file
iPhone:~ root#

脱壳成功的话会在dumpdecrypted.dylib库的目录下生成Taobao4iPhone.decrypted文件

15425447415453.jpg

重新再使用之前介绍的方式看看发现都已经脱壳成功了。

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

推荐阅读更多精彩内容

  • 加壳 什么是加壳?利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的 脱壳 什...
    Rathen阅读 515评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,367评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • 我一向不相信自己的运气,这个东西在我这儿一般不灵。我的得到大多是靠我大量的付出所得,前二十多年如此,我也依旧相信接...
    十八岁的青梅阅读 135评论 0 0
  • 上周时间忙了一阵子区块链后台产品的东西,这个后台还处在1.0早期的阶段,总结下来有这么几个经验分享。 一、明确后台...
    路口见飞过阅读 313评论 0 0