逆向第二天-class-dump

在上篇文章中没有提及到这个工具,那么它是什么呢?顾名思义,就是用来dump目标对象的class信息的工具。它利用Objective-C语言的runtime特性,将存储在Mach-O文件中的头文件信息提取出来,并生成对应的.h文件。class-dump的用法比较简单,首先去网站下载最新的class-dump。
下载class-dump后,将

A0646362-842F-409A-866F-3524CE4F21D0.png
复制到/usr/local/bin目录下,在终端中输入class-dump,显示class-dump的版本后,就可以正常使用class-dump的命令了
逆向第二天-class-dump_第1张图片
37D6CA1C-261B-43ED-B462-B1711CDC68CC.png

class-dump的对象是Mach-O格式的二进制文件,如Framework的库文件和App的可执行文件。下面我以一个电脑中安装的微信App为例,来看看class-dump的完整流程。

1.定位App的可执行文件

首先进入到该APP的包内容中,在终端下

cd /Applications/WeChat.app/Contents

然后用Xcode自带的plutil工具查看Info.plist中的“CFBundleExecutable”字段,

Contents XXX$ plutil -p Info.plist | grep CFBundleExecutable

这时候就会输出可执行文件

"CFBundleExecutable" => "WeChat"

2.获得头文件

这里我遇到了一些坑,第一个坑我首先查看了一下我的微信存在哪个文件夹下


05774B68-72AF-46EF-AA6A-98FC428AEC15.png

正好在应用程序下面,然后我就利用命令语言

class-dump -H /Applications/微信.app -o /Users/XXX/Desktop/练习代码/calculate\ heads

却得到了下面的错误提示


EBFD8AFC-574C-4045-A80D-C353B9665EC7.png

这是为什么呢?原来是这样的我的是中文的,微信的名称与扩展名不是微信.app而是Wechat.app


逆向第二天-class-dump_第2张图片
A533D50E-7440-4BC1-80BC-329768A03F12.png
可以在显示简介中看到
然后我再用
class-dump -H /Applications/Wechat.app -o /Users/XXX/Desktop/练习代码/calculate\ heads

就OK了。大家可以用自己的App实践一下,然后用class-dump的头文件对比源文件中的头文件,看看是不是十分相似?除了一些参数类型被改成了id,参数名用arg1、arg2表示之外,几乎一样吧。
通过这些头文件,闭源App的程序架构就能出现端倪了,经验丰富的开发人员可以从中了解非常多的信息,这些信息是iOS逆向工程的基础。不过现在的App工程越来越大,而且还不停的引用第三方代码,因此经常会发现class-dump出来了成百上千个头文件,虽然靠人工及经验一点点的分析是很好的练习方式,但是过程实在太复杂,让人头大。后面,我们会通过各种工具逐步缩小目标范围,最后精准的定位目标函数。
值得注意的是,从App Store下载的App都是经过加密的,可执行文件被加上了一层“壳”,就像是一颗坚硬的核桃,class-dump应付不了这样的文件。此时,我们就要先用工具把壳砸开才行。关于更多的class-dump的用法,请到iOSRE。

参考资料:

书籍:iOS应用逆向工程(第2版)
网站:http://bbs.iosre.com/

你可能感兴趣的:(逆向第二天-class-dump)