THEOS的第一个TWeak的成功创建

THEOS的第一个TWeak的成功创建

THEOS的第一个TWeak的成功创建

TWeak的成功创建也不是一件容易的事情.

参考资料:

成功的创建一个TWeak的弹出

步骤1:安装Xcode和Xcode command line

Xcode的安装直接去Apple官网上去下载就好了.command line的话,现在的Xcode(2015-09-20,都是Xcode7了,Xcode6开始已经集成了command line到Xcode中了).

网上的教程有的是使用的Xcode4,5,等低版本.

这里埋下了一个坑.

步骤2:安装theos

a:下载theos前,设置保存的路径:环境变量

theos保存到哪里?这个路径是需要设置为环境变量的

可以直接写到~/.bash_profile中(设置环境变量的一般方法)

 
 
export THEOS=/usr/local/iOSTools/theos

网上很多的人都安装到了/opt/theos路径下,不过这个路径随意了,看你一般的开发工具放在哪里,就写那里就好了.

设置好后可以echo $theos来查看设置的环境变量是否设置好了.

 
 
zx:iOSTools zx$ echo $THEOS
/usr/local/iOSTools/theo

b:下载theos

下载的方法很多

  • svn的方法有:
 
 
svn co http://svn.howett.net/svn/theos/trunk $THEOS
  • gitt途径(推荐,方便升级)
 
 
git clone git://github.com/DHowett/theos.git $ THEOS

当然了,也可以直接去git仓库里下载一份压缩的,将里面的内容解压到$THEOS

c:下载头文件

头文件下载下来后需要做一些更改.

  • clone 头文件仓库
  • 将头文件放到theos/include/目录下
  • 复制系统的IOSurfaceAPI.h到**theos/include/IOSurface**目录下
  • 注释掉IOSurfaceCreateXPCObject 和IOSurfaceLookupFromXPCObject.
