iOS开发之私有API No.1 私有API的查找和生成

最近研究一个应用,可以在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的使用,最近正在研究中,等研究通了再记录下吧。

你可能感兴趣的:(iOS)