使用Theos做一个简单的Mobile Substrate Tweak

01 January 2014

Mobile Substrate和Theos

Mobile Substrate是Cydia的作者Jay Freeman (@saurik)的另外一个牛X的作品,也叫Cydia Substrate,它的主要功能是hook某个App,修改代码比如替换其中方法的实现,Cydia上的tweak都是基于Mobile Substrate实现的。目前支持iOS和Android平台。

根据github上的介绍,theos是一个跨平台iPhone Makefile系统。它的主要功能是生成iPhone 越狱App、tweak等程序的框架结构,并提供makefile来编译、打包和安装。

需要的准备工作:

####Mac * 安装Theos,从Theos的GitHub上clone下来一份,放到某个目录下,这里我放到了/opt/下。 * 安装Xcode Command Line Tools,可以在命令行下执行xcode-select --install来安装或者参考SO来安装,安装完之后再进行下一步。 * 安装dpkg ,首先安装MacPorts,可以通过它的官网,根据自己的系统版本来选择。安装好之后,重启Terminal,执行port version,显示出版本号说明安装成功。如果提示command not found,尝试在/etc/paths文件中加入下面两个路径:/opt/local/bin/opt/local/sbin,需要使用root权限来编辑,比如用Vim的话:sudo vi /etc/paths. 重启Terminal,再次输入port version就应该会显示版本号了,然后执行sudo port selfupdate来更新一下,之后执行sudo port install dpkg来安装dpkg. 安装dpkg的目的是把我们写的tweak打成deb包。

JailBreaked iPhone iOS 5/6

  • 安装OpenSSH,打开Cydia的主界面就能看到OpenSSH Access How-To 以及Root Password How-To的选项,可以按照它的提示一步一步安装,这里不赘述了,需要提醒的是一定要改掉root的密码,防止别人通过SSH连接到你的手机。这一步是为了后面我们通过SSH连接到手机,把deb包安装到手机上准备的。 
    iOS7上的Mobile Substrate还有bug,32位的系统下每次重启后需要重新安装Mobile Substrate才能正常使用, 64位今天貌似才能用。推荐暂时在iOS5/6的机器上测试[2014-01-01]。
  • apt. 在cydia中搜索Apt检查是否已经安装,没有安装就安装一下。
  • ldid. 全名是Link Identify Editor,也直接可以在Cydia中搜索全名安装。

创建Tweak并安装到手机上

首先我在桌面上创建一mytweaks的文件夹,保存我们要创建的tweak程序。

?  ~        cd ~/Desktop
?  Desktop  mkdir mytweaks
?  Desktop  cd mytweaks

然后执行我们刚才的获得的theos来生成一个tweak的模板:

?  mytweaks  /opt/theos/bin/nic.pl
NIC 2.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): FirstTweak
Package Name [com.yourcompany.firsttweak]: com.joeyio.firsttweak
Author/Maintainer Name [Joey]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
[iphone/tweak] List of applications to terminate upon installation (space-separated, ‘-‘ for none) [SpringBoard]:
Instantiating iphone/tweak in firsttweak/...
Done.

在创建模板的时候,我们选择5,创建一个iPhone的tweak.其他4个选项可以自己去搜索下。名字输入FirstTweak,包名我输入com.joeyio.firsttweak,下面的三个选项都直接回车使用缺省值。
MobileSubstrate Bundle filter这一项表示要hook的程序,默认是com.apple.springboard,就是hook Spring Board,如果你想hook别的App,这里改成那个App的BundleID.

OK,那么我们的第一个tweak就创建好了,好像一点也不难啊。进入到firsttweak目录下,使用make编译一下,可能结果是这样的:

?  firsttweak  make
/Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/makefiles/targets/Darwin/iphone.mk:41: Deploying to iOS 3.0 while building for 6.0 will generate armv7-only binaries.
Making all for tweak FirstTweak...
 Preprocessing Tweak.xm...
Name "Data::Dumper::Purity" used only once: possible typo at /Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/bin/logos.pl line 615.
 Compiling Tweak.xm...
 Linking tweak FirstTweak...
 Stripping FirstTweak...
 Signing FirstTweak...
 /bin/sh: ldid: command not found

我们看到里面有2个警告,第一个我没有搜索到什么结果,第二个是只要手机上安装ldid就行了,这里不用管它。我自己试了一下,是可以安装到手机上的,可以暂时忽略,如果哪位小伙伴知道什么原因,欢迎告知。

