应用重签名,就是把已经存在的ipa包,重新配置一套证书和描述文件,再签名生成一个新的ipa包
codesign重签名
Xcode提供了签名工具codesign,通过几个命令就可以完成重签名终端命令
查看钥匙串里可签名的证书
security find-identity -v -p codesigning强制替换签名
codesign -fs "证书串" 文件名给文件添加权限
chmod +x 可执行文件查看描述文件
security cms -D -i embedded.mobileprovision用权限文件签名
App包
codesign -fs "证书串" --no-strict --entitlements=权限文件.plist App包将输入文件压缩为输出文件
zip -ry 输出文件 输入文件案例1:
查看应用的签名信息
从某助手导出砸壳后的
wx7.0.8.ipa,将其解压
使用
codesign命令,查看应用的签名信息
codesign -vv -d WeChat.app-------------------------Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChatIdentifier=com.tencent.xinFormat=app bundle with Mach-O thin (arm64)CodeDirectory v=20400 size=972531 flags=0x0(none) hashes=30383+5 >location=embeddedSignature size=4864Authority=iPhone Distribution: Tencent Technology (Shenzhen) Company Limited (88L2Q4487U)Authority=Apple Worldwide Developer Relations Certification AuthorityAuthority=Apple Root CASigned Time=Oct 16, 2019 at 17:54:10Info.plist entries=68TeamIdentifier=88L2Q4487USealed Resources version=2 rules=10 files=1470Internal requirements count=1 size=212案例2:
查看钥匙串里可签名的证书
security find-identity -v -p codesigning-------------------------1) E972414310363E12F223F4AB36027459EB2XXXXX "iPhone Distribution: XXX1 (ZH6L374XXX)"2) 9671D2A6816E643601A25DE66FA1E7F64F9XXXXX "iPhone Developer: XXX2 (79DN9L6XXX)"3) DE19F59CD715AB8E727F492126BA8064E60XXXXX "iPhone Developer: XXX3 (XM33C3GXXX)"4) ABD73916998A2CC8FF65BAB19F5C127B66DXXXXX "iPhone Distribution: Beijing XXX XXX Information Technology Co., Ltd. (BD69S49XXX)"4 valid identities found案例3:
查找
MachO中的cryptid关键字
otool -l WeChat | grep cryptid -A 1 -B 5-------------------------Load command 12cmd LC_ENCRYPTION_INFO_64cmdsize 24cryptoff 16384cryptsize 101695488cryptid 0pad 0
cryptid为加密算法的id,cryptid为0表示当前可执行文件是未加密的,俗称:脱壳在
MachO中,最重要的就是代码段和数据段,而加密和签名仅针对代码段案例4:
在未越狱设备上,直接安装砸壳后的
wx7.0.8.ipa打开
Xcode,选择Window -> Devices and Simulators
点击
+,选择安装wx7.0.8.ipa
提示
Unable to install
未越狱设备,安装
App需要进行签名验证,直接安装提示Unable to install。要想成功安装到设备上,需要对其进行重签名
codesign重签名步骤:1、删除插件和带有插件的
.app包(比如Watch)2、对
Frameworks里面的库进行重签名3、给可执行文件
+x可执行权限4、新建工程,真机编译并运行,将描述文件安装到手机。将描述文件拷贝到
.app包中5、
info.plist文件中替换BundleID。BundleID要和描述文件中的ID保持一致6、通过授权文件(
Entitlements)重签.app包
- 查看描述文件
security cms -D -i embedded.mobileprovision
- 将描述文件中
Entitlements拷贝出来,生成plist文件。文件名称entitlements.plist- 用权限文件签名
App包
codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app7、最后通过
Xcode安装案例5:
使用
codesign对App重签名右键
.app文件,选择显示包内容,进入App目录
删除插件和带有插件的
.app包,删除PlugIns目录和Watch目录
对
Frameworks里面的库进行重签名
进入
Frameworks目录
cd Frameworks对
.framework文件依次重签名
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" andromeda.frameworkcodesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" mars.frameworkcodesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" marsbridgenetwork.frameworkcodesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" matrixreport.frameworkcodesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" OpenSSL.frameworkcodesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" ProtobufLite.framework-------------------------andromeda.framework: replacing existing signaturemars.framework: replacing existing signaturemarsbridgenetwork.framework: replacing existing signaturematrixreport.framework: replacing existing signatureOpenSSL.framework: replacing existing signatureProtobufLite.framework: replacing existing signature回到上级目录
cd ..对应用重签名,可执行文件必须有可执行权限
chmod +x WeChat添加描述文件。使用重签名的
账号新建工程
真机编译并
运行,将描述文件安装到手机
将描述文件拷贝到
.app包中
info.plist文件中替换BundleID。BundleID要和描述文件中的ID保持一致
在项目中创建授权文件(
Entitlements)
命名
entitlements.plist
查看描述文件,找到权限信息
security cms -D -i embedded.mobileprovision
将
<dict>...</dict>的内容,复制到entitlements.plist文件中
将项目中的
entitlements.plist文件,拷贝到.app文件的平级目录下
使用重签名的
账号和权限文件签名App包
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" --no-strict --entitlements=entitlements.plist WeChat.app-------------------------WeChat.app: replacing existing signature使用
codesign命令,查看应用的签名信息
codesign -vv -d WeChat.app-------------------------Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChatIdentifier=com.feng.drivingtrainFormat=app bundle with Mach-O thin (arm64)CodeDirectory v=20400 size=972537 flags=0x0(none) hashes=30383+5 location=embeddedSignature size=4793Authority=iPhone Developer: XXX2 (79DN9L6XXX)Authority=Apple Worldwide Developer Relations Certification AuthorityAuthority=Apple Root CASigned Time=Apr 21, 2021 at 13:38:17Info.plist entries=68TeamIdentifier=ZH6L37455TSealed Resources version=2 rules=10 files=1143Internal requirements count=1 size=184
- 确认签名已成功替换
将重签名后的
App安装到手机
案例6:
勾选
Automatically manage signing选项的差异当项目勾选
Automatically manage signing选项,查看描述文件中的权限信息
security cms -D -i embedded.mobileprovision
application-identifier:ZH6L37455T.*- 在
案例5中,未勾选Automatically manage signing,显示为ZH6L37455T.com.feng.drivingtrain继续后面的流程,将重签名后的
App安装到手机
- 问题出现了,覆盖安装,提示
Unable to install这种情况,需要先删除手机中的
App
再次安装,重签名后的
App可以顺利的安装到手机上
复制权限信息的步骤,一定要检查
application-identifier
ZH6L37455T.*:无法覆盖安装ZH6L37455T.com.feng.drivingtrain:可覆盖安装案例7:
Debug重签名App在手机上运行
App
选择
Debug -> Attach to Process,找到对应App
- 出现重复
App,选择进程号较大的使用
Debug View Hierarchy开始调试
Xcode重签名
Xcode重签名步骤:1、删除插件和带有插件的
.app包(比如Watch)2、对
Frameworks里面的库进行重签名3、给可执行文件
+x可执行权限4、
info.plist文件中替换BundleID。BundleID要和描述文件中的ID保持一致5、将
App包拷贝到Xcode工程目录中,剩下的交给Xcode案例1:
利用
Xcode重签名创建和重签名
App同名工程
真机编译并运行
删除插件和带有插件的
.app包,删除PlugIns目录和Watch目录对
Frameworks里面的库进行重签名给可执行文件
+x可执行权限
info.plist文件中替换BundleID将修改后的
App包,替换项目中的包
直接通过
Xcode运行项目即可
Shell脚本
Shell是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程的途径。Shell一般是指命令行工具。它允许你输入文本命令,然后解释命令,并在内核中执行。
Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。
.bashrc、.bash_profile和.zshrc作用与区别在使用命令行工具时,我们可能会遇到一些教程,可能需要你把一些配置写入到
.bashrc、.bash_profile或者.zshrc等。那么这几个文件到底有什么作用和区别?从文件名称判断
.bashrc、.bash_profile是给bash来使用的。而.zshrc是给zsh来使用的查看
bash版本:
bash-------------------------The default interactive shell is now zsh.To update your account to use zsh, please run `chsh -s /bin/zsh`.For more details, please visit https://support.apple.com/kb/HT208050.bash-3.2$查看
zhs的安装路径:
which zsh-------------------------/bin/zsh查看
bash的安装路径:
which bash-------------------------/bin/bash
zsh切换bash,重新打开终端即可
chsh -s /bin/bash
bash切换zsh,重新打开终端即可
chsh -s /bin/zsh配置建议
bash:
- 将配置选项放到
~/.bashrc中,然后在~/.bash_profile中通过source调用
zsh:
- 建议仍然将配置选项放到
~/.bashrc,~/.bash_profile中通过source调用,最后在~/.zshrc中source调用~/.bash_profile运行方式
$source x.sh:
- 在当前
Shell环境中读取并执行x.sh中的命令- 命令可以强行让一个脚本去立即影响当前的环境(一般用于加载配置文件)
- 命令会强制执行脚本中的全部命令,而忽略文件的权限
$bash x.sh、$zsh x.sh:
- 重新建立一个子
Shell,在子Shell中执行脚本里面的句子
$./x.sh:
- 读取并执行文件中的命令。但有一个前提,脚本文件需要有可执行权限
用户、组、权限
Unix和Linux都是多用户、多任务的系统,所以这样的系统里面就拥有了用户、组的概念。那么同样文件的权限也就有相应的所属用户和所属组了。
windows和macOS,不同系统的目录结构
windows,伪多用户模式,目录分为不同磁盘,所有用户都可以访问到macOS,真正的多用户模式,在home目录下分为不同的用户,每个用户都有自己独立的桌面、文档、下载
macOS下不同用户还可以进行分组,所以它的文件权限设置就会相对复杂查看文件属性
ls -l-------------------------total 412368-rw-r--r--@ 1 zang staff 210766049 11 26 2019 wx7.0.8.ipadrwxr-xr-x 2 zang staff 64 4 21 17:21 未命名文件夹
- [权限] [连接] [所有者] [所属组] [文件大小] [最后修改日期] [文件名称]
文件类型与权限(
permission)
第一个字母:文件类型,常见:
d:目录(directory)-:文件一个文件的完整权限,总共分为三组:
- 第一组:文件所有者的权限
- 第二组:这一组其他用户的权限
- 第三组:非本组用户的权限
每一组文件权限的
rwx-表示:
r:读(read)w:写(write)x:执行(execute)- 这三个权限的位置不会变,依次是
rwx- 出现
-在对应位置,代表没有此权限修改权限
文件权限的改变使用
chmod命令设置方法有两种:
- 数字类型
- 符号类型
文件权限分为三种身份:
[user] [group] [other]三种权限分别为:
[read] [write] [execute]
数字类型:
各个权限数字对照:
r:4,1左移2位w:2,1左移1位x:1,1左移0位转为二进制:
r:0100w:0010x:0001使用这种设计方式,不同权限可以按位或,哪一位为1表示有该权限存在。在开发中,适用于多个选项的位移枚举,使用按位或就能得到最终结果
例如:一个文件权限为
-rwxr-xr-x
User:4 + 2 + 1 = 7Group:4 + 0 + 1 = 5Other:4 + 0 + 1 = 5使用命令:
chmod 755 file
例如:删除所有用户组的所有权限
chmod 000 file符号类型:
chmod `[u、g、o、a]` `[+、-、=]` `[r、w、x]` file用户组:
u:Userg:Groupo:Othera:All,不设置默认为a操作:
+:加入-:除去=:设置权限:
r:读w:写x:执行例如:对文件所有用户组增加可执行权限
chmod a+x file例如:删除其他用户的所有权限
chmod o=- file例如:当前用户具有所有权限,组用户有读写权限,其他用户只有读权限
chmod u=rwx,g=rw,o=r file
脚本自动重签名
案例1:
搭建
在项目根目录,创建
rsign.sh文件
为
rsign.sh文件增加可执行权限
chmod a+x rsign.sh在项目根目录,创建
APP文件夹
将
wx7.0.8.ipa拷贝到APP文件夹
打开
rsign.sh文件,写入以下代码:【准备工作】:定义变量
TEMP_PATH="${SRCROOT}/Temp"ASSETS_PATH="${SRCROOT}/APP"TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
${SRCROOT}:工程文件所在的目录TEMP_PATH:临时目录,将ipa包解压到Temp目录ASSETS_PATH:资源文件夹,提前在工程目录下新建一个APP文件夹,里面放ipa包TARGET_IPA_PATH:目标ipa包路径清空
Temp文件夹
rm -rf "${SRCROOT}/Temp"mkdir -p "${SRCROOT}/Temp"【第一步】:解压
ipa包到Temp目录
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"拿到解压的临时的
App的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")【第二步】:将解压出来的
.app拷贝进入工程下``` TARGET_APP_PATH=”$BUILT_PRODUCTS_DIR/$TARGET_NAME.app” echo “app路径:$TARGET_APP_PATH”
rm -rf “$TARGET_APP_PATH” mkdir -p “$TARGET_APP_PATH” cp -rf “$TEMP_APP_PATH/“ “$TARGET_APP_PATH”
> - `$BUILT_PRODUCTS_DIR`:工程生成的`App`包的路径> - `$TARGET_NAME`:`target`名称> 【第三步】:删除`Extension`和`WatchApp`>
rm -rf “$TARGET_APP_PATH/PlugIns” rm -rf “$TARGET_APP_PATH/Watch”
> - 个人证书无法签名`Extention`> 【第四步】:更新`info.plist`文件`CFBundleIdentifier`>
/usr/libexec/PlistBuddy -c “Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER” “$TARGET_APP_PATH/Info.plist”
> - 格式:`"Set :KEY Value" "目标文件路径"`> 【第五步】:给`MachO`文件上执行权限>
APP_BINARY=plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<
chmod +x “$TARGET_APP_PATH/$APP_BINARY”
> - `APP_BINARY`:拿到`MachO`文件的路径> 【第六步】:重签名第三方`FrameWorks`>
TARGET_APP_FRAMEWORKS_PATH=”$TARGET_APP_PATH/Frameworks” if [ -d “$TARGET_APP_FRAMEWORKS_PATH” ]; then for FRAMEWORK in “$TARGET_APP_FRAMEWORKS_PATH/“* do
> 【第七步】:用权限文件签名`App`包>
/usr/bin/codesign —force —sign “$EXPANDED_CODE_SIGN_IDENTITY” “$FRAMEWORK”
> 来到项目,点击`Target`,选择`Build Phases`,在`Run Script`中输入:`./rsign.sh`<br />> 真机运行项目,`App`安装成功<br />> `Xcode`配合脚本实现自动重签名,`App`在非越狱设备上也能正常运行<br />> 案例2> 安装更高版本`App`> 从某人越狱设备上导出砸壳后的`wx8.0.2.ipa`,拷贝到`APP`文件夹<br />> 真机运行项目,`App`安装成功,但运行时报错<br />> 解压`ipa`包,进入`App`目录,打开`info.plist`文件<br />> - 由于砸壳后`ipa`做了瘦身,一些支持的设备在`info.plist`里显示不全,只需要删除`info.plist`的`UISupportedDevices`节点即可> 删除`UISupportedDevices`节点后,将解压后的`Payload`文件夹,重新打包成`ipa`包>
zip -ry wx8.0.2.ipa Payload ```
再次运行项目,
App运行成功
总结
codesign重签名
- 删除不能签名的文件:
Extention和Watch(包含了Extention)- 重签名
Frameworks里面的库- 给可执行文件
+x可执行权限- 新建工程,真机编译并运行,将描述文件安装到手机。将描述文件拷贝到
.app包中- 修改
info.plist文件的BundleID- 通过授权文件重签
.app包- 最后通过
Xcode安装
Xcode重签名
- 删除不能签名的文件:
Extention和Watch(包含了Extention)- 重签名
Frameworks里面的库- 给可执行文件
+x可执行权限- 修改
info.plist文件的BundleID- 将
App包拷贝到Xcode工程目录中,剩下的交给Xcode
Shell
- 切换
Shell使用chsh -s Shell路径命令- 现在
macOS中默认Shell是zsh,早期是bashShell启动时初始化的配置文件:
zsh:.zshrc
bash:.bash_profile文件权限和用户组
- 每个文件都有所属的用户、组、其他
- 文件权限归属:用户、组、其他
- 权限:写、读、执行
修改权限
- 使用
chmod命令- 数字类型:
r:4
w:2
x:1- 符号类型:
用户组:u:用户,g:组,o:其他,a:所有
操作:+:添加,-:去掉,=:设置
权限:r:读,w:写,x:执行







































