多米诺骨牌源
最快捷的苹果资讯

免越狱插件制作

免越狱插件

检查依赖项

如果设备没有越狱,是没有mobilesubstrate等环境的,而且一些系统目录是没有读写权限的,这时我么只能从目标app的二进制文件入手,通过手动修改load commands来加载自己的dylib,那么上面我们的插件又是使用theos基于mobilesubstrate编译的,有没有办法确定我们的dylib有没有依赖其他的库呢?

使用osx自带的otool工具即可,可以看出,我们的lib是依赖于substrate库的,其他的都是系统库,所以我们从越狱设备中把cydiasubstrate文件copy出来重命名为libsunstrate.dylib,和我们的dylib一起放入wechat.app目录中

最后使用install_name_tool命令修改动态库的路径把它指向app二进制文件的同级目录

简述

当我们通过theos,为越狱机器写了一些hook代码,然后通关make package install命令,成功安装到手机之后,发现代码的功能已经和我们的需求吻合,那么,下面要做的就是如何把生成的.dylib文件注入到二进制文件中,然后成功安装到非越狱的手机设备中.下文中,ioswechatselectall.dylib就是我通过代码生成的文件.

更改环境

这是十分重要的一步,如果没有执行这一步,直接通过insert_dylib工具注入,然后安装到非越狱手机上就会出现应用闪退的情况.(因为tweak会默认依赖越狱环境,在这里浪费了太多的时间)

找到你生成的.dylib文件

在你的tweak目录下,应该会找到你通过make package install或者make package指令生成的.dylib文件,

/代码目录/obj/ioswechatselectall.dylib

通过 otool -L命令查看你生成的.dylib文件

otool -L ioswechatselectall.dylib

1643663-058bd380b94d43d0

如图所示,这里有对CydiaSubstrate的依赖 , 这是不行的 , 这个是theos在越狱机上特有的, 在非越狱机上需要更改此依赖

修改依赖

首先要找到libsubstrate.dylib文件,该文件应该在/opt/thoes/lib/目录下,然后将其拷贝到与你生成的的.dylib一个目录下,通过下面的指令修改依赖,

install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib ioswechatselectall.dylib

然后重新查看ioswechatselectall.dylib
会发现依赖已经被修改完毕

1643663-204b8c09bd8f5505

2 重新签名ioswechatselectall.dylib 和libsubstrate.dylib(很重要)

3 添加可执行文件的依赖

此处用的是insert_dylib
下载地址在https://github.com/Tyilo/insert_dylib
编译后,将其与其他两个文件拷贝到同一目录下

然后将其插入到执行文件中

4.其他

1.将ioswechatselectall.dylib 和libsubstrate.dylib拷贝进你的WeChat.app 
2.记住要把WeChat_patched的名字改回来WeChat

制作安装包

解决了依赖问题,然后要把我们的库注入到二进制weixin的二进制文件,这一步使用开源的insert_dylib即可 (@executable_path是一个环境变量,指的是二进制文件所在的路径)

insert_dylib命令格式: ./insert_dylib 动态库路径 目标二进制文件

//注入动态库
./insert_dylib @executable_path/ioswechatselectall.dylib WeChat 
./yololib  Wechat wxhbts.dylib
//打包成ipa 
xcrun -sdk iphoneos PackageApplication -v WeChat.app -o `pwd`/WeChat.ipa

注入工具optool

编译安装 optool 工具

因为 optool 添加了 submodule,因为需要使用 --recuresive 选项,将子模块全部 clone 下来
git clone --recursive https://github.com/alexzielenski/optool.git
cd optool
xcodebuild -project optool.xcodeproj -configuration Release ARCHS="i386 x86_64" build

使用 optool 把 xxx.dylib 注入到二进制文件中

./optool install -c load -p "@executable_path/xxx.dylib" -t WeChat

自定义签名Dylib

查看所有可用于签名的证书

