zoukankan      html  css  js  c++  java
  • 越狱开发分享

    由于国内资料较少,并且还非常分散,无序,于是写了这个分享,希望后来的人不要重新走弯路。本分享详细的讲述了从无到有的整个过程。整理这些花了不少时间,希望转载请注明

    http://www.cnblogs.com/xiongwj0910/archive/2012/08/16/2642992.html

    纯个人整理文档

     

    针对越狱手机软件开发,由于需要截获系统函数等功能,选择采用TheOS编译环境。

     

    一.TheOS环境搭建

    http://www.thising.com/blog/2012/01/ios越狱开发起步教程/

    之前给的链接由于中文不能识别结果跳错了地址,这里我就直接给中文了。

    这里已经说的很详细了,按照步骤一步一步就可以搭建TheOS的环境。

     

    http://brandontreb.com/beginning-jailbroken-ios-development-your-first-tweak/

    这个是很全面的英文方面的TheOS的环境搭建和打包工具安装以及一个简单的TheOS程序事例。

    编译打包的以及在真机上运行测试的方法 没有采用这个教程上说的设置IP然后ssh连接的方法。

     另外需要自己下载一个class-dunp最新的工具包,这个工具用于导出库的私有头文件。

    下载地址https://github.com/nygard/class-dump

    使用如下

    下面导出SPRINGBOARD

    打开终端输入

    class-dump -H /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/CoreServices/SpringBoard.app -o /Users/lkk/Desktop/Spring

    这样在用户目录就会生产SPRINGBOARD目录。导出的.h都放到这了。

     

    classdump的完整路径-你要导出的框架的完整路径  

    导出来的头文件可能会又些许小语法错误 自己修改一下。常见的错误例如:

    CTmessage.h 导出错误

    改正部分: 把#import "NSObject.h"改成#import <Foundation/NSObject.h>

    //@class CTPhoneNumber, NSArray, NSDate, NSDictionary, NSMutableArray, NSMutableDictionary, NSObject<CTMessageAddress, NSCopying>, NSString;

    改成

     

    @class NSDictionary, NSDate, NSString, NSMutableDictionary, NSArray, CTPhoneNumber, NSMutableArray;

    @protocol CTMessageAddress, NSCopying;

     

     

    定义部分语法错误改正一下。比如NSObject<CTMessageAddress><NSCopying> 改成NSObject<CTMessageAddress,NSCopying>

     

    然后拷贝这个目录到

    /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/include/SpringBoard/

     

    关于class-dump在我的博文中有一篇专门讲述了。

     

    二.编译打包

    首先安装dpkg打包工具

     

    这个是基于MacPorts的安装命令,记得先安装Macports,网上大把安装教程,这里就不说了,切记别重复安装。安装之前先检查一下是否安装过了。 

    port version 查看

     /*更新2012/11/21 Macports安装遇见的问题以及处理方法*/

    之前在公司安装Macport的时候没有碰见什么异常,自己回去用自己的本装的时候,发现总是卡在剩余不到一分钟,然后就不动了。

    于是在网上查了下解决方案。我的处理方法是,首先重启电脑,然后果断断网,再安装。

    这个时候瞬间就装完了。装完之后,再升级。

     

    下载地址是 http://distfiles.macports.org/MacPorts/

    自己选一个合适的版本下载。

     

    断网安装之后,打开控制台,输入

    sudo port -v selfupdate

    更新Macport。

    更新完毕之后就可以了。

    /*更新2012/11/21 Macports安装遇见的问题以及处理方法 end*/

     

    以下是安装dpkg的命令

    sudo port install dpkg

     

    这个执行之后如果报错 

     

    Error: 

    Error: No valid Xcode installation is properly selected.

    Error: Please use xcode-select to select an Xcode installation:

    Error:     sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer # version 4.4

    Error: 

    Warning: xcodebuild exists but failed to execute

    Warning: Xcode does not appear to be installed; most ports will likely fail to build.

     

    就直接执行sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer  重新指定一下路径

     

     

    三.了解TheOS生成的makeFile的文件中各行的意思

    makefile文件内容剖析

    include theos/makefiles/common.mk

    告诉theOS在编译脚本中包括共同的make命令,避免做重复的make编译工作

    APPLICATION_NAME = fooProject

    我们要编译的应用程序的名称。makefile将会用这个常量在内部做一些事情。除非你的应用程序改名称,否则不要修改这个值。

    [applicationName]_FILES = main.m fooProjectApplication.mm RootViewController.mm 

    这里是需要编译的文件列表,注意:不要把头文件添加到这里。如果你要添加一个新的.m或者.mm文件到项目中,确保在这里添加新的文件的名称,否则将不会建立编译连接。

    [applicationName]_FRAMEWORKS = UIKit Foundation QuartzCore AudioToolbox CoreGraphics

    这里包括你想用到框架的名称

    include $(THEOS_MAKE_PATH)/application.mk

    更多默认的 用于帮助TheOS建立项目

     

    四.使用TheOS生成第一个HelloWord后台程序

    打开终端输入

     

    export THEOS=/opt/theos/

    export SDKVERSION=4.3 //sdk版本号,如果是5.1就输入5.1

     

    $THEOS/bin/nic.pl //执行TheOS 

      

    NIC 1.0 - New Instance Creator

    ------------------------------

      [1.] iphone/application

      [2.] iphone/library

      [3.] iphone/preference_bundle

      [4.] iphone/tool

      [5.] iphone/tweak

    Choose a Template (required): 5

    Project Name (required): WelcomeWagon 

    Package Name [com.yourcompany.welcomewagon]:                 

    Author/Maintainer Name [Brandon Trebitowski]

    MobileSubstrate Bundle filter [com.apple.springboard]

    Instantiating iphone/tweak in welcomewagon/...

    Done.

     

    这里选择了5,5是一个后台程序。接下来我们要做的是当系统开机时候弹出HelloWorld字样的Alert框。

    这里我们要用到hook(钩子)钩取系统开机时候调用的其中一个函数 在那个函数中插入我们的Alert。

     

    %hook and %end

    %hook Springboard

    // overwrite methods here

    %end

     

     

    hook后面跟一个类名%hook 要与%end配对使用中间为你想要截获的这个类的函数。

     

    打开 Tweak.xm 添加如下代码

    #import <SpringBoard/SpringBoard.h>

     

    %hook SpringBoard

     

    -(void)applicationDidFinishLaunching:(id)application {

        %orig;

        

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome" 

            message:@"Hello World!" 

            delegate:nil 

            cancelButtonTitle:@"Thanks" 

            otherButtonTitles:nil];

        [alert show];

        [alert release];

    }

     

    %end

     

    %orig;功能是执行这个函数原来的动作。如果你想完完全全禁止某个函数的功能,不使用 %orig;即可。

     

    这里使用了UIKit框架的Alert类,所以需要在makeFile文件中添加

     

    WelcomeWagon_FRAMEWORKS = UIKit

     

    这一句。前面又说明 这句的意思 这里不做过多说明了

     

    接下来编译使用命令

    打开控制台,进入到你的这个工程文件夹,使用命令

    make

    然后会生成一个.obj的文件夹,在文件夹内又一个dylib的包,这个就是我们需要的动态库文件了。把这个dylib放入如下图所示路径下。(package/Library/MobileSubstrate/DynamicLibraries/)

    package文件夹是自己创建的(由于这里我偷了个懒直接从开源项目里面搬过来了,所以那个preferenceLoder文件夹没用到),自己生成的工程是没有,为了让dylib和plist安装到系统指定文件夹目录下(/Library/MobileSubstrate/DynamicLibraries/)。使用iFile 等等的文件管理工具 可以看见你设备中的文件路径情况。

    /*2012年10月18日更新内容*/

    另外,那个DEBIAN文件夹是需要的,里面放control文件即可。control文件再你的根目录可以找到。

    /*2012年10月18日内容说明更新完毕/

    打包成deb包

    使用dpkg -b 需要打包的文件夹路径

    例如: 

    我要打包package这个文件夹

     

    dpkg -b /Users/ws/Desktop/Theos目录/IconRenamer/package 

     

    使用这个命令即可生成一个package.deb文件在当前路径下

     

     

    安装测试运行

    这里的步骤和网上的一些教程有些不一样,首先在iphone上下载iFile这个工具。pc端下载pp助手 91助手 iTools等工具将deb安装包放置在iphone中的任意位置,例如:

     

     

    使用iFile找到package.deb这个安装包,点击之后 会有一个安装选项。选择安装即可。然后重启,你的屏幕上就会华丽丽的出现Hello World!的弹出框了。

     

     

    这里插一句,我们的一个产品friendIn已经上线了,FriendIn帮你整和所有社交平台的好友最新动态,你可以通过FriendIn随时随地关注你关心的朋友的最新动态。

     

    第二弹 hook的使用

    上面只是介绍一种hook的使用方法,这里进行详细的介绍。

    MobileHooker 用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩). 将使用到3API

    IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.

    void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);

    void MSHookFunction(void* function, void* replacement, void** p_original);

     

    MSHookMessage() Objective-C中替换implementation[class Selector] 通过替换 并返回原来的执行。挂钩一个类的方法,

    MSHookemessage(EX)中调用Objc_getMetaClass得到提供的元数据和类检索,例如下面的注释。这种动态替换是Objective-c的一个功能使用method_setImplementationMSHookMmessage()是线程不安全的,不赞成使用,赞成MSHookMessageEx()

     

    MSHookFunction() 很像 MSHookMessage() 但是适合于c/c++ 的函数。MSHookFunctin() 将写入指令调入指定替换函数,并接会分配一些字节在内存地址,相当于原始切出指令并且跳入原始的挂钩方法。由于iPhone系统默认的内存页不能同时写和执行,一个内核补丁必须申请MSHookFunction() 工作.

    截止MobileSubstrate的最新版本,MSHookMessage() 也需要一个内核补丁 调用关闭的挂钩的所有正确方法。

     

    代码示例:

    使用 MSHookfunction:

    static void (*original_CFShow)(CFTypeRef obj);  // a function pointer to store the original CFShow().

    void replaced_CFShow(CFTypeRef obj) {           // our replacement of CFShow().

      printf("Calling original CFShow(%p)...", obj);

      original_CFShow(obj);                         // calls the original CFShow.

      printf(" done.\n");

    }

    ...

    // hook CFShow to our own implementation.

    MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);

    // From now on any call to CFShow will pass through replaced_CFShow first.

    ...

    CFShow(CFSTR("test"));

     

    使用 MSHookMessageEX:

    static IMP original_UIView_setFrame_;

    void replaced_UIView_setFrame_(UIView* self, SEL _cmd, CGRect frame) {  // Note the implicit self and _cmd parameters are needed explicitly here.

      CGRect originalFrame = self.frame;

      NSLog("Changing frame of %p from %@ to %@", self, NSStringFromCGRect(originalFrame), NSStringFromCGRect(frame));

      original_UIView_setFrame_(self, _cmd, frame);    // Remember to pass self and _cmd.

    }

    ...

    MSHookMessageEx([UIView class]@selector(setFrame:)(IMP)replaced_UIView_setFrame_,(IMP *)&original_UIView_setFrame_);

    ...

    myView.frame = CGRectMake(00100100);

     

    注意,如果你挂钩一个类的方法,有必须放一个元类在类参数中。

    MSHookMessageEx(objc_getMetaClass("UIView")@selector(commitAnimations), replaced_UIView_commitAnimations, (IMP *)&original_UIView_commitAnimations);

     

     

    这里的MSHookMessageEx或者MSHookMessage方法等同于 %hook %end的方法 建议使用%hook %end 对,比较方便和简洁。

    这些方法只要是安装好了TheOS环境既可以使用。

     

    TheOS的一些设置 TheOS默认警告级别很高,把所有的警告当成错误处理,如果想降低警告级别 只需要

    TheOS 设置警告等级,默认是把警告当成错误处理

    Now, all we need to do is fix Theos's treatment of errors.

     

    In Makefile, add the following line BEFORE EVERYTHING:

     

    GO_EASY_ON_ME = 1

     

    This tells Theos not to treat warnings as errors. It removes the -Werror flag from the compiler arguments. We are ready to build the tweak!

     

     

     

     

    基本上就这些内容了.

  • 相关阅读:
    UI自动化之鼠标、键盘事件
    iframe框中元素定位
    接口 Interface
    序列化和反序列化
    密封类和部分类
    简单工场设计模式
    ADO.NET数据库操作
    集合
    里氏转换
    装箱和拆箱
  • 原文地址:https://www.cnblogs.com/xiongwj0910/p/2642992.html
Copyright © 2011-2022 走看看