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

免越狱插件制作

免越狱插件

检查依赖项

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

脱壳

https://github.com/stefanesser/dumpdecrypted  dumpdecrypted
由于 AppStore App 对沙盒以外的绝大多数目录没有写权限,所以我们需要
将 dumpdecrypted.dylib 拷贝到沙盒文档Document目录下
查看程序目录
ps -e | grep /var/mobile
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/*/WeChat.app/WeChat
ldid -S dumpdecrypted.dylib

自定义签名Dylib

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

errSecInternalComponent 错误
在Mac终端上运行codesign命令,并“始终允许” /usr/bin/codesign访问密钥
security unlock-keychain login.keychain
解锁命令移至,~/.bash_profile以便在SSH客户端启动时对钥匙串进行解锁
获取证书
security find-identity -v -p codesigning 
签名Dylib codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 hook.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

zsign-master

xresign_1_0_3

macOS:

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

CentOS7:

yum install openssl-devel
g++ *.cpp common/*.cpp -lcrypto -O3 -o zsign

用法

我已经在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显示帮助。
  1. 显示mach-o和代码签名段信息。
./zsign demo.app/execute
  1. 使用私钥和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
  1. 将dylib注入ipa并重新签名。
./zsign -k dev.p12 -p 123 -m dev.prov -o output.ipa -l demo.dylib demo.ipa
  1. 更改捆绑ID和捆绑名称
./zsign -k dev.p12 -p 123 -m dev.prov -o output.ipa -b ' com.tree.new.bee ' -n ' TreeNewBee ' demo.ipa
  1. 将dylib(LC_LOAD_DYLIB)注入到mach-o文件中。
./zsign -l  @ executable_path / demo.dylib  demo.app/execute
  1. 将dylib(LC_LOAD_WEAK_DYLIB)注入到mach-o文件中。
./zsign -w -l  @ executable_path / demo.dylib  demo.app/execute

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
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

 打包

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

工具打包下载



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

评论 抢沙发

提交评论

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