免越狱插件

检查依赖项

如果设备没有越狱,是没有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文件,

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

otool -L ioswechatselectall.dylib
查看CPU框架
lipo -archs ioswechatselectall.dylib

修改依赖

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

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

install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @executable_path/libsubstrate.dylib xx.dylib

制作安装包

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

//注入动态库
./insert_dylib @executable_path/ioswechatselectall.dylib WeChat 
如果--weak指定了该选项,insert_dylib将插入一个LC_LOAD_WEAK_DYLIB加载命令而不是LC_LOAD_DYLIB。
./insert_dylib --weak @executable_path/ioswechatselectall.dylib WeChat 
./insert_dylib /Library/MobileSubstrate/DynamicLibraries/xx.dylib xx.dylib
./yololib  Wechat wxhbts.dylib
//打包成ipa 
xcrun -sdk iphoneos PackageApplication -v WeChat.app -o `pwd`/WeChat.ipa

自定义签名Dylib

errSecInternalComponent 错误
在Mac终端上运行codesign命令,并“始终允许” /usr/bin/codesign访问密钥
security unlock-keychain login.keychain
解锁命令移至,~/.bash_profile以便在SSH客户端启动时对钥匙串进行解锁
AppleWWDRCAG3 不收信任证书
获取证书
security find-identity -v -p codesigning 
签名Dylib 
codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 hook.dylib 
验证签名
codesign -vv -d hook.dylib
ldid -S dumpdecrypted.dylib
正确的签名
codesign -f -s - --timestamp=none --all-architectures xx.dylib
1.安装 Xcode 
2.安装 Command Line Tools 
xcode-select --install 
codesign --force --deep --sign - /xxx/xxx.app 
签名错误 resource fork, Finder information, or similar detritus not allowed 
解决方法 xattr -lr <path_to_app_bundle> 
查看 xattr -cr <path_to_app_bundle> 删除 
或者 find . -type f -name '*.jpeg' -exec xattr -c {} \; find . -type f -name '*.png' -exec xattr -c {} \; 
find . -type f -name '*.tif' -exec xattr -c {} \; 
整个App签名 codesign -fs "授权证书" --no-strict --entitlements=生成的plist文件 WeChat.app 
验证Dylib签名 codesign –verify hook.dylib codesign -vv -d WeChat.app

签名App

brew install openssl
g++ *.cpp common/*.cpp -lcrypto -I/usr/local/Cellar/openssl/1.0.2t/include -L/usr/local/Cellar/openssl/1.0.2t/lib -O3 -o zsign
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 
https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/
换源
https://developer.apple.com/download/more/
sudo xcode-select --switch /Applications/Xcode.app
brew install p7zip
brew install zip
brew install unzip

用法

我已经在macOS和Linux上进行了测试,但是您还需要安装unzipzip 命令。

用法:zsign [-选项] [-k privkey.pem] [-m dev.prov] [-o output.ipa]文件| 文件夹
 
选项:
-k,--pkey私钥或p12文件的路径。(PEM或DER格式)
-m,--prov移动配置文件的路径。
-c,--cert证书文件的路径。(PEM或DER格式)
-d,--debug生成调试输出文件。(.zsign_debug文件夹)
-f,--force在对文件夹进行签名时强制执行不带缓存的签名。
-o,--output输出ipa文件的路径。
-p,--password密码为私钥或P12文件。
-b,--bundleid要更改的新捆绑包ID。
-n,--bundlename要更改的新捆绑包名称。
-e,--entitlements更改的新权利。
-z,--ziplevel输出ipa文件时的压缩级别。(0-9)
-l,--dylib注入dylib文件的路径。
-w,--weak将dylib注入为LC_LOAD_WEAK_DYLIB。
-i,--install使用ideviceinstaller 命令 安装ipa文件进行测试。
-q,--quiet安静的操作。
-v,--version显示版本。
-h,--help显示帮助。

使用私钥和mobileprovisioning文件对ipa进行签名。

./zsign -k privkey.pem -m dev.prov -o output.ipa -z 9 demo.ipa
  1. 使用p12和mobileprovisioning文件对文件夹签名(使用缓存)。
./zsign -k dev.p12 -p 123 -m dev.prov -o output.ipa /Payload/demo.app
  1. 使用p12和mobileprovisioning文件签名文件夹(不带缓存)。
./zsign -f -k dev.p12 -p 123 -m dev.prov -o output.ipa /Payload/demo.app

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

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

后面根据对比发现新版的Xcode少了这个PackageApplicationPackageApplication
先去找个旧版的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
dpkg 降级
brew remove dpkg  
HOMEBREW_NO_AUTO_UPDATE=1 brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
brew pin dpkg 
$ brew remove dpkg  
# remove latest dpkg 
$ brew install --force-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb  
# install dpkg as a bottle from the old commit 
$ brew pin dpkg  
# block homebrew from updating dpkg till you `brew unpin 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
解包.sh
#!/bin/sh
dpkg-deb -x ./a.deb ./a
dpkg-deb -e ./a.deb ./a/DEBIAN
chmod -R 755 ./a/DEBIAN
打包.sh
#!/bin/sh
find . -name '*.DS_Store' -type f -delete
dpkg-deb -Z lzma -b ./a b.deb
Last modification:February 16, 2024
如果觉得我的文章对你有用,请随意赞赏