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

时间: 2024-11-02 16:12:28

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

ios开发-iOS绘图API实现的问题

问题描述 iOS绘图API实现的问题 开发-iOS绘图API实现的问题-ios开发绘图多点连线"> 提示Set 中并没有anyObject 方法 请问怎么修改呢 解决方案 Set可以这样取里面的对象 let touch = touches.first if touch != nil { let point = touch!.locationInView(self); }

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.       下载:https://github.com/mwaterfall/MWPhotoBrowser   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Gith

iOS开发系列--无限循环的图片浏览器

概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 UIView 在熟悉UIScrollView之前很有必要说一下UIView的内容.在上一篇

iOS开发系列--网络开发

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS开发资源汇总

如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://github.com/carlbrown/PDKeychainBindingsController 对焦功能的实现: http://www.clingmarks.com/?p=612 自定义圆角Switch按件: https://github.com/domesticcatsoftware/DCRou

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 目 录 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定

iOS开发系列--让你的应用“动”起来

概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CALayer常用属性 CALayer绘图 Core Animat

iOS开发中打电话发短信等功能的实现

原文:iOS开发中打电话发短信等功能的实现 在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉及到了打电话的功能. iOS开发中,有三种方式可以打电话: (1)直接跳到拨号界面,代码如下 NSURL *url = [NSURL URLWithString:@"tel://10010"]; [[UIApplication sharedApp

iOS开发中Quartz2D控制圆形缩放和实现刷帧效果_IOS

Quartz2D简要回顾一.什么是Quartz2D  Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统  Quartz 2D能完成的工作:   绘制图形 : 线条\三角形\矩形\圆\弧等   绘制文字   绘制\生成图片(图像)   读取\生成PDF   截图\裁剪图片   自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,⾥⾯有各种各样的UI控件 UILabel:显⽰文字 UIImageView:显示图片 UIBu