Tweak实例
作者:黑炭BC
链接:http://www.jianshu.com/p/799bb3b0b12c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这次hook的是自己写的一个APP
1. APP信息
- bundle identifier: com.heitan.button-test
功能比较简单,如gif所示:
[图片上传中...(image-4da689-1511766876826-14)]
add每次加一,minus每次减一
HOOK后变成每次加减五
2. Tweak使用
-
新建一个目录project(具有权限),在此目录下输入
/opt/theos/bin/nic/pl,启动Theos。[图片上传中...(image-8056be-1511766876824-12)]
可以看到有多个模板可以使用,这里选择 11 (iphone/tweak)
-
之后输入工程信息
-
project Name(repquired) //工程名字
-
Package Name [com.yourcompany.firsttweak]
-
Author/Maintainer Name
-
[iphone/tweak] MobileSubstrate Bundle filter //输入bundle identifier
-
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]
//要hook的应用名字,然后会自动重启,这里没有指定,手动重启[图片上传中...(image-bed50f-1511766876822-7)]
-
3. Tweak工程文件
-
在工程目录下,可以看到新建的各个文件
[图片上传中...(image-f0f5e2-1511766876824-11)]
-
Makefile
Makefile文件指定工程用到的文件、框架、库等信息,将整个过程自动化。本工程的默认Makefile文件如图所示
[图片上传中...(image-890146-1511766876821-6)]
-
include theos/makefiles/common.mk
固定写法,不要更改 -
TWEAK_NAME = FirstTweak
工程名字,自动生成,不要更改 -
FirstTweak_FILES = Tweak.xm
这个根据你建立的工程对应不同的名字
具体为:
Application -> application.xm
Tweak -> tweak.xm
Tool -> tool.xm
仅仅靠默认的那几个设置显然是不够的,还有一些设置如下
-
ARCHS = armv7 arm64
指定处理器架构。表示兼容不同的处理器架构,用空格隔开 -
TARGET = iphone:Base SDK:Deployment Target
如 TARGET = iphone:8.1:8.0,表示采用8.1的SDK,发布对象为iOS 8.0及以上版本
可将”Base SDK“改为”lastest“,指定以Xcode附带最新版本SDK编译 -
TweakName_FRAMEWORKS = framework name TweakName_PRIVATE_FRAMEWORKS = private framework name
导入framework,以及导入private framework
FirstTweak_FRAMEWORKS = UIKit FirstTweak_PRIVATE_FRAMEWORKS = AppSupport ChatKit IMCore
-
TweakName_LDFLAGS = -lx
链接Mach-O对象,大致意思是说, -lx代表链接libx.a或libx.dylib,即给“x”加上“lib”的前缀,以及“.a”或“.dylib”的后缀;如果x是“y.o”的形式,则直接链接y.o,不加任何前缀或后缀。iOS支持链接的Mach-O对象全是以“libx.dylib”和“y.o”形式命名的,完全兼容GNU Linker。其他具体可以参考详细说明最后修改的Makefile文件为:
[图片上传中...(image-bf5787-1511766876817-0)]
-
-
plist文件
这个文件的作用大致为 确定hook的作用范围,如图这个plist文件表示只作用于这个APP。
[图片上传中...(image-2d5819-1511766876821-5)]
[图片上传中...(image-39d096-1511766876821-4)]
其中 Bundles 字段下的数组指定了若干个 bundle identifier 作为 tweak 的作用对象。默认是 springboard
除了使用 Bundle 指定,也支持使用另外两种指定方式:-
Class: 对列表中指定的类起作用
-
Executables: 对指定的可执行文件名起作用
这三种配置方式可以同时指定,但是这里有个小问题。在同时指定的时候,一个文件只有满足每种 Filter 中的 array 里的至少一个条件,tweak 才能生效。如果想要满足任意一种 Filter 下的任意一个条件就能生效的话,就必须添加一个键值对:Mode: Any
-
-
control文件
control 文件记录了 deb 包管理系统所需要的基本信息,会被打包到最后生成的 deb 包中.
[图片上传中...(image-5d8c0f-1511766876820-3)]
-
Tweak.xm文件
最后是Tweak开发最重要的部分(看名字也知道重要)
用 Theos 创建 tweak 工程, 认生成的源文件是 Tweak.xm。如果后缀名是单独一个“ x”,说明源文件支持 Logos 和 C 语法。如果后缀名是“ xm ”,说明源文件支持 Logos 和 C/C++ 语法,与“ m ”和“ mm ”的区别类似。
logos语法部分可参考:其他blog 官方文档
原来APP的代码:[图片上传中...(image-cac8ac-1511766876820-2)]
Tweak.xm代码
%hook ViewController //hook add - (void)addButtonPressed:(id)sender { for(int i = 0;i < 5;i++) %orig; //clickCount += 4; //%orig; } %end %hook ViewController //hook minus - (void)minusButtonPressed:(id)sender { for(int i = 0;i < 5;i++) %orig; } %end
-
3. 编译 + 打包 + 安装
-
编译
Theos采用 make 命令来编译Theos工程。在工程目录下运行make命令[图片上传中...(image-532891-1511766876824-10)]
-
打包
采用 make package 命令 ,可能出现这个问题[图片上传中...(image-8431dd-1511766876824-9)]
参考这个帖子
定位到原因应该是dpkg的版本过高。因为我是用brew安装的dpkg,直接安装最新的,版本过高,需要通过降级处理,把dpkg版本固定到1.18.10。为了防止更新的时候又把dpkg自动更新了,所以要将版本锁定到这个。具体操作如下:
方法一(我没成功):brew remove dpkg wget -c https://homebrew.bintray.com/bottles/dpkg-1.18.10.el_capitan.bottle.tar.gz tar xpvf dpkg-1.18.10.el_capitan.bottle.tar.gz mv dpkg/1.18.10/ /usr/local/Cellar/dpkg/ brew switch dpkg 1.18.10 brew link dpkg brew pin dpkg 1.18.10
方法二(自己测试可用):
brew remove dpkg HOMEBREW_NO_AUTO_UPDATE=1 brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb brew pin dpkg
若想重新编译,打包,可以使用make clean,清理make, make package生成的文件
-
安装
-
方法一: 通过WiFi连接手机,将deb移动到iOS中(需要在iOS中配置openssl)
scp filePath root@iphoneIP:iphonePath
然后通过iFile找到deb文件,点击install安装。 -
方法二:
在Makefile的最上一行加入 THEOS_DEVICE_IP = iOSIP[图片上传中...(image-3f080d-1511766876819-1)]
然后调用make package install(编译,打包,安装一起)
成功后如下:[图片上传中...(image-c00ccf-1511766876823-8)]
-
4. 最终效果
[图片上传中...(image-bf8cbc-1511766876825-13)]
以上为《iOS应用逆向工程 第二版》学习实践笔记