class-dump,是可以把OC运行时的声明的信息导出来的工具。说白了,就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来。废话不多说。 class-dump的下载地址是:
http://stevenygard.com/download/class-dump-3.5.tar.gz
或
http://www.codethecode.com/projects/class-dump/
将下载好的 class-dump解压后放入usr/local/bin 下,然后赋予其执行权限,即可使用:
adongMacBook-Pro:~ chenzhidong$ sudo chmod 777 /usr/local/bin/class-dump
Password:
adongMacBook-Pro:~ chenzhidong$
class-dump的使用方法
命令格式通常为:
class-dump -S -s -H /path/to/binaryfile -o /path/to/dumpHeader/
ps:有时候一些头文件dump不出来,或dump出后就一个CDStructures.h文件,此时有可能是二进制文件已被 加壳,需要进行砸处理;如果没有加壳,或砸壳后仍是只有CDStructures.h文件,则可能需要指定其指令集(armv7s,armv6...)
命令格式如:
class-dump --arch armv7 -S -s -H /path/to/binaryfile -o /path/to/dumpheader/
ps:
后面从dyld_shared_cache_armv7s里decahe出的库,可以dump,而从iphone5s,9.1系统里dyld_shared_cache_arm64库里decache出来的库,dump不了,提示:
class-dump[20557:1574323] Warning: This file does not contain any Objective -C runtime information.
原因是class-dump依赖于__DATA段下的几个sect里的数据。 iOS9 dyld解包的生成macho不在标准__DATA段,导致某些classdump无法识别。
此时可以用RuntimeBrowser来查看,下载地址:
https://github.com/nst/RuntimeBrowser
下载后,mac端查看私有api,可以编译运行osx文件夹里的工程:
ios逆向工具--class-dumpX
查看ios端的私有api,则可以先编译ios文件夹下的工程,然后安装到ios上;装好后打开如下:
ios逆向工具--class-dump
在About页面底部查看,会有一个http地址,如:http://192.168.0.151:10000/
(PS:请确保ios和mac在同一个wifi下)
然后在mac中浏览器上访问该地址,即可查看ios中相关的私有api了,eg:
ios逆向工具--class-dump
---------------------------------
p.s.
顺便说一下,还有一款非常好用的工具logify.pl,用来配合分析class-dump出来的头文件。
此工具,可以直接把指定的.h头文件,导出成hook插件xm文件。
命令格式:
logify.pl /path/to/headfile>/path/to/tweak.xm
eg:
adongMacBook-Pro:~ chenzhidong$ logify.pl /Users/chenzhidong/AppstoreASO/Header_IOS9/SpringBoardHead/SBIconController.h>/Users/chenzhidong/iosCode/dockviewtweak/Tweak.xm
得到的tweak.xm内容如下:
ios逆向工具--class-dump
如果生成的tweak.xm文件里,缺少对应的定义类型,则可以在tweak.h同目录下,创建.h头文件,然后自行构造对应的类型或方法声明即可。如:
类型定义:
typedef void(^CDUnknownBlockType)(void);
类定义:
@interface SSFamilyCircle
{
}
@end
空的即可,只是让编译器编译通过而已;然后在tweak中引用此头件即可通过编译;
后面发现更简单的方法是:
如果是类定义,直接在tweak.xm的头部写:
@class SSFamilyCircle;
如果常量类型如CDUnknownBlockType,可以直接用id代替即可;
ios逆向工具--class-dump
如果碰到:
Tweak.xm:25:9: error: expected selector for Objective-C method
- (void).cxx_destruct{%log;%orig;}
直接删除此类无意义的方法即可。