应用重签名
codesign 命令
Xcode提供了签名工具codesign
,我们可以通过几个命令iu可以完成重签名。
codesign -vv -d [WeChat.app]
查看签名$ security find-identity -v -p codesigning
查看钥匙串力可以签名的证书$ Codesign –fs [证书串] [filename]
强制替换签名$ Chmod +x [filename]
给文件添加可执行权限权限$ security cms -D -i ../embedded.mobileprovision
查看描述文件$ codesign -fs [证书串] --no-strict --entitlements=权限文件.plist APP包
$ Zip –ry [file] [outfile] 将file压缩为outfile
$ otool -l [WeChat]
查看mach-O(可执行)文件,cryptid
等于0说明是砸壳之后的(没有加密),等于1说明是加密的$ otool -l WeChat > ~/Desktop/123.txt
把文件导出到123.txt中
codesign 签名步奏
首先我们需要拿到砸壳之后的.ipa
文件,然后对这个文件解压缩,在Payload
文件夹下看到对应的app文件。
查看签名
$ codesign -vv -d WeChat.app
如果没有重签名,使用的证书还是微信自己的证书。
查看本地钥匙串中可用的证书
$ security find-identity -v -p codesigning
会列出钥匙串中可用的证书。
强制签名
选中WeChat.app
,显示包内容
app包中主要有3个文件需要处理,我们需要对这3个文件做重签名:
- 是资源文件的签名
- Mach-O文件的签名
- Framework的签名
但是内部的PlugIns
文件夹中的插件,watch
文件夹下的内容,使用免费的证书是无法签名的。可以删除掉。
然后我们先对Framework文件夹下的内容签名:
$ codesign -fs "Apple Development: xxx" andromeda.framework
所有的framework都要重签。
创建新的描述文件
- Xcode新建工程,命名为
WeChat
,选择对framework重签名使用的证书。然后在手机上运行一下。 - 在工程中选中
Products
,打开WeChat.app
所在的文件夹。然后显示包内容,找到embedded.mobileprovision
这个描述文件,复制到WeChat.app
内。 - 添加了描述文件之后,还需要修改
info.plist
的bundle id,因为描述文件中是有bundle id信息的。
更改权限
接下来我们看看embedded.mobileprovision
的内容,因为我们需要拿到它的权限部分对WeChat
重签名。
$ security cms -D -i embedded.mobileprovision
查看embedded.mobileprovision
的内容,找到Entitlements
这个key对应的内容(注意拷贝时不需要key),复制到一个新的plist文件中,命名为Entitlements
。- 然后把这个
Entitlements.plist
文件拷贝到Payload
文件夹下,与WeChat.app
同级。 $ ls -l WeChat
查看Mach-O文件是否有可以执行权限,没有的话使用命令$ chmod a+x WeChat
设置可执行权限。
app重签
对APP重签,其实就是对内部Mach-O重签。
退回到Payload
文件夹下,对WeChat.app
签名:
$ codesign -fs "Apple Development: xxx" --no-strict --entitlements=Entitlements.plist WeChat.app
安装
使用Xcode - Window - Devices and Simulators,点击”+“,选择对应的app安装,安装完成之后,点击就能直接运行了。
注意:别登录,容易被封号,我们只是完成了万里长征的第一步而已。
这就是通过命令行使用codesign
进行重签名的流程。
Xcode重签名
我们对拿到的砸壳之后ipa文件进行解压缩,打开Payload
文件夹:
- 删除
PlugIns
、Waatch
文件夹。 - 使用命令行对Framework重签名。
- 创建并运行一个空项目工程,项目名字需要与重签的
xx.app
文件名一致。并运行到手机上。 - 修改xx.app内部的info.plist文件下的bundle id,与新工程一致。
- 在工程下选择
Products
,打开xx.app
所在的文件夹,把第4步修改后的app复制过来,直接替换xx.app
。 - 直接运行。
codesign 与 Xcode签名比较
与codesign
签名相比,直接使用Xcode重签名少了好几步:
- 省略了添加描述文件
- 省略了添加描述文件的权限
- 省略了通过权限重签app
Shell 重签
shell是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程的途径。
Shell一般是指命令行工具。它允许你输入文本命令,然后解释命令,并在内核中执行。
Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。
iTerm 切换bash和zsh的
$ chsh -s /bin/bash
$ chsh -s /bin/zsh
文件类型与权限
可以通过$ls -l
命令查看权限
1 | drwxr-xr-x 5 Alan staff 160 10 19 2015 Public |
d:文件类型 表示目录。-表示 文件
前3位 rwx:文件所有者(user)的权限
中3位 r-x:这一组其他用户(group)的权限
后3为 r-x:非本组的用户(other)的权限,
缩写 | 释义 | 二进制 | 十进制 |
---|---|---|---|
r | read 读 | 0100 | 4 |
w | write 写 | 0010 | 2 |
x | execut 可执行 | 0001 | 1 |
我们经常会用的一个命令 $chmod 755 filename
来改变file的权限
755表示的就是权限,分别为user、group、other的权限。
7: 4 + 2 + 1 = r + w + x
5: 4 + 1 = r + x
也可以使用符号类型来表示:
$ chmod [u、g、o、a][+(加入)、-(除去)、=(设置)] [r、w、x] 文件名称
u:user
g:group
0:other
a:all
例如 $ chmod a+x 123.txt
表示所有人都有可执行权限。
shell重签名
就是在Xcode中,运行时执行shell脚本,自动帮我们处理签名的过程。在写shell脚本的时候,有以下几个步奏:
- 解压ipa文件到Temp文件夹下
- 将解压出来的app拷贝到工程下
- 删除PlugIns和Watch相关的文件
- 更新info.plist文件中bundle id
- 给mach-o文件执行权限
- 重签名framework
- 替换签名
1 | # ${SRCROOT} 它是工程文件所在的目录 |
这里在第一次运行Xcode时,注意要先注释掉该shell脚本,运行一次之后再打开该shell脚本,重新运行。
总结
- codesign重签名
- 删除不能签名的文件:PlugIns(Extension)、Watch
- 重签名Framework
- 给Mach-O可执行权限(
chmod
命令) - 修改info.plist文件中的bundle id
- 创建新工程运行,拷贝描述文件(该描述文件要在iOS系统中信任过)
- 利用描述文件中的权限文件签名整个APP包
- Xcode重签名
- 删除不能签名的文件:PlugIns(Extension)、Watch
- 重签名Framework
- 给Mach-O文件可执行权限(
chmod
命令) - 替换掉Xcode运行后产生的APP包
- Shell重签名
- shell切换
- 老版本的Mac系统默认是bash,新系统(Sierra之后)默认shell是zsh
- zsh的环境变量在
~/.zshrc
中,bash的环境变量在~/.bash_profile
- 用户权限 chmod
- 数字 r:4 w:2 x:1
chmod 751 filename
- 字符 u:创建者 g:组 o:其他 a:所有
chmod a+x filename
- 数字 r:4 w:2 x:1
还是推荐使用shell脚本重签名,因为以上两种方式虽然可行,但是会很麻烦,稍有不慎则会出现意外。
第二种使用Xcode签名,无法控制顺序,虽然做了app包替换,但是在运行时,还是会替换info.plist,导致有一些app安装之后,运行会出现问题。