上一篇文章: "心旷神怡:Theos 逆向之美"
在上一篇文章中,我们了解了如何配置tweak项目。首先,我们对Theos进行了配置,然后简要地创建了一个tweak工程。
在本篇文章中,我们将详细介绍tweak工程,包括Logos语法的使用。
1.Tweak工程
通过上一篇文章的创建过程,我们已经掌握了如何创建tweak工程。
现在,让我们再次创建一个新项目,命名为"tututest"。结合之前提到的demo,我们将通过hook实现一个简单的tweak工程。
-
1.
我们通过终端输入nic.pl
2.
Choose a Template (required):10
3.
Project Name (required):tututest
4.
Package Name [com.yourcompany.tututest]:包名:com.first.tututest
5.
Author/Maintainer Name [lk]:作者 tutu
6.
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:回车默认,稍后再plist文件中修改即可
7.
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:回车默认
8.
我已准备就绪,你是否已完成创建呢?
让我们打开看看我们新创建的项目吧。
- 我们看下目录结构
1.
Makefile
2.
Tweak.x
3.
control
4.
tututest.plisit
Makefile
MakeFile 文件
: 指定工程用到的文件,框架,库等信息,将整个过程自动化.
INSTALL_TARGET_PROCESSES = SpringBoard
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = tututest
tututest_FILES = Tweak.x
include $(THEOS_MAKE_PATH)/tweak.mk
这是tweak创建完成后,Makefile自动生成的框架,库等信息格式
1.INSTALL_TARGET_PROCESSES = SpringBoard
目标安装的项目
2.include $(THEOS)/makefiles/common.mk
固定写法,不要更改
3.TWEAK_NAME = tututest
tweak的名称
4.tututest_FILES = Tweak.x
tweak源文件,多个文件以空格分隔
5.include $(THEOS_MAKE_PATH)/tweak.mk
通过include命令指定不同的.mk文件
除了上面的信息格式,我们还可以添加一下信息
我们如何通过进行指定SDK?
TARGET = iPhone:latest:8.0
添加到Makefile我们如何导入framework?
tutu_ FRAMEWORKS = UIKit
添加到Makefile我们如何指定处理器架构
ARCHS = armv7 arm64
添加到Makefile我么如何链接Mach-O对象
tutu_LDFLAGS = -lx
注意
-lx 代表链接libx.a或libx.dylib,即给x加上lib的前缀,以及.a或.dylib的后缀,可以根据自己的项目进行调整
Tweak.x
我们生成Tweak.x项目,之前记得是xm项目,一般默认的是Tweak.xm
xm
中的x代表这个文件支持Logos语法,
x
如果后缀名是单独的x,说明源文件支持Logos和C语法;
xm
如果后缀名是xm,说明源文件支持Logos和C/C++语法.
tututest.plist
iOS正向开发者,对于plist文件是很熟悉了.
这里的plist文件,用于指定需要注入的目标文件的Bundle ID .
control
指定deb包的一些信息,包括名字,描述,版本号等
2.编写Tweak工程
- 我开始做一些准备
我用前几篇文章使用的TEST demo为例,很简单的demo
ViewController
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)UIButton *revealBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view addSubview:self.revealBtn];
}
-(UIButton*)revealBtn{
if (!_revealBtn) {
_revealBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_revealBtn.frame = CGRectMake(100,100, 100,40);
_revealBtn.backgroundColor = [UIColor redColor];
[_revealBtn setTitle:@"测试" forState:UIControlStateNormal];
[_revealBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_revealBtn addTarget:self action:@selector(revealClick) forControlEvents:UIControlEventTouchUpInside];
}
return _revealBtn;
}
-(void)revealClick{
NSLog(@"hello");
}
@end
我们找到Mach-o文件,通过class-dump导出类头文件
以上操作,可以看几篇文章,在这里就不再介绍了.我们看一下ViewController的头文件
#import "UIViewController.h"
@class UIButton;
@interface ViewController : UIViewController
{
UIButton *_revealBtn;
}
- (void).cxx_destruct;
@property(retain, nonatomic) UIButton *revealBtn; // @synthesize revealBtn=_revealBtn;
- (void)viewDidLoad;
-(void)revealClick;
@end
- 以上步骤完成后,我们打开tutu.plist文件,通过指定plist文件,对应用修改
- 我们在来编写Tweak.x文件
%hook ViewController
-(void)revealClick{
%orig;
NSLog(@"tweak first one");
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"我的第一个tweak工程创建成功了" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消",nil];
[alertView show];
}
%end
我们通过hook ViewController中的revealBtn按钮的点击方法revealClick,
%orig
执行被勾住(hook)的函数的原始代码
我们在加一个输出 tweak first one
在点击的时候,我们再加一个提示
- 我们编辑Makefile文件
INSTALL_TARGET_PROCESSES = SpringBoard
export THEOS_DEVICE_IP = localhost
export THEOS_DEVICE_PORT = 2222
ARCHS = armv7 arm64
TARGET = iPhone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = tututest
tututest_FILES = Tweak.x
tututest_FRAMEWORKS = UIKit
tututest_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk
我们添加几条信息
export THEOS_DEVICE_IP = localhost
export THEOS_DEVICE_PORT = 2222
tututest_FRAMWORKS = UIKit
-
这些都配置好了,我们进行编译
我们这里已经编译成功
- 我们接着安装deb 包
deb已经安装成功
- 我们看下Cydia,看下我们是否安装成功了.
我们在Cydia中确认了tututest已经成功安装。
接下来,我们打开原TEST项目,并进行点击操作。
为了查看应用程序的日志输出,我们安装了libimobiledevice。这里不再详细介绍如何安装,你可以自行搜索相关资料。
现在,让我们先查看一下日志打印的信息。
当然,为了进一步测试,让我们点击一下测试按钮,看看会发生什么。
点击按钮后,我们输出了"我的第一个tweak工程创建成功了",然后我们看到了tweak的第一个输出信息,即我们添加的AlertView。
至此,我们的第一个tweak项目已经完成了。
总结
这段代码演示了tweak项目的结构以及如何编写一个hook来修改我们想要的内容。
在下一篇文章中,我们将介绍Logos语法的使用,它是编写tweak时常用的语法。