应用重签名,就是把已经存在的ipa包,重新配置一套证书和描述文件,再签名生成一个新的ipa

codesign重签名

Xcode提供了签名工具codesign,通过几个命令就可以完成重签名

终端命令

查看钥匙串里可签名的证书

  1. security find-identity -v -p codesigning

强制替换签名

  1. codesign -fs "证书串" 文件名

给文件添加权限

  1. chmod +x 可执行文件

查看描述文件

  1. security cms -D -i embedded.mobileprovision

用权限文件签名App

  1. codesign -fs "证书串" --no-strict --entitlements=权限文件.plist App

将输入文件压缩为输出文件

  1. zip -ry 输出文件 输入文件

案例1:

查看应用的签名信息

从某助手导出砸壳后的wx7.0.8.ipa,将其解压
iOS逆向实战--014:应用重签名 - 图1

使用codesign命令,查看应用的签名信息

  1. codesign -vv -d WeChat.app
  2. -------------------------
  3. Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat
  4. Identifier=com.tencent.xin
  5. Format=app bundle with Mach-O thin (arm64)
  6. CodeDirectory v=20400 size=972531 flags=0x0(none) hashes=30383+5 >location=embedded
  7. Signature size=4864
  8. Authority=iPhone Distribution: Tencent Technology (Shenzhen) Company Limited (88L2Q4487U)
  9. Authority=Apple Worldwide Developer Relations Certification Authority
  10. Authority=Apple Root CA
  11. Signed Time=Oct 16, 2019 at 17:54:10
  12. Info.plist entries=68
  13. TeamIdentifier=88L2Q4487U
  14. Sealed Resources version=2 rules=10 files=1470
  15. Internal requirements count=1 size=212

案例2:

查看钥匙串里可签名的证书

  1. security find-identity -v -p codesigning
  2. -------------------------
  3. 1) E972414310363E12F223F4AB36027459EB2XXXXX "iPhone Distribution: XXX1 (ZH6L374XXX)"
  4. 2) 9671D2A6816E643601A25DE66FA1E7F64F9XXXXX "iPhone Developer: XXX2 (79DN9L6XXX)"
  5. 3) DE19F59CD715AB8E727F492126BA8064E60XXXXX "iPhone Developer: XXX3 (XM33C3GXXX)"
  6. 4) ABD73916998A2CC8FF65BAB19F5C127B66DXXXXX "iPhone Distribution: Beijing XXX XXX Information Technology Co., Ltd. (BD69S49XXX)"
  7. 4 valid identities found

案例3:

查找MachO中的cryptid关键字

  1. otool -l WeChat | grep cryptid -A 1 -B 5
  2. -------------------------
  3. Load command 12
  4. cmd LC_ENCRYPTION_INFO_64
  5. cmdsize 24
  6. cryptoff 16384
  7. cryptsize 101695488
  8. cryptid 0
  9. pad 0
  • cryptid为加密算法的idcryptid0表示当前可执行文件是未加密的,俗称:脱壳

MachO中,最重要的就是代码段和数据段,而加密和签名仅针对代码段

案例4:

在未越狱设备上,直接安装砸壳后的wx7.0.8.ipa

打开Xcode,选择Window -> Devices and Simulators
iOS逆向实战--014:应用重签名 - 图2

点击+,选择安装wx7.0.8.ipa
iOS逆向实战--014:应用重签名 - 图3

提示Unable to install
iOS逆向实战--014:应用重签名 - 图4

未越狱设备,安装App需要进行签名验证,直接安装提示Unable to install。要想成功安装到设备上,需要对其进行重签名

codesign重签名步骤:

