05-Theos

在前面的例子中,利用Cycript可以对某个App进行调试,但是其效果只是临时的,因为一旦杀掉App进程,就会重新恢复成原样。那么如何在修改完APP后,能永久性的保持效果呢?

接下来就需要利用到Theos,Theos是一系列工具的合集,可以通过Theos创建tweak项目,Hook目标App的一些方法,然后对tweak项目进行编译、打包,生成deb插件(其实就是一个动态库文件),安装到iPhone上,其原理接下来会说到

安装签名工具ldid

ldid是一个命令行签名工具,可以用于导出的签名文件、对文件进行重签名等操作

  • 首先安装homebrew(类似于iOS中的CocoaPods)
  $ /usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 利用brew安装ldid
brew install ldid

修改环境变量

  • 编辑用户的配置文件
vim ~/.bash_profile
  • .bash_profie 文件后面加入两行
# THEOS 代表着路径 ~/theos
export THEOS=~/theos
# 让~/theos/bin目录的配置文件在全局都可以生效, $PATH 代表其他的一些全局配置文件
export PATH=$THEOS/bin:$PATH
  • .bash_profie 配置的环境变量立即生效
source ~/.bash_profile

配置好环境变量,可以打印查看
在这里插入图片描述

下载Theos

  • 建议将代码下载到$THEOS目录(也就是~/theos目录)
git clone --recursive https://github.com/theos/theos.git $THEOS

创建tweak项目

  • cd到一个存放tweak项目代码的地方(例如桌面),创建项目
cd ~/Desktop
# 开始创建项目
nic.pl
  • 选择 iphone/tweak项目
    在这里插入图片描述

编写Tweak项目

执行完前面步骤后,会在桌面生成一个tweaktest文件夹,里面有四个文件
在这里插入图片描述

编写Makefile文件

在前面加入环境变量,也就是通过什么IP和端口连接手机(因为iPhone和Mac通过USB绑定,直接输入Mac的本地IP和绑定端口即可)

export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=2222

include $(THEOS)/makefiles/common.mk
TWEAK_NAME = ting_tweak
ting_tweak_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
    install.exec "killall -9 SpringBoard"

如果不希望每个项目的Makefile文件都需要去编写以上环境变量,可以直接添加到用户配置文件(.bash_profile)中即可,$ source ~/.bash_profile 让配置文件生效

$ vim ~/.bash_profile
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=2222

$ source ~/.bash_profile

编写代码

打开Tweak.xm文件,输入需要修改的代码,例如hook某个方法:

#import <UIKit/UIKit.h>
%hook ViewController
// 对ViewController的声明,可识别self关键字
@interface ViewController
// 编译时可识别[self view]代码
- (id)view;
@end

- (void)touchesBegan:(id)touches withEvent:(id)event
{
	UIView *v = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 100, 100)];
 	v.backgroundColor = [UIColor greenColor];
   	[[self view] addSubview:v];
}

%end

编译、打包、安装

执行以下命令之前,先保证让Mac和iPhone进行端口绑定

  • 编译,执行 $ make
    在这里插入图片描述
  • 打包,执行 $ make package
    在这里插入图片描述
  • 安装, 执行 $ make install
    在这里插入图片描述

make package时可能会出现如下错误:

错误1
package name has characters that aren't lowercase alphanums or '-+.'
  • 是因为项目名,bundleID有大写的,需要改成小写的
错误2
open2: exec of lzma -c1 failed at /Users/wushiguang/theos/bin/dm.pl line 116
  • 打包压缩方式问题,将deb.mk 文件第6行改成 _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
vim $THEOS/makefiles/package/deb.mk
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
错误3
Error: You do not have an SDK in
/Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/S
DKs
  • 多个Xcode问题,需要指定Xcode路径
