iOS逆向实战--014(应用重签名)
应用重签名,就是把已经存在的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/WeChat Identifier=com.tencent.xin Format=app bundle with Mach-O thin (arm64) CodeDirectory v=20400 size=972531 flags=0x0(none) hashes=30383+5 >location=embedded Signature size=4864 Authority=iPhone Distribution: Tencent Technology (Shenzhen) Company Limited (88L2Q4487U) Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Oct 16, 2019 at 17:54:10 Info.plist entries=68 TeamIdentifier=88L2Q4487U Sealed Resources version=2 rules=10 files=1470 Internal 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 12 cmd LC_ENCRYPTION_INFO_64 cmdsize 24 cryptoff 16384 cryptsize 101695488 cryptid 0 pad 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.app
7、最后通过Xcode
安装
案例5:
使用codesign
对App
重签名
右键.app
文件,选择显示包内容
,进入App
目录
文章图片
删除插件和带有插件的.app
包,删除PlugIns
目录和Watch
目录
文章图片
文章图片
对Frameworks
里面的库进行重签名
文章图片
进入Frameworks
目录
cd Frameworks
对.framework
文件依次重签名
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" andromeda.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" mars.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" marsbridgenetwork.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" matrixreport.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" OpenSSL.framework codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" ProtobufLite.framework ------------------------- andromeda.framework: replacing existing signature mars.framework: replacing existing signature marsbridgenetwork.framework: replacing existing signature matrixreport.framework: replacing existing signature OpenSSL.framework: replacing existing signature ProtobufLite.framework: replacing existing signature
回到上级目录
cd ..
对应用重签名,可执行文件必须有可执行权限
chmod +x WeChat
添加描述文件。使用重签名的账号
新建工程
文章图片
真机编译并运行
,将描述文件安装到手机
文章图片
将描述文件拷贝到.app
包中
文章图片
info.plist
文件中替换BundleID
。BundleID
要和描述文件中的ID
保持一致
文章图片
在项目中创建授权文件(Entitlements
)
文章图片
命名entitlements.plist
文章图片
查看描述文件,找到权限信息
security cms -D -i embedded.mobileprovision
文章图片
将的内容,复制到
... 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/WeChat Identifier=com.feng.drivingtrain Format=app bundle with Mach-O thin (arm64) CodeDirectory v=20400 size=972537 flags=0x0(none) hashes=30383+5 location=embedded Signature size=4793 Authority=iPhone Developer: XXX2 (79DN9L6XXX) Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Apr 21, 2021 at 13:38:17 Info.plist entries=68 TeamIdentifier=ZH6L37455T Sealed Resources version=2 rules=10 files=1143 Internal 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:Xcode重签名
Debug
重签名App
在手机上运行App
文章图片
选择Debug -> Attach to Process
,找到对应App
使用
- 出现重复
App
,选择进程号较大的Debug View Hierarchy
开始调试
文章图片
Xcode
重签名步骤:
1、删除插件和带有插件的.app
包(比如Watch
)
2、对Frameworks
里面的库进行重签名
3、给可执行文件+x
可执行权限
4、info.plist
文件中替换BundleID
。BundleID
要和描述文件中的ID
保持一致
5、将App
包拷贝到Xcode
工程目录中,剩下的交给Xcode
案例1:Shell脚本
利用Xcode
重签名
创建和重签名App
同名工程
文章图片
真机编译并运行
删除插件和带有插件的.app
包,删除PlugIns
目录和Watch
目录
对Frameworks
里面的库进行重签名
给可执行文件+x
可执行权限
info.plist
文件中替换BundleID
将修改后的App
包,替换项目中的包
文章图片
直接通过Xcode
运行项目即可
文章图片
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 zangstaff210766049 11 262019 wx7.0.8.ipa drwxr-xr-x2 zangstaff644 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
位
使用这种设计方式,不同权限可以按位或,哪一位为1表示有该权限存在。在开发中,适用于多个选项的位移枚举,使用按位或就能得到最终结果
r
:0100
w
:0010
x
:0001
例如:一个文件权限为-rwxr-xr-x
使用命令:
User
:4 + 2 + 1 = 7
Group
:4 + 0 + 1 = 5
Other
:4 + 0 + 1 = 5
chmod 755 file
文章图片
例如:删除所有用户组的所有权限
chmod 000 file
符号类型:脚本自动重签名
chmod `[u、g、o、a]` `[+、-、=]` `[r、w、x]` file
用户组:
操作:
u
:User
g
:Group
o
:Other
a
: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
文章图片
真机运行项目,App
安装成功
文章图片
Xcode
配合脚本实现自动重签名,App
在非越狱设备上也能正常运行
文章图片
案例2总结
安装更高版本App
从某人越狱设备上导出砸壳后的wx8.0.2.ipa
,拷贝到APP
文件夹
文章图片
真机运行项目,App
安装成功,但运行时报错
文章图片
解压ipa
包,进入App
目录,打开info.plist
文件
文章图片
删除
- 由于砸壳后
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
,早期是bash
Shell
启动时初始化的配置文件:
zsh
:.zshrc
bash
:.bash_profile
【iOS逆向实战--014(应用重签名)】修改权限
- 每个文件都有所属的用户、组、其他
- 文件权限归属:用户、组、其他
- 权限:写、读、执行
- 使用
chmod
命令- 数字类型:
r
:4
w
:2
x
:1
- 符号类型:
用户组:u
:用户,g
:组,o
:其他,a
:所有
操作:+
:添加,-
:去掉,=
:设置
权限:r
:读,w
:写,x
:执行
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- iOS中的Block
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- 2019-08-29|2019-08-29 iOS13适配那点事
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- iOS面试题--基础
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 《将来的你,一定会感谢现在战胜烦恼的自己-------第四章/第十一节/用逆向思维解除烦恼》
- 接口|axios接口报错-参数类型错误解决