# clone iphoneheaders.git
git clone git://github.com/rpetrich/iphoneheaders.git 
mv iphoneheaders/*  theos/include/
cp /System/Library/Frameworks/IOSurface.framework/Headers/IOSurfaceAPI.h theos/include/IOSurface

如果没有拷贝和注释这两个步骤,最后会导致打包失败.

d:下载ldid签名工具

  • 下载ldid可执行文件
  • 放到theos/bin/目录下
 
 
# get ldid for Mac OS X
cd ~/theos/bin
curl -O http://dl.dropbox.com/u/3157793/ldid
chmod a+x ldid

这里的文件是在dropbox上,需要什么你的懂的.

所以,这里也提供一个百度盘上下载地址:

 
 
http://pan.baidu.com/s/1kTHoIGZ

注:我把这个工具下载下来放到了http://pan.baidu.com/s/1kTHoIGZ,也可以从这里下载,然后给它添加执行权限(chmod +x ldid)并移动到$THEOS/bin/这个目录下。(from http://security.ios-wiki.com/issue-3-6/)

PS.当然了,你可以直接从源码编译安装,下面是源码仓库

 
 
https://github.com/rpetrich/ldid

e:配置MoblieSubstrate环境

方法一:

# get libsubstrate.dylib substrate.h
cd ~/theos
curl -OL http://apt.saurik.com/debs/mobilesubstrate_0.9.3366-1_iphoneos-arm.deb
dpkg-deb -x mobilesubstrate_0.9.3366-1_iphoneos-arm.deb mobilesubstrate
cp mobilesubstrate/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate  ~/theos/lib/libsubstrate.dylib
cp mobilesubstrate/Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h include/substrate.h

(from http://www.tuicool.com/articles/Bf2UFb)

方法二:

  • 从越狱后设备拷贝出来一份
  • 重名名为: theos/lib/libsustrate.dylib

将iOS上的“/Library/Frameworks/CydiaSubstrate.framework/ CydiaSubstrate”拷贝到OSX中,将其重命名为libsubstrate.dylib后放到“/opt/theos/lib/libsubstrate. dylib”中

(from http://book.51cto.com/art/201504/472934.htm)

方法三:

  • 百度盘里下载:http://pan.baidu.com/s/1o6ocwXk(from http://security.ios-wiki.com/issue-3-6/)

f:安装dpkg

方法一:

  • 通过mac port安装.

mac port也就是一个软件包管理工具,像weget,apt-install,brew等工具类似.

首先我尝试安装的是https://www.macports.org/install.php下的https://distfiles.macports.org/MacPorts/MacPorts-2.3.3-10.10-Yosemite.pkg

但是安装卡顿,失败.

然后,尝试源码编译安装,

MacPorts-2.3.3.tar.bz2

  1. “cd” into the directory where you downloaded the package and run “tar xjvf MacPorts-2.3.3.tar.bz2” or “tar xzvf MacPorts-2.3.3.tar.gz”, depending on whether you downloaded the bz2 tarball or the gz one, respectively.

  2. Build and install the recently unpacked sources:

    • cd MacPorts-2.3.3
    • ./configure && make && sudo make install

    Optionally:

    • cd ../
    • rm -rf MacPorts-2.3.3*

    (from https://www.macports.org/install.php)

但是

sudo port selfupdate
sudo port install dpkg

这里 时候,我的时候,根本不动了,毛网速没有啊....

方法二:

  • 通过brew来安装

brew的作者最近不是去了apple了吗?哈哈,以前配置号brew后,来下载就方便多了.

 
 
brew install dpkg

不到1分钟就可以下载好了. 真是给方法一给跪了.

步骤3:开始编写Teak应用

a 创建工程

选一个目录,存放工程.

 
 
zx:theosCode zx$ pwd
/Users/zx/documents/theosCode
zx:theosCode zx$ $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): zxtest
Package Name [com.yourcompany.zxtest]: com.z2xy.zxtext(可选项,按enter,[]中的作为默认值)
Author/Maintainer Name [zx]: zx(按enter,[]中的作为默认值)
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.apple.springboard(按enter,[]中的作为默认值)
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: SpringBoard(按enter,[]中的作为默认值)
Instantiating iphone/tweak in zxtest/...
Done.

生成后的文件列表如下:

 
x
 
zx:zxtest zx$ pwd
/Users/zx/documents/theosCode/zxtest
zx:zxtest zx$ tree
.
├── Makefile
├── Tweak.xm
├── control
├── theos -> /usr/local/iOSTools/theos/
└── zxtest.plist
1 directory, 4 files

其中:

  • Makefiile文件用于自动化编译
  • Tweak.xm类似于我们 业务函数,main函数
  • control是一些工程信息
  • zxtest.plist也是项目的一些工程信息
  • 还有一个符号链接指向我们的$THEOS的安装目录(最开始配置的环境变量)

b.更改Tweak.xm文件

 
x
 
#import <SpringBoard/SpringBoard.h>
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application {
%orig;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"__z2xy__" 
message:@"from zxdev" 
delegate:nil 
cancelButtonTitle:@"取消" otherButtonTitles:@"好的",nil];
[alert show];
[alert release];
}
%end

上面引入了一个头文件,然后替换了**applicationDidFinishLaunching方法的实现.

一些语法 %hook,%orig,%end,倒是很像django的模板语法.

这里不详细讲,见上的参考资料.

c.编写makfile

 
xxxxxxxxxx
 
ARCHS = armv7
THEOS_DEVICE_IP = 192.168.0.120 //(可选)
zxtest_FRAMEWORKS = UIKit
include theos/makefiles/common.mk
TWEAK_NAME = zxtest
zxtest_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
    install.exec "killall -9 SpringBoard"

主要是添加了头三行.

  • 第一行,指定了系统架构
  • 第二行,指定了同一局域网下的iOS设备的ip地址(需要根据自己的实际情况更换)

查看iOS设备的ip地址的话,直接到手机的设置,wifi,连接 wifi下查看就可以了.

如果需要自动安装的话,可以去掉这行

  • 第三行,导入UIKit头文件

如果不导入文件编译出错,找不到符号,因为我们使用了UIKit中的UIAlertView.

d: 编译,安装,运行

方法一:

需要指定iOS设备ip地址,需要设置好信任的证书.

 
 
zx:zxtest zx$ make package install
Making all for tweak zxtest...
make[2]: Nothing to be done for `internal-library-compile'.
Making stage for tweak zxtest...
dpkg-deb: building package `com.z2xy.zxtext' in `./com.z2xy.zxtext_0.0.1-1_iphoneos-arm.deb'.
install.exec "cat > /tmp/_theos_install.deb; dpkg -i /tmp/_theos_install.deb && rm /tmp/_theos_install.deb" < "./com.z2xy.zxtext_0.0.1-1_iphoneos-arm.deb"
Selecting previously deselected package com.z2xy.zxtext.
(Reading database ... 4989 files and directories currently installed.)
Unpacking com.z2xy.zxtext (from /tmp/_theos_install.deb) ...
Setting up com.z2xy.zxtext (0.0.1-1) ...
install.exec "killall -9 SpringBoard"

方法二:

  • 编译
 
 
zx:zxtest zx$ make
Making all for tweak zxtest...
 Preprocessing Tweak.xm...
 Compiling Tweak.xm...
 Linking tweak zxtest...
 Stripping zxtest...
 Signing zxtest...
  • 打包
 
 
zx:zxtest zx$ make package
Making all for tweak zxtest...
make[2]: Nothing to be done for `internal-library-compile'.
Making stage for tweak zxtest...
dpkg-deb: building package `com.z2xy.zxtext' in `./com.z2xy.zxtext_0.0.1-2_iphoneos-arm.deb'.
  • 上传到设备安装
 
x
 
zx:zxtest zx$ scp com.z2xy.zxtext_0.0.1-2_iphoneos-arm.deb  root@192.168.0.120:/var/root/
com.z2xy.zxtext_0.0.1-2_iphoneos-arm.deb                                                                     100% 2270     2.2KB/s   00:00 

当然了,可以使用各种工具将此deb文件上传到设备中,上面使用的是scp.

第一个参数是本地文件路径,第二参数目的路径

root@192.168.0.120指定了同一局域下的iOS设备,/var/root/指定的设备中的路径,中间有一个冒号连接.

  • 在设备上使用iFile到/var/root/目录下找到安装包安装

如果上面的步骤错误的话,

ununderstood data nember data.tar.xz

参考: http://stackoverflow.com/questions/21013325/dpkg-error-contains-ununderstood-data-member,打包的时候,压缩的方式和iOS设备上解压缩的方式不一致导致的错误.

方式是,替换$THEOS/makefiles/package/deb.mk文件中

 $(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r dpkg-deb -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)" $(STDERR_NULL_REDIRECT)$(ECHO_END)

为:

$(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r dpkg-deb -Zgzip -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)" $(STDERR_NULL_REDIRECT)$(ECHO_END)

  • 重启设备,看到弹窗

可以看到第一中方法简便了不少,只需要指定iP地址和完成证书配置就可以一行命令搞定.

步骤4: 证书设置(不用多次输入密码)

  • 删除iOS设备对应的ip地址所在行

~/.ssh/known_hosts

 
xxxxxxxxxx
 
 192.168.0.120 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvTS9W8/88Z+9j2D/TBft/ns173ssWhBGQgMyBnSAzIdhmfVd830aq2/78MgKyadyGxD6xhF/LG9tP5ZshaeZB9    XjBjQnEtB0gTZjiyGJpBWFdXCLX/uxV35gwZnu11Ts/HQzdC4+n+eh9pqKR7vsaJP/gIiYqfz/oDchlHrf7bdicZ0yKFlOpilTP4WLgPz2Qqr96xGcn/3dwimFTuye5zAqqfUApjTS/    idKvJNOEsFo6lVkuyOmkbItTjp6MfQliNorOY8nvV0DRFx2+lmedRjtq6UNPTyjuLPx3ymZIg/uOazvB0CHs/Ta2kMZRe1bPl8VcHI5/AbL0i7VHQB1p
  • mac上生成证书
 
 
$ssh-keygen -t rsa

如果已经生成过整数,直接得到~/.ssh/id_ras.pub 公钥就可以了.

  • iOS设置生成.ssh目录

ssh登录到iOS设备,生成证书就可以了

 
xxxxxxxxxx
 
$ssh root@192.168.0.120
zxde-iPhone:~ root# ssh-keygen
zxde-iPhone:~ root# ls -la
drwx------  2 root wheel    170 Sep 20 22:34 .ssh/
  • 用mac上的公钥,替换掉iOS设备上的公钥
 
 
scp ~/.ssh/id_rsa.pub root@192.168.0.120:/var/root/.ssh/

通过上面 的证书配置和iOS设备配置,

只需要方法一的一行

$make package install	

就可以实现,编译,打包,上传到设备,安装deb包,运行.

总结一些坑

  1. 下载头文件的时候,需要做一些替换,git仓库克隆后都有里面居然有这个步骤的注释!!!!(否则的话,打包就会出现找不到头文件,知道不到符号之类的错误)
  2. ldid签名工具下载,直接去下载就好了,不要从源码编译了.
  3. 配置MoblieSubstrate环境的话,直接从iOS设备上拷贝出来就可以了.
  4. makefile中指定iOS设备的IP地址,省了不少时间,同时,导入头文件,也是解决了找不到文件的错误.
  5. 打包文件的解压缩不一致导致的错误,

ununderstood data nember data.tar.xz

参考http://stackoverflow.com/questions/21013325/dpkg-error-contains-ununderstood-data-member就好了.

其实,有些问题在http://www.iphonedevwiki.net/index.php/Theos/Getting_Started 中已经给出了很好的回答

.9 Undefined symbols

9.10 Incompatible package compression

只是最开始没有看.

最后,"步骤4: 证书设置(不用多次输入密码)”,使用后,方便了很多.

最后的最后,这里还有一些列相关的资料:

undefined
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值