sudo xcode-select --switch
/Applications/Xcode.app/Contents/Developer/
错误4
make
> Making all for tweak xxx...
make[2]: Nothing to be done for `internal-library-compile'.
  • 之前编译过,有缓存导致的,clean一下即可
make clean

Logos常用语法

Logos的语法可以在这里看到,下面只介绍一些常用的语法

  • %hook、%end ,hook一个类的开始和结束
  • %log,打印方法调用详情,可以通过Xcode -> Window -> Devices and Simulators 查看日志
  • HBDebugLog,跟NSLog类似
  • %new,添加一个新的方法(区别于hook的方法)
  • %c(className) ,生成一个Class对象,例如%c(NSObject),类似于NSStringFromClass()、objc_getClass
  • %orig,调用函数原来的代码逻辑
  • %ctor,在加载动态库(也就是所编写的代码)的时候调用
  • %dtor,在App退出时调用
  • logify.pl,可以将某个需要Hook类的头文件所有方法打上log,并保存生成一个xm文件,方便函数调用追踪
# test为目标头文件,xx为生成的xm文件
logify.pl test.h > xx.xm

logify.pl生成的xm文件 ,很多时候编译不能通过,需要一些处理
1、删掉_weak
2、删掉inout
3、删掉协议,或者声明一下协议信息@protocol xxxDelegate
4、删掉- (void).cxx_destruct { %log; %orig; }
5、删掉HBLogDebug(@" = 0x%x", (unsigned int)r);
6、替换类名为Void,比如将 XXPerson * 替换为 void *,或者声明一下类信息@class XXPerson

Tweak项目的图片管理和多文件开发

图片资源的管理

如果有额外的资源文件,例如图片等,就新建一个layout文件夹(该文件夹对应着手机的根目录),然后依次创建以下目录 /Library/PreferenceLoader/preferences/ 或/Library/Caches 文件夹,Wechat就是所需要逆向的项目文件夹,Wechat下面就是放着资源文件,在编写代码时引用这些资源文件,需要带上全路径

  • 路径1

在这里插入图片描述

  • 路径2
    在这里插入图片描述
    仔细观察会发现路径1的preferences目录下,有着reveal的图片资源,说明该路径下的资源文件是偏整个系统的,所以更推荐放在路径2目录下
多文件开发

在tweak项目开发中,有可能会有多个文件,例如增加 Dog.hDog.m,下面分几种情况介绍

情况1

在这里插入图片描述
这个时候如果直接执行make指令,就会报Dog类找不到的错误信息,所以需要指定Dog的路径,打开Makefile文件,tweaktest_FILES就表示需要参与编译的文件,在Tweak.x后加上空格,然后写上Dog.m,就表示Tweak.x和Dog.m参与编译

tweaktest_FILES = Tweak.x Dog.m
情况2

创建一个src文件夹管理
在这里插入图片描述
这种情况前面加上对应文件夹即可,但是后面的Dog.m改成了通配符*.m,意思src目录下的.m文件都参与编译

tweaktest_FILES = src/Tweak.x src/*.m
情况3

在这里插入图片描述

移除插件

如果不再逆向某App,在iPhone目录~/Library/MobileSubstrate/DynamicLibraries/下找到我们的deb插件生成的.dylib和.plist文件,删除这两个文件,然后重启SpringBoard即可删除插件
在这里插入图片描述
还有一种办法就是在Cydia中找到该插件,然后卸载,这种方式更干净一点,推荐使用
在这里插入图片描述

Tweak的实现原理过程

  • $ make,编译Tweak代码为动态库(*.dylib)
    在这里插入图片描述
  • $ make package,将dylib打包为deb文件
  • $ make install,将deb文件传送到手机上,通过Cydia安装deb
  • 插件将会安装在 /Library/MobileSubstrate/DynamicLibraries 文件夹中
    • *.dylib:编译后的Tweak代码
    • *.plist:存放着需要hook的AppID
  • 当打开App时,Cydia Substrate(Cydia已自动安装的插件)会让App去加载对应的dylib,修改App内存中的代码逻辑,去执行dylib中的函数代码
  • theos的tweak并不会对App原来的可执行文件进行修改,只是修改了内存中的代码逻辑

Tweak的一些疑问点

  • 未脱壳的App也是支持tweak的,因为tweak是在内存中实现,没有修改App的可执行文件
  • tweak的效果是否永久性取决于App代码是否被修改过
  • 未越狱的手机不支持tweak
  • 可以对Swift/C函数进行tweak,但是方式跟OC不一样
  • 也可以对游戏进行tweak,但是由于游戏大多是通过C++/C#编写,而且类名、函数名会进行混淆
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[23-05-29 20:39:13.243] {main} <proxy-cache> requires Resin Professional. Please see http://www.caucho.com for Resin Professional information and licensing. [23-05-29 20:39:13.400] {main} [23-05-29 20:39:13.400] {main} Resin-4.0.58 (built Fri, 24 Aug 2018 01:23:14 PDT) [23-05-29 20:39:13.401] {main} [23-05-29 20:39:13.402] {main} Windows 10 10.0 amd64 [23-05-29 20:39:13.402] {main} Java(TM) SE Runtime Environment 1.8.0_191-b12, GBK, zh [23-05-29 20:39:13.402] {main} Java HotSpot(TM) 64-Bit Server VM 25.191-b12, 64, mixed mode, Oracle Corporation [23-05-29 20:39:13.402] {main} [23-05-29 20:39:13.403] {main} user.name = WR182 [23-05-29 20:39:13.541] {main} [23-05-29 20:39:13.546] {main} server listening to 127.0.0.1:6800 [23-05-29 20:39:13.549] {main} [23-05-29 20:39:13.766] {main} Table[mnode:2,D:\WEAVER\Resin\resin-data\app-0\distcache\mnode.db] validating indexes due to unclean shutdown. [23-05-29 20:39:13.816] {main} Table[data:3,D:\WEAVER\Resin\resin-data\app-0\distcache\data.db] validating indexes due to unclean shutdown. [23-05-29 20:39:13.942] {main} [23-05-29 20:39:13.943] {main} resin.home = D:\WEAVER\Resin [23-05-29 20:39:13.943] {main} resin.root = D:\WEAVER\Resin [23-05-29 20:39:13.943] {main} resin.conf = d:\WEAVER\Resin\conf\resin.xml [23-05-29 20:39:13.943] {main} [23-05-29 20:39:13.943] {main} server = 127.0.0.1:6800 (app:app-0) [23-05-29 20:39:13.943] {main} stage = production [23-05-29 20:41:38.003] {main} Found library 'resin_os' as 'd:\WEAVER\Resin\win64\resin_os.dll', but the load failed. The JVM exception was: java.lang.UnsatisfiedLinkError: no resin_os in java.library.path [23-05-29 20:42:40.782] {resin-60} WebApp[production/webapp/default/lib] active [23-05-29 20:42:40.782] {main} Host[production/host/default] active [23-05-29 20:42:40.782] {main} ServletService[id=app-0,cluster=app] active [23-05-29 20:42:40.782] {main} [23-05-29 20:42:40.782] {main} http listening to *:8080 [23-05-29 20:42:40.782] {main} https listening to *:8444 [23-05-29 20:42:40.796] {main} [23-05-29 20:42:40.796] {main} Resin[id=app-0] started in 210426ms Connected to server [23-05-29 20:43:29.233] {resin-55} WebApp[production/webapp/default/ROOT] active
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值