读书频道 > 网站 > 网页设计 > iOS应用逆向工程(第2版)
3.1 class-dump
15-06-17    下载编辑
收藏    我要投稿   

本文所属图书 > iOS应用逆向工程(第2版)

仔细阅读了本书从字里行间可以感受到作者的认真,在当今这个浮躁的大环境中,这是非常难得的,单从认真这点来看,这本书绝不是一本水货,强烈推荐大家阅读,尤其是初学者。本书的前六章侧重于理论的介绍,但又不立即去当当网订购
class-dump,顾名思义,就是用来dump目标对象的class信息的工具。它利用Objective-C语言的runtime特性,将存储在Mach-O文件中的头文件信息提取出来,并生成对应的.h文件。
 
class-dump的用法比较简单,首先去http://stevenygard.com/projects/ class-dump下载最新版的class-dump,如图3-1所示。


 
下载class-dump-3.5.dmg后,将dmg文件里的class-dump复制到“/usr/bin”下,然后在Terminal中执行“sudo chmod 777 /usr/bin/class-dump”命令赋予其执行权限。运行class-dump,即可看到它的一些基本参数,如下:
 
snakeninnysiMac:~ snakeninny$ class-dump
class-dump 3.5 (64 bit)
Usage: class-dump [options] <mach-o-file>

  where options are:
        -a             show instance variable offsets
        -A             show implementation addresses
        --arch <arch>  choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)
        -C <regex>     only display classes matching regular expression
        -f <str>       find string in method name
        -H             generate header files in current directory, or directory specified with -o
        -I             sort classes, categories, and protocols by inheritance (overrides -s)
        -o <dir>       output directory used for -H
        -r             recursively expand frameworks and fixed VM shared libraries
        -s             sort classes and categories by name
        -S             sort methods by name
        -t             suppress header in output, for testing
        --list-arches  list the arches in the file, then exit
        --sdk-ios      specify iOS SDK version (will look in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk
        --sdk-mac      specify Mac OS X version (will look in /Developer/SDKs/MacOSX<version>.sdk
        --sdk-root     specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)

 

 
class-dump的对象是Mach-O格式的二进制文件,如Framework的库文件和App的可执行文件。下面以笔者的一个App为例,来看看class-dump的完整流程。
 
1. 定位App的可执行文件
 
首先把带class-dump的App拷贝到OSX中,笔者放在了“/Users/snakeninny”下。然后在Terminal中进入App所在的目录,并用Xcode自带的plutil工具查看Info.plist中的“CFBundleExecutable”字段,如下:
 
snakeninnysiMac:~ snakeninny$ cd /Users/snakeninny/SMSNinja.app/
snakeninnysiMac:SMSNinja.app snakeninny$ 
snakeninnysiMac:SMSNinja.app snakeninny$ plutil -p Info.plist | grep CFBundleExecutable
  "CFBundleExecutable" => "SMSNinja"

 

 
当前目录下的“SMSNinja”就是App的可执行文件。
 
2. class-dump可执行文件
 
把SMSNinja的头文件class-dump到“/path/to/headers/SMSNinja/”下,并将头文件内容按名字排序,命令如下:
 
snakeninnysiMac:SMSNinja.app snakeninny$ class-dump -S -s -H SMSNinja -o /path/to/headers/SMSNinja/
 
大家可以用自己的App实践一下,然后用class-dump的头文件对比源文件中的头文件,是不是十分相似?除了一些参数类型被改成了id,参数名用arg1、arg2表示之外,几乎就是一模一样的吧?class-dump帮我们排序后,头文件的可读性甚至变高了。
 
使用class-dump分析自己的App没有太大意义,我们当然不会止步于此:同样是闭源应用,class-dump既然能提取自己App里的头文件,自然也能提取别人App里的头
文件!
 
透过这些头文件,闭源App的程序架构就能初现端倪了,经验丰富的开发人员可以从中了解非常多的信息,这些信息是iOS逆向工程的基础。不过现在的App工程越来越大,而且还在不停地引用第三方代码,因此经常会发现class-dump出来了成百上千个头文件,虽然靠人工及经验一点点地分析是很好的练习方式,但过程实在太复杂,让人头大。在后面的章节,将通过各种工具逐步缩小目标范围,最后精准地定位目标函数。
 
值得注意的是,从AppStore下载的App都是经过加密的,可执行文件被加上了一层“壳”,就像是一颗硬硬的核桃,class-dump应付不了这样的文件。你想想,我们试图用class-dump这样一个镊子来取肉,别说解馋,没把镊子夹坏就算不错啦!此时使用class-dump看上去会“失效”。要想吃核桃,还得先用别的工具把壳砸开才行,具体的内容下一章就会揭晓。关于class-dump的更多用法,请持续关注http://bbs.iosre.com。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站