O’s World

努力!奋斗!

使用 Class-dump-z 和 Clutch 分析 iOS App

| 评论

什么是 class-dump-z

class dump 是一个命令行工具,用来监测存储在 Mach-O 二进制文件理的 Objective-C 运行时信息。它为类(class),分类(category)和协议(protocol)生成声明信息。这些信息与 otool -ov 命令提供的信息是一样的,但表示得更像正常的 Objective-C 的声明,所以它更紧凑,更易读。

class dump 有三个版本:class-dump, class-dump-x 和 class-dump-z。class-dump-z 是对 class-dump 和 class-dump-x 改进版,完全用C++重写,避免动态调用,使得 class-dump-z 比它的前任们快10倍左右。并且可以在 Linux,Mac, iPhone 上运行。

安装 class-dump-z

class-dump-z 的安装十分简单。只要到这里下载最新的版本并解压,然后将 mac_x86/class-dump-z 拷贝到 /usr/bin/ 目录中即可。

尝试导出 App 代码信息

class-dump-z 安装完成之后就可以开始 App Crack 工作。

首先使用iExploer(或iFunbox)打开真机的应用程序目录,打开 目标程序 xxxx.app 子目录,按照文件大小排序,找到一个与父目录同名的程序文件xxxx,这个就是编译后的主程序了,将它导出到 Mac 中。

然后在终端中输入命令:

1
class-dump-z xxxx

然后会看到如下的提示信息和输出:

Warning: Part of this binary is encrypted. Usually, the result will be not meaningful. Try to provide an unencrypted version instead.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * This header is generated by class-dump-z 0.2a.
 * class-dump-z is Copyright (C) 2009 by KennyTM~, licensed under GPLv3.
 *
 * Source: (null)
 */

@protocol XXEncryptedProtocol_7c2bc
-(?)XXEncryptedMethod_63de7;
-(?)XXEncryptedMethod_64b92;
-(?)XXEncryptedMethod_64b86;
-(?)XXEncryptedMethod_64b7e;
-(?)XXEncryptedMethod_64b77;
-(?)XXEncryptedMethod_64311;
-(?)XXEncryptedMethod_64b63;
-(?)XXEncryptedMethod_64b52;
-(?)XXEncryptedMethod_64b43;
-(?)XXEncryptedMethod_64b3b;
-(?)XXEncryptedMethod_64b14;
-(?)XXEncryptedMethod_64af8;
-(?)XXEncryptedMethod_64ae7;
-(?)XXEncryptedMethod_64ae2;
-(?)XXEncryptedMethod_64add;
-(?)XXEncryptedMethod_63e09;
-(?)XXEncryptedMethod_64ad2;
-(?)XXEncryptedMethod_64acd;
-(?)XXEncryptedMethod_64ac4;
@optional
-(?)XXEncryptedMethod_64b9e;
@end

这明显不是我们想要的结果!原因是苹果会对所有发布到 App Store 上的 App 进行加密,简单的 class-dump-z 无法导出其代码信息!现在我们需要另外一个工具将目标 App 解密,这个工具就是 Clutch。

什么是 Clutch

Clutch是一个 iOS 工具,专门用来将手机中的 App 进行解密。安装 Clutch 首先要将设备越狱,而且由于 Clutch 是一个命令行工具,要想使用它还必在设备中须安装 MobileTerminal 或 OpenSSH。

安装和配置 Clutch

首先到这里下载 Clutch 的最新版本并将其拷贝到设备的 /usr/bin 目录中:

1
scp scp Clutch-1.4.2 root@192.168.xxx.xxx:/usr/bin #拷贝文件

然后使用 ssh 连接到设备,重命名文件并设置权限:

1
2
3
4
ssh root@192.168.100.158 #使用SSH连接设备
cd /usr/bin
mv Clutch-1.4.2 clutch #将 Clutch-1.4.2 重命名为 Clutch
chmod 0x777 clutch #修改 clutch 的权限

接着在 ssh 连接中使用 Clucth -C 命令,根据提示设置好 clutch 即可。

使用 Clucth 解密 App

经过上面的安装和设置 Clucth 已经可以正常使用了。在 ssh 连接中使用 Clutch 命令后会看到一个如下的 App 列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
Clutch 1.4.2
---------------------------------

1) AiCai
2) App
3) Articles
4) calendar
5) CalendarsLite
6) CarrotFantasy
7) ConverterInfinity
8) converti
9) Convertible
10) CYLS

在列表中找到需要解密的 App,记住前面的编号比如是 9,然后执行命令 Clutch 9稍等片刻就可完成对目标 App 的解密。

再次尝试导出 App 代码信息

提示完成之后,会看见解密后的 ipa 文件路径,将其拷贝到 Mac 中,修改后缀名为 zip 并解压。找到其中的主程序文件,再次使用命令 class-dump-z xxxx,就可以看到目标程序的头文件信息啦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
 * This header is generated by class-dump-z 0.2a.
 * class-dump-z is Copyright (C) 2009 by KennyTM~, licensed under GPLv3.
 *
 * Source: (null)
 */

typedef struct _NSZone NSZone;

typedef struct CGPoint {
    float _field1;
    float _field2;
} CGPoint;

typedef struct CGSize {
    float _field1;
    float _field2;
} CGSize;

typedef struct CGRect {
    CGPoint _field1;
    CGSize _field2;
} CGRect;

typedef struct _NSRange {
    unsigned _field1;
    unsigned _field2;
} NSRange;

@protocol NSObject
-(id)description;
-(unsigned)retainCount;
-(id)autorelease;
-(oneway void)release;
-(id)retain;
-(BOOL)respondsToSelector:(SEL)selector;
-(BOOL)conformsToProtocol:(id)protocol;
-(BOOL)isMemberOfClass:(Class)aClass;
-(BOOL)isKindOfClass:(Class)aClass;
-(BOOL)isProxy;
-(id)performSelector:(SEL)selector withObject:(id)object withObject:(id)object3;
-(id)performSelector:(SEL)selector withObject:(id)object;
-(id)performSelector:(SEL)selector;
-(NSZone*)zone;
-(id)self;
-(Class)class;
-(Class)superclass;
-(unsigned)hash;
-(BOOL)isEqual:(id)equal;
@optional
-(id)debugDescription;
@end

ps:

  1. 使用 class-dump-z xxxx > ./xxxx-classdump.txt 可以将目标程序的代码信息导出到单个文本文件中方便查找。
  2. 使用 class-dump-z -H -o xxxx ./SourceCode 可以将目标程序的所有代码信息以头文件的形式输出到指定目录,每个类一个文件。