在部署到手机之前确认手机和电脑在一个wifi环境下,并且可以通过SSH连接到手机,方法是在Terminal下,通过SSH连接到手机,之后会提示你输入root密码(上面安装SSH步骤中有提到),确保连接成功再往下进行。手机的IP地址可以在wifi设置中看到。

ssh [email protected]手机IP地址

然后把手机IP地址放在THEOS_DEVICE_IP环境变量中,这样theos才知道安装到哪里,如下:

export THEOS_DEVICE_IP=手机IP地址

然后执行make package install打包并安装到手机上 (如果Cydia在前台,把它退到后台,否则安装会失败):

?  firsttweak  make package install
/Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/makefiles/targets/Darwin/iphone.mk:41: Deploying to iOS 3.0 while building for 6.0 will generate armv7-only binaries.
Making all for tweak FirstTweak...
make[2]: Nothing to be done for `internal-library-compile‘.
Making stage for tweak FirstTweak...
dpkg-deb:正在新建软件包“com.joeyio.firsttweak”,包文件为“./com.joeyio.firsttweak_0.0.1-2_iphoneos-arm.deb”。
install.exec "cat > /tmp/_theos_install.deb; dpkg -i /tmp/_theos_install.deb && rm /tmp/_theos_install.deb" < "./com.joeyio.firsttweak_0.0.1-2_iphoneos-arm.deb"
[email protected]‘s password:
Selecting previously deselected package com.joeyio.firsttweak.
(Reading database ... 6250 files and directories currently installed.)
Unpacking com.joeyio.firsttweak (from /tmp/_theos_install.deb) ...
Setting up com.joeyio.firsttweak (0.0.1-2) ...
install.exec "killall -9 SpringBoard"
[email protected]‘s password:

安装过程中需要输入两次手机Root密码,一次是为了把打包后的deb程序文件传到手机上,另外一次是kill掉SpringBoard,使SpringBoard重启。

完成后在Cydia里的“变更”里,往下翻一翻,就能看到一个名字为“FirstTweak”的插件了了,想想接下来出任CEO,迎娶白富美,走向人生巅峰,有木有一点小激动?

完成一个小功能

到目前为止,我们还没写过一行代码呢。下面我们要完成一个小功能:在锁屏界面增加一个UILabel显示一行文字,可以是你的座右铭或者其他的,这里我们显示Hello, MobileSubstate!!

打开我们刚才创建的firsttweak目录下的Makefile文件,在FirstTweak_FILES = Tweak.xm下面增加一行FirstTweak_FRAMEWORKS = UIKit并保存文件,前缀都是TWEAK_NAME的值,也就是FirstTweak,注意根据你自己的情况来修改。增加这行的原因很明显,增加UILabel需要用到UIKit Framework。整个文件看起来像这样:

include theos/makefiles/common.mk

TWEAK_NAME = FirstTweak
FirstTweak_FILES = Tweak.xm
FirstTweak_FRAMEWORKS = UIKit

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 SpringBoard"

这个步骤完成之后,我们就要找到锁屏界面对应的ViewController,然后替换它的某个方法,把UILabel添加到它的view上。这个ViewController的名字叫SBAwayController, SB是SpringBoard的缩写,不要想偏了 :).我们要替换它的- (void)activate方法。SBAwayController类的头文件可以在iOS6的私有类的头文件中找到。在SBAwayController里有个叫_awayViewivar,获得这个ivar需要一个theos中不存在的方法,好吧,它叫MSHookIvar,这个方法在默认的theos的substrate.h头文件里没有,可以在GitHub得到包含这个方法的头文件。下载到本地,覆盖theos/include下的同名文件(推荐将原有的substrate.h头文件重命名)。

OK,到这里万事具备,只欠Coding了。

打开firsttweak目录下的Tweak.xm文件并清空,添加下面这段代码:

%hook SBAwayController
- (void)activate  {
    %orig(); //invoke the orignal method to do what should to do.
    NSLog(@"=========================================================");
    NSLog(@"Hello MobileSubstrate!!");
    NSLog(@"=========================================================");

    //get _awayView via MSHookIvar method
    UIView *_awayView = MSHookIvar<*>(self, "_awayView");

    //create a lable whose width = 200 and height = 100 and add to _awayView
    float w = 200;
    float h = 100;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake((_awayView.frame.size.width - w)/2,100,w,h)];
    label.text = @"Hello, MobileSubstate!!";
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    [_awayView addSubview:label];
}
%end

大概解释一下,%hook SBAwayController以及里面的- (void)activate方法,其实就类似swizzling了SBAwayControlleractivate方法。当系统执行SBAwayControlleractivate方法的时候会执行tweak里的activate的方法。 在这里方法里我们先执行了%orig(),就是执行原来的activate方法,保证原有的方法先执行,再执行我们自己的代码。

这个activate方法在第一次进入锁屏界面的时候会执行,在以后每次非锁屏状态下,按关机键也会执行。

接下来就是通过MSHookIvar获得_awayView。然后就是我们非常熟悉的了,创建一个UILabel,添加到_awayView里。到这里就结束了。make package install一下(还需要先执行一下export THEOS_DEVICE_IP=手机IP地址),安装到手机上,等SpringBoard重启完,你会看到类似下图的界面: 

把手机连接到电脑上,打开Xcode,在Organizer里的Console里能看到程序中使用NSLog打印的信息,用来调试很方便呢。 

总结

本文主要是讲Mobile Substrate的作用以及如何使用Theos开发一个简单的tweak。有了这些入门的基础之后,你就可以根据自己的想法来写自己喜欢的tweak。如果你是在iOS7下越狱的话,可以尝试一下把控制中心的AirDrop和音乐播放器给隐藏掉,让控制中心看起来更简洁。接着可以再进行改进,比如在蓝牙关闭的时候不显示AirDrop,开启的时候依然显示,音乐正在播放的时候显示音乐播放器,否则不显示。

这个小Demo是前两周写的,一直没有时间整理出来,今天抽时间整理了一下文字发了出来,算是送给自己新年的一件礼物吧!

Thanks,Have Fun!

More About Substrate And Theos

时间: 2024-11-10 06:25:03

使用Theos做一个简单的Mobile Substrate Tweak的相关文章

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

[3] 用D3.js做一个简单的图表吧!

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为可缩放矢量图形(Scalable Vector Graphics),SVG 使用 XML 格式定义图像,不清楚什么是SVG的朋友请先在 w3cschools 学习下

用EF DataBase First做一个简单的MVC3报名页面

使用EF DataBase First做一个简单的MVC3报名网站 ORM(Object Relational Mapping)是面向对象语言中的一种数据访问技术,在ASP.NET中,可以通过ADO.NET Entity Framework技术来简化数据访问.在EF里,有Code First,Model First和DataBase First三种方法来实现. 百度百科关于ORM的介绍: http://baike.baidu.com/view/197951.htm?fr=aladdin 1.就像

【Python】 做一个简单的 http 服务器

# coding=utf-8 ''' Created on 2014年6月15日 @author: Yang ''' import socket import datetime # 初始化socket s = socket.socket() # 获取主机名, 也可以使用localhost # host = socket.gethostname() host = "localhost" # 默认的http协议端口号 port = 80 # 绑定服务器socket的ip和端口号 s.bin

Jmeter初步使用二--使用jmeter做一个简单的性能测试

经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍并使用. 首先,打开Jmeter工具,并建立一个测试计划(测试脚本).启动jmeter后,jmeter会自动生成一个空的测试计划,我们可以基于该测试计划建立自己的测试计划. 步骤: 步骤一:添加线程组 一个性能测试请求负载是基于一个线程组完成的.一个测试计划必须有一个线程组.测试计划添加线程组非常简

使用React并做一个简单的to-do-list

1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其visual-dom的这种技术创新,也算是早就有了初步了解.一来没有学的太深入,二来后来在工作中和业余项目中都没有用到,因此慢慢的就更加生疏了. 近期,因为我想把自己的开源项目wangEditor能放在React.angular和vuejs中使用.先从react开始,顺手自己也重试一下React的基础知识,顺便再做一个小d

【 D3.js 入门系列 — 3 】 做一个简单的图表!

图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 . SVG ,即可缩放矢量图形(Scalable Vector Graphics),使用 XML 格式定义图形,可在 W3School 学习 SVG 的相关语法,不需要记住所有标签,用的时候再查即可. 先看下面的代码: <script src="http://d3js.org/d3.v3.mi

【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看[demo],扫描后点击屏幕有惊喜哦… 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单的引擎里需要有三种元素:世界(World).发射器(Launcher).粒子(Grain).总得来说就是:发射器存在于世界之中,

初学者如何做一个简单的计算器,代码分享

先新建一个类 startCalculator 声明如下 #import <Foundation/Foundation.h> @interface StartCalculator : NSObject //声明两个要计算的变量 @property float opValue1; @property float opValue2; //声明一个运算符 @property char op; //普通方法 //- (float) gzyWorkAdd; // //- (float) gzyWorkSu