1、tweak的开发过程
1.1、make
执行make方法后,tweak项目中会出现一个隐藏文件夹.theos,同时将编写的代码编译成动态库:/.theos/obj/debug/tweak_wechat.dylib
1.2、make package
执行make package后会将并plist文件tweak_wechat.plist和动态库文件tweak_wechat.dylib打包生成一个deb文件:/packages/com.xl.wechat_0.0.1-1+debug_iphoneos-arm.deb
1.3、make install
执行make install 后,theos会远程登录到手机,将deb包传送给手机,Cydia会把deb包里压缩的动态库和plist文件存储到/Library/MobileSubstrate/DynamicLibraries/路径下
2、tweak的运行过程
2.1、Cydia Substrate
DynamicLibraries文件夹是由Cydia Substrate来管理的,当微信启动时,Cydia Substrate就会去遍历DynamicLibraries文件夹中的plist,查看是否有和微信BundleId相同的plist文件,如果有,就把plist对应的动态库文件加载到微信中,改变微信内存中的一些代码调用逻辑。所以tweak插件本质上是修改了App内存中的代码,而不是修改了App的可执行文件。
2.2、验证
2.2.1、卸载插件
删除/Library/MobileSubstrate/DynamicLibraries/路径下动态库和plist文件,再次启动App插件就会失效。
2.2.2、查看Mach-O文件
导出iPhone中的App可执行文件,通过Mach-OView查看已经加载的动态库,不会有tweak生成的动态库。
2.2.3、汇编验证
新建一个iOS项目运行到手机,再编写tweak插件hook项目中的方法,在方法调用时加上断点,可以发现安装插件前方法调用是直接调用,安装插件后是调用的tweak生成的动态库中的方法。
3、QA
1、未脱壳的APP是否支持tweak?
答:支持,因为tweak是在内存中实现的。
2、tweak效果是否是永久的?
答:取决于tweak中用到的App代码是否被修改过。
3、如果一旦更新App,tweak会不会失效?
答:同上。
4、未越狱的手机是否支持tweak?
答:不支持,未越狱的手机不能安装Cydia。
5、能不能对Swift/C函数进行tweak
答:可以
6、能不能对游戏项目进行tweak?
答:可以,但是游戏一般是C++编写的,而且游戏的方法名一般都是经过混淆后的。