tweak加载资源
开发自己的deb插件需要加载自己的资源,比如图片资源。iOS中常用的两种加载图片资源的方式:
+ (nullable UIImage *)imageNamed:(NSString *)name; // load from main bundle - (nullable instancetype)initWithContentsOfFile:(NSString *)path;
+imageNamed:方式从程序的main bundle加载图片,由于我们自己单独开发的插架,资源是需要单独管理的。我们需要使用第二种方式,给定图片的路径去加载图片。
那么图片的存放的路径应该存放在手机的那个目录下呢?
当前手机安装了reveal插件,可以看出reveal的插架资源存放在/Library/PreferenceLoader/Preferences/目录下,我们也可以将我们开发的插件需要加载的资源文件存放在此目录
现在知道了图片资源的存放路径,是否有办法在将开发的插件安装打包安装到手机时图片资源也一起打包到手机中呢?这个答案是肯定的。
在tweak项目中,可以创建名称为layout文件夹,将所有图片等资源文件存放在这里。在打包安装插架到手机中时,layout中的资源会打包到手机的根目录下。也就是说layout就对应手机的根目录/
上面说到我们的资源想存放在手机的/Library/PreferenceLoader/Preferences/目录下,可以直接在layout目录新建这种文件结构
我们可在工程中定义文件资源路径的宏 加载图片时直接写文件名就可以
// 定义图片资源路径 #define CHFile(path) @"/Library/PreferenceLoader/Preferences/" #path
// 加载skull的图片
cell.imageView.image = [UIImage imageWithContentsOfFile:CHFile(skull.png)];
tweak打包脚本
tweak打包命名
make clean
make
make pakcage
make install
对于每次都需要执行上面的脚本,因此我们可以编译写shell脚本文件 ~/tweak.sh
make clean && make package && make install
tip:make package就会先执行make命令,因此在shell脚本文件可以省略
上面打包的出来的安装包默认是debug版本,在手机 Cydia中查看安装的版本是debug
在打包执行
tweak原理
tweak工程目录结构
默认nic.pl生成的tweak工程目录结构如下(layout我自己添加存放资源的目录):
control是tweak工程的描述信息,比如包名、作者、架构、版本。其中Package必须是小写字母 否则打包报错。
Makefile对工程的编译信息描述。执行make命令时编译tweak_wechat_FILES变量指定的源文件,多个文件使用空格隔开
Tweak.x是编译hookd代码的,Logos文件扩展名根据编译的开发语言而不相同
xxx.plist文件就描述了逆向程序的Bundle id
tweak安装过程
执行make命令主要对Makefile中描述的所有参加编译的源文件进行编译,生成xxx.dylib动态库
执行make package命令是将工程xxx.plst文件和make阶段生成的xxx.dylib动态库打包成一个xxx.deb文件(deb就是越狱的插件)
make install 连接远程主机(THEOS_DEVICE_IP THEOS_DEVICE_PORT) 将deb插件安装到远程手机的/Library/MobileSubstrate/DynamicLibraries目录下
tweak运行过程
开发的deb插件是由Cydia Substrate管理,这个插件是越狱手机安装Cydia就安装的
Cydia Substrate程序监听/Library/PreferenceLoader/Preferences/下xxx.plist的Bundle Id的应用的运行,一旦监听到被包含Bundle Id程序运行,Cydia Substrate会加载插件,将插架中的hook方法动态注入到内存中的程序中,本质修改源程序的汇编指令。