http://www.cnblogs.com/mengshu-lbq/archive/2013/01/28/2879866.html XCODE使用,或者下面这种方法使用。
1.Theos越狱开发工具包。(IOSOpenDev 整合在Xcode里面的)安装Theos安装--(github去下载Theos)
1>.https://github.com/DHowett/ 去下载。存放到opt/theos下
2>配置ldid (ldid专门来签名IOS可执行文件的工具) http://joedj.net/ldid 自 动下载 把它放 在/opt/theos/bin/ 赋予权限 sudo chmod 777 /opt/theos/bin/ldid
3>.配置CydiaSubstrate
1)首先运行Theos自动化配置脚本,sudo /opt/theos/bin/bootstrap.sh substrate
2)出现一个BUG 解决办法Cydia中下载CydiaSubstrate 下载MAC连接手机然后通过用iFunBox等方式将IOS上“Library/FrameWorks/CydiaSubstrate.framework/CydiaSubstrate”拷贝OSX中将其命名为libsubstrate.dylib 放到“/opt/theos/lib/libsubstrate.dylib”
4>.配置dpkg-deb deb是越狱开发安装包的标准格式,dpkg-deb用于操作deb的工具有了这个工具Theos才能把工程打包deb文件。
https://github.com/DHowett/dm.pl/ 下载dm.pl将它命名为dpkg-deb放 到/opt/theos/bin/目录下面。然后执行命令赋予可执行的权限。
sudo chmod 777 /opt/theos/bin/dpkg-deb
5>.使用Theos用法介绍
2.创建工程启动NIC
/opt/theos/bin/nic.pl -----> 启动 下面这句话必须写在你要创建的位置目录。
0.MobileSubstrate Bundle filter tweak作用对象的bundle identifer
3.最后重启应用,以进程名表示。
4.查看目录下 创建成功。
2》工程文件。
1.Makefile:文件制定工程用到的文件,框架,库等信息,将整个过程自动化,
1. /iOS_twproject_FILES =Tweak.xm 多个文件空格隔开
2./开发的一般是Application Tweak tool 程序 ,他们对应的.mk文件是Application.mk Tweak.mk tool.mk
#include $(THEOS_MAKE_PATH)/tweak.mk
3.如何制定SDK版本?怎么导入framework?lib文件在哪里链接呢?
(1)制定处理器架构:ARCHS=armv7 arm64
(2)制定SDK版本:TARGET = iPhone:Base SDK :Deployment Target iPhone:8.1:8.0 指定是8.1的SDK支持的版本是8.0以上。也可以改成
TARGET = iPhone:latest :8.0
(3)导入framework
1>iOSREProject_FRAMEWORKS = framework name
exmp->
iOSREProject_FRAMEWORKS = UIKit CoreTelephony CoreAudio
2> iOSREProject_PRIVATE_FRAMEWORKS =private framework name
iOSREProject_PRIVATE_FRAMEWORKS = AppSupport ChatKit IMCore
3>链接Mach-O对象(包括.dylib .a .o )
iOSREProject_LDFLAGS=-lx 比如链接libsqlite3.0.dylib libz.dylib和dylib1.0 iOSREProject_LDFLAGS=-lz -lsqlite3.0 -dylib1.0
2.Tweak.xm xm 和 x代表这个文件支持Logos语法 如果后缀名是单独一个x说明源文件支持Logos 和 C语法,如果后缀名是‘xm’说明源文件支持Logos 和C、c++语法 与m和mm的区别类似
3.Theos 的Logos语法:
(1.)初始化函数:%init %init([=, …]) %init(Group[, [+|-]=, …])初始化一个组,如果带参数初始化制定的group 如果没有参数表示初始化’_ungrouped’组.必须在%hook 或者%ctor 只有调用了%init对应的%group才能起作用。
(2.)代码块指令 这类指令定义HOOK代码块,必须以%end结束.
%hook class使用objc_getClass(Classname)获取要被HOOK的类,在%hook和%end之间编写代理函数,对于钩子的安装,Theos使用MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result)完成,这些对我们来说是透明的,我们不需要手动调用,Logos预处理器会自动生成这些代码.
%hook SBApplicationController
-(void)uninstallApplication:(SBApplication *)application {
NSLog(@”Hello World!”);
%orig; // 调用原始方法
return;
}
%end //结束标记
预处理后为:
//先获取类对象,对应%hook SBApplicationController
Class _logos_class$initGroup$SBApplicationController = objc_getClass(“SBApplicationController”);
//设置hook
MSHookMessageEx(
_logos_class$initGroup$SBApplicationController, //要hook的类
@selector(uninstallApplication), //要hook的函数
(IMP)&_logos_method$initGroup$SBApplicationController$uninstallApplication, //代理函数
(IMP*)&_logos_orig$initGroup$SBApplicationController$uninstallApplication); //存储原始函数
(3)%subclass
%subclass Classname: Superclass
为现有的类(Supercalss)添加子类,这个动作在运行时创建并填充.
theos使用objc_allocateClassPair()再调用objc_registerClassPair()完成子类的添加功能.
(4)%group分组便于代码管理及按条件初始化分组 必须以%end结尾,一个%group可以包含多个%hook所有不属于某个自定义group的%hook_ungrounped
%grounp IOS7Hook
%hook ios7Class
%end%end//ios7hook
%group Groupname
这是为hook块分组,,由于有些类在一些特殊条件下才会被初始化,一如果在Tweaks初始化时就去设置钩子,肯定是失败的,所以我们也可以在特定条件下init,比如hook一些不常驻内存的类,再或者在不同的IOS版本中hook不同的函数.有些简单的Tweaks并没有显式声明%group,其实Theos也提供了一个默认的组叫”ungrouped”,所有未被分组的hook都会被设置到这个组里,默认在%ctor函数里面调用.
(5)%new
%hook %new %end
%new(signature)
为类或子类添加一个新的方法函数.必须在%hook块或%subclass块使用.theos使用class_addMethod完成.
(6)%ctor
%ctor { … }
这是Theos提供的默认构造函数(默认优先级),当然我们可以编写自己的构造函数让Theos来调用,但是自定义的%ctor函数里面必须手动调用%init对%group自定义的组进行初始化.%ctor不需要以%end结尾。
(7)%end
表示一个钩子/子类/组作用块的结束
(8)%c
%c([+|-]Class)
动态获取一个类,如果用’+’标记,则获取类的对象,如果用’-’标记则获取实例对象,默认是’-’
%c在经过Logos预处理后变为_logos_static_class_lookup(classname),其实内部还是调用objc_getClass(classname)
(9)%orig
%orig(arg1,arg2,arg3) %orig函数执行原始代码如果去掉原始函数不被执行。还可以利用%orig 更改原始函数的参数。
调用被hook的原始函数,这个函数不能用在%new创建的函数中.
(10)%log
%log([(), …]) %log((NSString *)@"iosre",(NSString *)@"iosre");
打印函数的参数.
(11)Logos的文件扩展名
.x 由Logos处理,然后预处理并编译成object-c
.xm 由Logos处理,然后预处理并编译为objective-c++
.xi 先处理为objective-c,然后Logos处理返回结果最后被编译
.xmi 先处理为objective-c++
默认情况下,Logos的预处理器只在生成时处理.xm文件,不过,有时一个hook代码可能要用在多个文件里.首先把主文件名改为.xmi文件,其他的.xm文件可以使用#include命令,Logos在预处理之前会将这些文件添加到主文件中.
4.control文件记录了deb包管理系统所需的基本信息会被打包进deb
很多信息直接体现在Cydia中。
Package: zfl ----->描述这个deb包的名字采用的命名方式同bundle identifier类似均为反向DNS格式,可以按需更改。
Name: iOS_twProject--->描述工程的名字。
Depends: mobilesubstrate----->描述这个deb包的依赖,
Version: 0.0.1------》描述deb包的版本号
Architecture: iphoneos-arm-----设备架构
Description: An awesome MobileSubstrate tweak!--》简单介绍,
Maintainer: zhangfl----->维护人
Author: zhangfl=---->tweak的作者
Section: Tweaks----->程序的类别。
Installed-Size :104-=----》这里是估算安装大小。
5.还有一个文件是iOS_twProjeect.plist
这个plist文件的作用和APP里面的info.plist类似的,记录的是配置信息,描述tweak的作用范围,我们可以用plutil也可以用Xcode来编辑它,plist最外层是一个dictionary只有一个名为“Filter”的key
可以分为三类,Bundles classes Executables
5编译+打包+安装。
一>编译
1.”make“ 来编译Theos工程, 运行"make" ---->编译之后多了一个obj文件夹
(在obj文件里面有文件.dylib).dylib就是tweak的核心。
二>打包
1,打包使用“make package”命令 该命令来自于Theos本身,(其实就是限制性make 的命令 然后执行“dpkg-deb”)命令。
2.使用改命令之后会生成一个.deb文件,这个文件就是最终发布的安装包。
3.同时还会生成一个"_"文件夹这个文件里面包含两个文件夹,分别是“DEBIAN”和"Library"其实“DEBIAN”里面包含工程里面的control文件,
二>安装
1.把deb安装到ios中去,命令安装。
Makefile的最上一行加上本机IP地址,
THEOS_DEVICE_IP=iOSIP
然后调用“make package install”命令完成编译打包安装。需要输入两次密码。