security find-identity -v -p codesigning
签名Dylib
codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 hook.dylib 
整个App签名 
codesign -fs "授权证书" --no-strict --entitlements=生成的plist文件 WeChat.app
验证Dylib签名
codesign –verify hook.dylib
codesign -vv -d WeChat.app

Xcode升级到8.3后 用命令进行打包 提示下面这个错误

xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH

后面根据对比发现新版的Xcode少了这个PackageApplication
先去找个旧版的Xcode里面copy一份过来
放到下面这个目录:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

然后执行命令

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication

theos的一些额外配置、解决版本号不对的错误

错误记录:

Reason: Incompatible library version: xxxx.dylib requires version 1.0.0 or later, but oooo.dylib provides version 0.0.0

经过一下午研究,得到如下配置(不要在意研究过程,多次阅读mk源代码的结果)

ARCHS = armv7 armv7s arm64
TARGET = iphone:8.4:7.0
#指定路径,否则默认在 /Library/MobileSubstrate/DynamicLibraries
LOCAL_INSTALL_PATH = /usr/bin
include theos/makefiles/common.mk
TWEAK_NAME = oooo
oooo_FILES = oooo.xm
#指定版本
_THEOS_TARGET_LDFLAGS += -current_version 1.0
_THEOS_TARGET_LDFLAGS += -compatibility_version 1.0
#tweak2.mk是我修改过的,去掉了CydiaSubstrate链接,因为这个dylib用不到
include $(THEOS_MAKE_PATH)/tweak2.mk
-current_version、-compatibility_version参数参考自苹果官方!!
https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/CreatingDynamicLibraries.html

使用新版Theos编译不越狱可用的dylib

添加这两行在Makefile里Tweak_Name=XXXX那行的下面

SUBSTRATE ?= yes
instance_USE_SUBSTRATE = $(SUBSTRATE)
把上面的instance替换成你的TweakName
在上面的这个例子中就是XXXX 
include _USE_SUBSTRATE = no,请转换为使用include _LOGOS_DEFAULT_GENERATOR = internal
编译:make SUBSTRATE=no
编译DEB:make SUBSTRATE=no package
编译DEB并安装:make SUBSTRATE=no package  install

如果在make成功之后还想make 发现报了Nothing to be done for ‘internal-library-compile’错误

那就把你刚才创建出来的obj删掉和packages删掉 , 然后显示隐藏文件, 
你就会发现和obj同一个目录有一个.theos , 把.theos里面的东西删掉就好了
显示隐藏文件命令:Command+Shift+. 可以显示隐藏文件

DEB打包

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
echo .DS_Store >> ~/.gitignore
xcode-select --install 
sudo xcodebuild -license    手动输入 agree
安装 Macports ,网址:http://www.macports.org/install.php
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
sudo port -f install dpkg
postinst写法(直接复制)(权限755)
#!/bin/bash
mkdir -p /private/var/mobile/Documents/
chown -R mobile:mobile /private/var/mobile/Documents/
/bin/su -c uicache mobile
cd Desktop
sudo chmod -R 755 *
dpkg-deb -Z gzip -b ./{标识符} 
dpkg-deb -Z xz -b ./{标识符}
mac 解包 打包
dpkg-deb -x ./abc.deb ./tmp
dpkg-deb -e ./abc.deb ./tmp/DEBIAN
dpkg-deb -b ./tmp false8.deb
解包
dpkg-deb -x ./a.deb ./a 
dpkg-deb -e ./a.deb ./a/DEBIAN
打包
find . -name '*.DS_Store' -type f -delete 
dpkg-deb -b a/ /Users/tashigefengzi/Desktop/github/repo/debs/

 打包

用iResign工具或者iOS App Signer修改bundle id 并且重签整个应用,并打包生成.ipa文件,就可以成功安装在非越狱的手机设备中

工具打包下载



未经允许不得转载:多米诺骨牌 » 免越狱插件制作
分享到:

评论 抢沙发

提交评论

  •   昵称 (必填)
  • 邮箱 (必填)
  • 网址 (选填)