最近研究一个应用,可以在un-jailbreak的情况下打开4G功能,是的,就是很火的“移动流量仪”,想要知道他是如何做到的,正好我的手机已经jailbreak了,打开SSH通道,然后用find -mmin 1 命令来查看1分钟内改动后的文件,发现是修改了系统的一个配置文件。于是就猜测应该是调用了私有的API。就顺着查下去,先从私有API说起吧:
一、关于苹果API:
1、Published API(公开的API):又称 Documented API(文档中记录的API)。是苹果通过 Cocoa Touch 向全世界第三方开发者公开的所有 API 。
2、UnPublished API(未公开API):又称 Undocumented API(文档中未记录的API),是指虽然放在Frameworks框架中,但是却没有在苹果的官方文档中有使用说明、代码介绍等记录的API。按苹果的说法,未公开的API是还不够成熟,可能还会变动的API,等完全成型了后会变成公开的API,但是目前不对其提供承诺,就是系统版本升级后可能会失效。
3、Private API(私有API):指的是SDK下的 PrivateFrameWorks框架下的API,真实存在于 Cocoa Touch 中。私有API是苹果明确规定不能使用的API,一旦你的作品中有私有API,在上传AppStore的时候会100%被拒绝的。如果当作小范围软件的话就可以尝试一下,比如再Cydia上发布,91上发布,条件不会很苛刻的。
(摘自:http://blog.csdn.net/wwmusic/article/details/9167545)
私有API的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/PrivateFrameworks
想要查看这里面的文件,在终端里面输入 open /Applications/Xcode.app/Contents/... 就可以打开这个文件夹了,我们可以看到在Library文件夹下面还有一个文件夹叫frameworks,这里面放的都是可以在XCode里面直接引用的frameworks,也就是上面说的 published API。
我们已经找到了私有API的位置,可是如果打开后会发现里面的文件并不是我们想要的,这就需要利用一个nb的软件:class-dump
网上有很多 class-dump的使用教程有很多,往往还需要一个脚本文件,用来批量处理我们想得到的私有framework,下面说下步骤吧:
1. 把class-dump放到/usr/bin路径下,我的系统是10.9的,所以可能bin文件夹的路径和网上教程里面说的有些不一样。
2. 下载classdump.pl脚本文件,然后修改一下文件的路径,我把我的文件内容贴一下吧,
#!/usr/bin/perl # 24 November 2008 # Framework Dumping utility; requires class-dump # use strict; use Cwd; use File::Path; my $HOME = (getpwuid($<))[7] || $ENV{'HOME'} or die "Could not find your home directory!"; # This command must be in your path. # http://www.codethecode.com/projects/class-dump/ my $CLASS_DUMP = 'class-dump'; my $IPHONE_SDK = '7.1'; # Public Frameworks dump_frameworks("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$IPHONE_SDK.sdk/System/Library/Frameworks", 'Frameworks'); # Private Frameworks dump_frameworks("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/PrivateFrameworks", 'PrivateFrameworks'); sub dump_frameworks { my($dir, $subdir) = @_; opendir(my $dirh, $dir) or die "Could not opendir($dir) - $!"; # Iterate through each framework found in the directory foreach my $file (grep { /\.framework$/ } readdir($dirh)) { # Extract the framework name (my $fname = $file) =~ s/\.framework$//; print "Framework: $fname\n"; my $headers_dir = "$HOME/iphone/Headers/sdk$IPHONE_SDK/$subdir/$fname"; # Create the folder to store the headers mkpath($headers_dir); # Perform the class-dump my $cwd = cwd(); chdir($headers_dir) or die "Could not chdir($headers_dir) - $!"; system($CLASS_DUMP, '-H', "$dir/$file"); if($? == -1) { die "Could not execute $CLASS_DUMP - $!\n"; } elsif($? & 127) { printf("$CLASS_DUMP died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'); exit; } elsif(my $ret = $? >> 8) { die "The command '$CLASS_DUMP -H $dir/$file' failed, returning $ret\n"; } chdir($cwd) or die "Could not chdir($cwd) - $!"; } }
最好直接在mac os下面建立pl文件,如果是在windows下面新建的然后拷贝到mac os里面,可能会造成/n和/n/r等的错误,具体错误不记得了,反正当时会出现运行时候的错误,后来在stackOverflow上面查到的问题原因就是在windows下新建然后拷贝到mac os后造成的错误。
3. 给 这两个文件添加权限。
利用chmod 命令,给这两个文件添加上所有的权限, 可以在任意路径下执行 chmod 777 class-dump 命令,把 class-dump设置最高权限。然后cd到 .pl文件所在的目录下,执行 chmod 777 class-dump.pl ,吧.pl文件也执行设置最高权限。如果没有这一步,可能也会在运行是提示出错。
chmod命令后面的777的意义:
chmod 600 ××× (只有所有者有读和写的权限)
chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
chmod 700 ××× (只有所有者有读和写以及执行的权限)
chmod 666 ××× (每个人都有读和写的权限)
chmod 777 ××× (每个人都有读和写以及执行的权限)
其中×××指文件名(也可以是文件夹名,不过要在chmod后加-ld)。
解释一下,其实整个命令的形式是
sudo chmod -(代表类型)×××(所有者)×××(组用户)×××(其他用户)
三位数的每一位都表示一个用户类型的权限设置。取值是0~7,即二进制的[000]~[111]。
这个三位的二进制数的每一位分别表示读、写、执行权限。
如000表示三项权限均无,而100表示只读。这样,我们就有了下面的对应:
0 [000] 无任何权限
4 [100] 只读权限
6 [110] 读写权限
7 [111] 读写执行权限
4. 在.pl文件的目录下执行 ./class-dump.pl 运行脚本文件,这样就可以把所有的framework,public和private的都放到一个新生成的Header文件夹下面。
当然,过程中会出现错误提示,因为有的不是用objc写的,而是用C写的,会提示错误。
不过我们已经知道了如何得到私有API的步骤。
而class-dump的另一个NB之处是它可以反编译出一个APP的所有头文件,不管这个APP是在APP store上架的还是用企业账号发布的,都可以反编译。这个教程就相对简单了,正确安装了class-dump后,把想要破解的app的文件找出来,执行命令就ok了,网上很多教程,就不写了。
其实我最后并没有自己生成这些私有API的头文件,这个里面有我们需要的所有ios系统的头文件:https://github.com/MP0w/iOS-Headers
关于私有API的使用,最近正在研究中,等研究通了再记录下吧。