在创建一个逆向工程项目时,如何让工程使用起来更加便捷和易于扩展,以及编译器识别,能够大大提升我们日常的开发效率以及代码的质量。本文主要描述了,如果使用Theos的tweak工程,创建一个可以被Xcode编译器识别的项目工程,以及工程中常用的配置。
搭建逆向环境
https://www.onezen.cc/2017/09/16/iosrevert/revdevconfig.html
搭建好环境之后,创建对应的tweak工程项目
创建Xcode项目
根据前面创建好的tweak项目名称,创建一个Xcode静态库项目,然后将tweak和创建的Xcode项目混合到一起
在Xcode项目里面创建一个Config文件夹(New Group Without Folder),将Makefile、对应的plist文件、control配置文件,不要copy放到此目录下。 然后在Xcode里面,创建对应的文件夹,然后将生成的.xm
文件的后缀名,全部替换为.xmi
,并且放到项目的最外层,作为唯一的入口类
设置Tweak.xmi在Xcode编译器识别类型为Objective-C++
设置XcodeTheos头文件,让编译器识别logos语法,对应的头文件的地址:https://github.com/onezens/Xcode-Theos,导入项目之后,创建一个全局头文件,并且到该头文件放到tweak.xmi
里面,发现里面的代码是黑色的,没有被编译器识别,这时候,关闭项目重新打开后发现会被Xcode重新识别了
接着设置XcodeTheos
的宏,让Xcode识别logos宏
一起设置好之后,开始写logos的hook代码,一切正常的话,你会发现Xcode写起logos代码超级顺畅,并且编译Xcode提示成功
将Xcode的配置和Makefile进行同步
首先修改Makefile的编译文件
在以后创建对应的logos语法的文件时,始终命名为xmi文件,并且写入Makefile里面
1 | WeChatBot_FILES = Tweak.xm |
在项目中头文件引用路径问题,导致编译失败
1 | ➜ WeChatBot git:(master) ✗ make |
发现是头文件,引入的原因,Makefile里面设置头文件目录
1 | #头文件 |
如果使用最新版的theos,我们会发现编译.xmi
文件会包下面的错误
1 | ➜ WeChatBot git:(master) ✗ make |
解决办法:
- 将所有的
.xmi
更改为.xi
文件, 并且导入头文件#include <substrate.h>
- 使用老版本的theos:
https://github.com/onezens/theos.git
替换原版进行编译
解决编译警告,导致报错的问题
1 | ➜ WeChatBot git:(master) ✗ make |
解决办法:
- 将Makefile里面的版本号降低:
TARGET = iphone:11.2:7.0
- Makefile里面设置忽略方法过期警告:
1 | #忽略OC警告 |
项目中动态和静态库的配置
系统库
1 | #导入系统的frameworks |
配置第三库
1 | #导入第三方Frameworks, 动态库需特殊处理 |
对应的本地文件夹说明
include 放置所有的.a和.dylib库的头文件
dynamic 放置所有的动态库的文件夹,动态库放一起,方便脚本处理
static 防止所有的静态库的文件夹
动态库问题
当我们把,动态库加入的项目中,我们发现运行我们的tweak插件,在宿主APP中不起作用,通过log提示信息为:
1 | Apr 9 15:55:28 wz5 WeChat[5329] <Error>: MS:Error: dlopen(/Library/MobileSubstrate/DynamicLibraries/WeChatBot.dylib, 9): Library not loaded: @rpath/WCBFWDynamic.framework/WCBFWDynamic |
该日志信息中可以看出,宿主在自己的bundle里面,没有加载到我们的动态库,所以导致我们整个插件的功能不生效
查看生成的动态库:
1 | ➜ WeChatBot git:(master) ✗ otool -L .theos/_/Library/MobileSubstrate/DynamicLibraries/WeChatBot.dylib |
我们发现tweak项目的动态库,依赖都是rpath,是宿主的bundle路径,所以我们要更改这个路径
解决办法,通过脚本,更改动态库依赖路径:
1 | TWEAK_NAME=WeChatBot |
在每次package之前,运行此脚本,打包完成后查看信息:
1 | ➜ WeChatBot git:(master) ✗ otool -L .theos/_/Library/MobileSubstrate/DynamicLibraries/WeChatBot.dylib |
常用的编译命令配置
简化常用命令,提高日常开发效率
1 | before-package:: |
常用的脚本说明
postinst 脚本是每次deb包安装之前执行的脚本
postrm 脚本是每次deb包安装完成后执行的脚本
注意:打包前需要修改这两个的执行权限
1 | chmod 755 .theos/_/DEBIAN/postinst |
相关的脚本描述:http://iphonedevwiki.net/index.php/Packaging
应用场景:在Cydia中安装插件,并且显示返回按钮
postrm脚本 & 删除control的depend依赖:
1 | #!/bin/bash |
参数说明:
1 | Acceptable parameters for finish |
资源文件的导入
通过项目根目录中的layout目录,映射文件到手机设备当中,然后读取资源文件
1 | #define kWCBImgSrcPath @"/Library/AppSupport/WeChatBot/imgs" |
其他配置说明
Makefile
1 | #用于编译的SDK和支持的ios最低版本 |
control
1 | Package: cc.onezen.wechatbot #包名 |