iOS安全:Tweak开发环境及入门

Tweak原指微调以增强电子系统功能的实用工具;在iOS中,Tweak是广泛使用的越狱插件开发工具,通过创建dylib注入到宿主进程,完成各种HOOK操作。阅读本文将快速入门Tweak开发。

Tweak开发环境

Theos

Theos是一个越狱开发工具包,用来创建Tweak项目。

export THEOS=/opt/theos
git clone https://github.com/theos/theos.git $THEOS
cd /opt/theos
git submodule update --init --recursive

ldid

ldid是签名工具,运行在越狱手机上用于取代XCode自带的codesign。下载之后放在/opt/theos/bin目录,并赋予可行性权限:

sudo chmod 777 /opt/theos/bin/ldid

OpenSSH

在越狱iPhone Cydia中搜索OpenSSH安装,安装完成即可通过ssh登录到iPhone。

/*
保持mac和iPhone链接同一个WiFi。iOS上用户有两个:root和mobile。密码默认是:alpine。
*/
ssh mobile@iphone's IP

CydiaSubstrate

CydiaSubstrate是HOOK框架,为进程注入指定了标准接口,是Tweak项目的依赖库。

在越狱iPhone上通过OpenSSH拷贝CydiaSubstrate.framework中的两个库文件到/opt/theos/lib/,并重命名。

sudo scp mobile@(iphone's IP):/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate* /opt/theos/lib/
sudo mv CydiaSubstrate libsubstrate.dylib

dpkg-deb

deb是越狱开发安装包的标准格式,dpkg-deb是用于制作deb安装包的工具。下载dm.pl,重命名为dpkg-deb,放到/opt/theos/bin/目录下,赋予其可执行权限:

Tweak项目入门

新建Tweak项目

环境准备好之后,新建一个工作目录,创建一个Tweak项目:

/opt/theos/bin/nic.pl

选择iphone/tweak序号,依此输入工程名称、包名、作者名称等信息即可创建完成。默认会创建四个文件:

  • control

包含工程名称、包名、作者名称、版本号依赖等。

  • Makefile

编译脚本文件。

  • Tweak.x

采用Logos语法的Tweak源代码文件,类似于C/C++源代码。通过Makefile中的[Project Name]_FILES指定参与编译的源文件。有两种格式的后缀:x和xm:x代表源文件支持Logos和C语法;xm代表源文件支持Logos和C/C++语法。

  • [Project Name]Test.plist
{ Filter = { Bundles = ( "com.apple.springboard", "com.easeapi.app" ); }; }

指定该Tweak项目将注入那些APP。

exec of lzma -c1 failed:

open2: exec of lzma -c1 failed: No such file or directory at /opt/theos/bin/dm.pl line 116.
make: *** [internal-package] Error 2

vim $THEOS/makefiles/package/deb.mk
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= lzma
//修改为:
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip

Makefile解释

include $(THEOS_MAKE_PATH)/tweak.mk

Theos工程有Application、Tweak和Tool三种类型,对应的.mk文件分别是application.mk、tweak.mk和tool.mk。

ARCHS = armv7 arm64

指定处理器架构。

TARGET := iphone:clang:latest:7.0

指定SDK版本。

[Project Name]_FRAMEWORKS = UIKit CoreTelephony

导入公开的framework。[Project Name]请替换成项目名称。

[Project Name]_PRIVATE_FRAMEWORKS = ChatKit IMCore

导入私有framework。如果导入的是自己的framework等,需要把framework放在/opt/theos/vendor/lib目录,头文件放在/opt/theos/vendor/include或当前工程根目录都可以。

[Project Name]_FILES = One.cpp Tweak.x

指定参与编译的文件。

[Project Name]_LDFLAGS = -lz –lsqlite3.0

配置链接库。

编译命令

make

编译。

make package

编译打包,实际上是先执行make,再执行dpkg-deb。make package之后会生成.thos/_目录,就是deb的格式。

make package install

在Makefile最前面添加:

THEOS_DEVICE_IP = "iOS IP"
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0

执行make package install就可以将动态库安装到iOS越狱iOS设备上,目录为:

/Library/MobileSubstrate/DynamicLibraries

Logos语法

%hook

指定需要HOOK的class,必须以%end结尾。

%log

在%hook和%end内使用,打印log。

%orig

在%hook和%end内使用,执行被hook的函数的原始代码。

%ctor

类似C/C++的constructor函数,完成初始化工作。

%new

在%hook和%end内使用,给class添加函数。

其它文章

iOS安全:iOS APP注入动态库重打包(非越狱)
iOS安全:使用dumpdecrypted/Clutch 砸壳
iOS安全:修改Mach-O
iOS安全:LC_LOAD_DYLIB和LC_ID_DYLIB