1、删除插件和带有插件的.app包(比如Watch

2、对Frameworks里面的库进行重签名

3、给可执行文件+x可执行权限

4、新建工程,真机编译并运行,将描述文件安装到手机。将描述文件拷贝到.app包中

5、info.plist文件中替换BundleIDBundleID要和描述文件中的ID保持一致

6、通过授权文件(Entitlements)重签.app

  • 查看描述文件
  1. security cms -D -i embedded.mobileprovision
  • 将描述文件中Entitlements拷贝出来,生成plist文件。文件名称entitlements.plist
  • 用权限文件签名App
  1. codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app

7、最后通过Xcode安装

案例5:

使用codesignApp重签名

右键.app文件,选择显示包内容,进入App目录
iOS逆向实战--014:应用重签名 - 图5

删除插件和带有插件的.app包,删除PlugIns目录和Watch目录
iOS逆向实战--014:应用重签名 - 图6

iOS逆向实战--014:应用重签名 - 图7

Frameworks里面的库进行重签名
iOS逆向实战--014:应用重签名 - 图8

进入Frameworks目录

  1. cd Frameworks

.framework文件依次重签名

  1. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" andromeda.framework
  2. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" mars.framework
  3. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" marsbridgenetwork.framework
  4. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" matrixreport.framework
  5. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" OpenSSL.framework
  6. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" ProtobufLite.framework
  7. -------------------------
  8. andromeda.framework: replacing existing signature
  9. mars.framework: replacing existing signature
  10. marsbridgenetwork.framework: replacing existing signature
  11. matrixreport.framework: replacing existing signature
  12. OpenSSL.framework: replacing existing signature
  13. ProtobufLite.framework: replacing existing signature

回到上级目录

  1. cd ..

对应用重签名,可执行文件必须有可执行权限

  1. chmod +x WeChat

添加描述文件。使用重签名的账号新建工程
iOS逆向实战--014:应用重签名 - 图9

真机编译并运行,将描述文件安装到手机
iOS逆向实战--014:应用重签名 - 图10

将描述文件拷贝到.app包中
iOS逆向实战--014:应用重签名 - 图11

info.plist文件中替换BundleIDBundleID要和描述文件中的ID保持一致
iOS逆向实战--014:应用重签名 - 图12

在项目中创建授权文件(Entitlements
iOS逆向实战--014:应用重签名 - 图13

命名entitlements.plist
iOS逆向实战--014:应用重签名 - 图14

查看描述文件,找到权限信息

  1. security cms -D -i embedded.mobileprovision

iOS逆向实战--014:应用重签名 - 图15

<dict>...</dict>的内容,复制到entitlements.plist文件中
iOS逆向实战--014:应用重签名 - 图16

iOS逆向实战--014:应用重签名 - 图17

将项目中的entitlements.plist文件,拷贝到.app文件的平级目录下
iOS逆向实战--014:应用重签名 - 图18

iOS逆向实战--014:应用重签名 - 图19

使用重签名的账号和权限文件签名App

  1. codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" --no-strict --entitlements=entitlements.plist WeChat.app
  2. -------------------------
  3. WeChat.app: replacing existing signature

使用codesign命令,查看应用的签名信息

  1. codesign -vv -d WeChat.app
  2. -------------------------
  3. Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat
  4. Identifier=com.feng.drivingtrain
  5. Format=app bundle with Mach-O thin (arm64)
  6. CodeDirectory v=20400 size=972537 flags=0x0(none) hashes=30383+5 location=embedded
  7. Signature size=4793
  8. Authority=iPhone Developer: XXX2 (79DN9L6XXX)
  9. Authority=Apple Worldwide Developer Relations Certification Authority
  10. Authority=Apple Root CA
  11. Signed Time=Apr 21, 2021 at 13:38:17
  12. Info.plist entries=68
  13. TeamIdentifier=ZH6L37455T
  14. Sealed Resources version=2 rules=10 files=1143
  15. Internal requirements count=1 size=184
  • 确认签名已成功替换

将重签名后的App安装到手机
iOS逆向实战--014:应用重签名 - 图20

iOS逆向实战--014:应用重签名 - 图21

iOS逆向实战--014:应用重签名 - 图22

iOS逆向实战--014:应用重签名 - 图23

案例6:

勾选Automatically manage signing选项的差异

当项目勾选Automatically manage signing选项,查看描述文件中的权限信息

  1. security cms -D -i embedded.mobileprovision

iOS逆向实战--014:应用重签名 - 图24

  • application-identifierZH6L37455T.*
  • 案例5中,未勾选Automatically manage signing,显示为ZH6L37455T.com.feng.drivingtrain

继续后面的流程,将重签名后的App安装到手机
iOS逆向实战--014:应用重签名 - 图25

  • 问题出现了,覆盖安装,提示Unable to install

这种情况,需要先删除手机中的App
iOS逆向实战--014:应用重签名 - 图26

再次安装,重签名后的App可以顺利的安装到手机上
iOS逆向实战--014:应用重签名 - 图27

复制权限信息的步骤,一定要检查application-identifier

  • ZH6L37455T.*:无法覆盖安装
  • ZH6L37455T.com.feng.drivingtrain:可覆盖安装

案例7:

Debug重签名App

在手机上运行App
iOS逆向实战--014:应用重签名 - 图28

选择Debug -> Attach to Process,找到对应App
iOS逆向实战--014:应用重签名 - 图29

  • 出现重复App,选择进程号较大的

使用Debug View Hierarchy开始调试
iOS逆向实战--014:应用重签名 - 图30

Xcode重签名

Xcode重签名步骤:

1、删除插件和带有插件的.app包(比如Watch

2、对Frameworks里面的库进行重签名

3、给可执行文件+x可执行权限

4、info.plist文件中替换BundleIDBundleID要和描述文件中的ID保持一致

5、将App包拷贝到Xcode工程目录中,剩下的交给Xcode

案例1:

利用Xcode重签名

创建和重签名App同名工程
iOS逆向实战--014:应用重签名 - 图31

真机编译并运行

删除插件和带有插件的.app包,删除PlugIns目录和Watch目录

Frameworks里面的库进行重签名

给可执行文件+x可执行权限

info.plist文件中替换BundleID

将修改后的App包,替换项目中的包
iOS逆向实战--014:应用重签名 - 图32

直接通过Xcode运行项目即可
iOS逆向实战--014:应用重签名 - 图33

Shell脚本

Shell是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程的途径。Shell一般是指命令行工具。它允许你输入文本命令,然后解释命令,并在内核中执行。

Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。

.bashrc.bash_profile.zshrc作用与区别

在使用命令行工具时,我们可能会遇到一些教程,可能需要你把一些配置写入到.bashrc.bash_profile或者.zshrc等。那么这几个文件到底有什么作用和区别?

从文件名称判断.bashrc.bash_profile是给bash来使用的。而.zshrc是给zsh来使用的

查看bash版本:

  1. bash
  2. -------------------------
  3. The default interactive shell is now zsh.
  4. To update your account to use zsh, please run `chsh -s /bin/zsh`.
  5. For more details, please visit https://support.apple.com/kb/HT208050.
  6. bash-3.2$

查看zhs的安装路径:

  1. which zsh
  2. -------------------------
  3. /bin/zsh

查看bash的安装路径:

  1. which bash
  2. -------------------------
  3. /bin/bash

zsh切换bash,重新打开终端即可

  1. chsh -s /bin/bash

bash切换zsh,重新打开终端即可

  1. chsh -s /bin/zsh

配置建议

bash

  • 将配置选项放到~/.bashrc中,然后在~/.bash_profile中通过source调用

zsh

  • 建议仍然将配置选项放到~/.bashrc~/.bash_profile中通过source调用,最后在~/.zshrcsource调用~/.bash_profile

运行方式

$source x.sh

  • 在当前Shell环境中读取并执行x.sh中的命令
  • 命令可以强行让一个脚本去立即影响当前的环境(一般用于加载配置文件)
  • 命令会强制执行脚本中的全部命令,而忽略文件的权限

$bash x.sh$zsh x.sh

  • 重新建立一个子Shell,在子Shell中执行脚本里面的句子

$./x.sh

  • 读取并执行文件中的命令。但有一个前提,脚本文件需要有可执行权限
用户、组、权限

UnixLinux都是多用户、多任务的系统,所以这样的系统里面就拥有了用户、组的概念。那么同样文件的权限也就有相应的所属用户和所属组了。

windowsmacOS,不同系统的目录结构
iOS逆向实战--014:应用重签名 - 图34

  • windows,伪多用户模式,目录分为不同磁盘,所有用户都可以访问到
  • macOS,真正的多用户模式,在home目录下分为不同的用户,每个用户都有自己独立的桌面、文档、下载

macOS下不同用户还可以进行分组,所以它的文件权限设置就会相对复杂

查看文件属性

  1. ls -l
  2. -------------------------
  3. total 412368
  4. -rw-r--r--@ 1 zang staff 210766049 11 26 2019 wx7.0.8.ipa
  5. drwxr-xr-x 2 zang staff 64 4 21 17:21 未命名文件夹
  • [权限] [连接] [所有者] [所属组] [文件大小] [最后修改日期] [文件名称]

文件类型与权限(permission
iOS逆向实战--014:应用重签名 - 图35

第一个字母:文件类型,常见:

  • d:目录(directory
  • -:文件

一个文件的完整权限,总共分为三组:

  • 第一组:文件所有者的权限
  • 第二组:这一组其他用户的权限
  • 第三组:非本组用户的权限

每一组文件权限的rwx-表示:

  • r:读(read
  • w:写(write
  • x:执行(execute
  • 这三个权限的位置不会变,依次是rwx
  • 出现-在对应位置,代表没有此权限

修改权限

文件权限的改变使用chmod命令

设置方法有两种:

  • 数字类型
  • 符号类型

文件权限分为三种身份:[user] [group] [other]

三种权限分别为:[read] [write] [execute]


数字类型:

各个权限数字对照:

  • r41左移2
  • w21左移1
  • x11左移0

转为二进制:

  • r0100
  • w0010
  • x0001

使用这种设计方式,不同权限可以按位或,哪一位为1表示有该权限存在。在开发中,适用于多个选项的位移枚举,使用按位或就能得到最终结果

例如:一个文件权限为-rwxr-xr-x

  • User4 + 2 + 1 = 7
  • Group4 + 0 + 1 = 5
  • Other4 + 0 + 1 = 5

使用命令:

  1. chmod 755 file

iOS逆向实战--014:应用重签名 - 图36

例如:删除所有用户组的所有权限

  1. chmod 000 file

符号类型:

  1. chmod `[u、g、o、a]` `[+、-、=]` `[r、w、x]` file

用户组:

  • uUser
  • gGroup
  • oOther
  • aAll,不设置默认为a

操作:

  • +:加入
  • -:除去
  • =:设置

权限:

  • r:读
  • w:写
  • x:执行

例如:对文件所有用户组增加可执行权限

  1. chmod a+x file

例如:删除其他用户的所有权限

  1. chmod o=- file

例如:当前用户具有所有权限,组用户有读写权限,其他用户只有读权限

  1. chmod u=rwx,g=rw,o=r file
脚本自动重签名

案例1:

搭建WeChat项目,使用真机运行一次空项目
iOS逆向实战--014:应用重签名 - 图37

在项目根目录,创建rsign.sh文件
iOS逆向实战--014:应用重签名 - 图38

rsign.sh文件增加可执行权限

  1. chmod a+x rsign.sh

在项目根目录,创建APP文件夹
iOS逆向实战--014:应用重签名 - 图39

wx7.0.8.ipa拷贝到APP文件夹
iOS逆向实战--014:应用重签名 - 图40

打开rsign.sh文件,写入以下代码:

【准备工作】:定义变量

  1. TEMP_PATH="${SRCROOT}/Temp"
  2. ASSETS_PATH="${SRCROOT}/APP"
  3. TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
  • ${SRCROOT}:工程文件所在的目录
  • TEMP_PATH:临时目录,将ipa包解压到Temp目录
  • ASSETS_PATH:资源文件夹,提前在工程目录下新建一个APP文件夹,里面放ipa
  • TARGET_IPA_PATH:目标ipa包路径

清空Temp文件夹

  1. rm -rf "${SRCROOT}/Temp"
  2. mkdir -p "${SRCROOT}/Temp"

【第一步】:解压ipa包到Temp目录

  1. unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"

拿到解压的临时的App的路径

  1. 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”

  1. > - `$BUILT_PRODUCTS_DIR`:工程生成的`App`包的路径
  2. > - `$TARGET_NAME``target`名称
  3. > 【第三步】:删除`Extension``WatchApp`
  4. >

rm -rf “$TARGET_APP_PATH/PlugIns” rm -rf “$TARGET_APP_PATH/Watch”

  1. > - 个人证书无法签名`Extention`
  2. > 【第四步】:更新`info.plist`文件`CFBundleIdentifier`
  3. >

/usr/libexec/PlistBuddy -c “Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER” “$TARGET_APP_PATH/Info.plist”

  1. > - 格式:`"Set :KEY Value" "目标文件路径"`
  2. > 【第五步】:给`MachO`文件上执行权限
  3. >

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”

  1. > - `APP_BINARY`:拿到`MachO`文件的路径
  2. > 【第六步】:重签名第三方`FrameWorks`
  3. >

TARGET_APP_FRAMEWORKS_PATH=”$TARGET_APP_PATH/Frameworks” if [ -d “$TARGET_APP_FRAMEWORKS_PATH” ]; then for FRAMEWORK in “$TARGET_APP_FRAMEWORKS_PATH/“* do

  1. > 【第七步】:用权限文件签名`App`
  2. >

/usr/bin/codesign —force —sign “$EXPANDED_CODE_SIGN_IDENTITY” “$FRAMEWORK”

  1. > 来到项目,点击`Target`,选择`Build Phases`,在`Run Script`中输入:`./rsign.sh`<br />
  2. ![](https://upload-images.jianshu.io/upload_images/9297953-bfc23a0802357a00.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  3. > 真机运行项目,`App`安装成功<br />
  4. ![](https://upload-images.jianshu.io/upload_images/9297953-d57207c6c54ec1d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  5. > `Xcode`配合脚本实现自动重签名,`App`在非越狱设备上也能正常运行<br />
  6. ![](https://upload-images.jianshu.io/upload_images/9297953-564b355291bd0ee3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  7. > 案例2
  8. > 安装更高版本`App`
  9. > 从某人越狱设备上导出砸壳后的`wx8.0.2.ipa`,拷贝到`APP`文件夹<br />
  10. ![](https://upload-images.jianshu.io/upload_images/9297953-11496ccd16d552e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  11. > 真机运行项目,`App`安装成功,但运行时报错<br />
  12. ![](https://upload-images.jianshu.io/upload_images/9297953-769e4b1a7b817a22.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  13. > 解压`ipa`包,进入`App`目录,打开`info.plist`文件<br />
  14. ![](https://upload-images.jianshu.io/upload_images/9297953-27164428c8446546.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  15. > - 由于砸壳后`ipa`做了瘦身,一些支持的设备在`info.plist`里显示不全,只需要删除`info.plist``UISupportedDevices`节点即可
  16. > 删除`UISupportedDevices`节点后,将解压后的`Payload`文件夹,重新打包成`ipa`
  17. >

zip -ry wx8.0.2.ipa Payload ```

再次运行项目,App运行成功
iOS逆向实战--014:应用重签名 - 图41

总结

codesign重签名

  • 删除不能签名的文件:ExtentionWatch(包含了Extention
  • 重签名Frameworks里面的库
  • 给可执行文件+x可执行权限
  • 新建工程,真机编译并运行,将描述文件安装到手机。将描述文件拷贝到.app包中
  • 修改info.plist文件的BundleID
  • 通过授权文件重签.app
  • 最后通过Xcode安装

Xcode重签名

  • 删除不能签名的文件:ExtentionWatch(包含了Extention
  • 重签名Frameworks里面的库
  • 给可执行文件+x可执行权限
  • 修改info.plist文件的BundleID
  • App包拷贝到Xcode工程目录中,剩下的交给Xcode

Shell

  • 切换Shell使用chsh -s Shell路径命令
  • 现在macOS中默认Shellzsh,早期是bash
  • Shell启动时初始化的配置文件:
    zsh.zshrc
    bash.bash_profile

文件权限和用户组

  • 每个文件都有所属的用户、组、其他
  • 文件权限归属:用户、组、其他
  • 权限:写、读、执行

修改权限

  • 使用chmod命令
  • 数字类型:
    r4
    w2
    x1
  • 符号类型:
    用户组:u:用户,g:组,o:其他,a:所有
    操作:+:添加,-:去掉,=:设置
    权限:r:读,w:写,x:执行