[toc]
前言
在iOS出来之前,以前的主流操作系统(Mac/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件,病毒入侵,静默安装等等.那么苹果希望解决这样的问题,要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过代码签名。
- 如果要实现验证.其实最简单的方式就是通过苹果官方生成非对称加密的一对公私钥.在iOS的系统中内置一个公钥,私钥由苹果后台保存,我们传APP到AppStore时,苹果后台用私钥对APP数据进行签名,iOS系统下载这个APP后,用公钥验证这个签名,若签名正确,这个APP肯定是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个APP都是经过苹果官方允许的.
如果我们iOS设备安装APP只从App Store这一个入口这件事就简单解决了,没有任何复杂的东西,一个数字签名搞定.
但是实际上iOS安装APP还有其他渠道.比如对于我们开发者iOSER而言,我们是需要在开发APP时直接真机调试的.而且苹果还开放了企业内部分发的渠道,企业证书签名的APP也是需要顺利安装的.
苹果需要开放这些方式安装APP,这些需求就无法通过简单的代码签名来办到了。
苹果应用签名
那么我们来分析一下,它有些什么需求: 安装包不需要上传到App Store,可以直接安装到手机上.
苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权 经过苹果允许才可以安装 不能被滥用导致非开发APP也能被安装 为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名.
- iOS的双层代码签名流程这里简单梳理一下,这也不是最终的iOS签名原理.iOS的最终签名在这个基础上还要稍微加点东西.
-
首先这里有两个角色.一个是iOS系统 还有一个就是我们的Mac系统.因为iOS的APP开发环境在Mac系统下.所以这个依赖关系成为了苹果双层签名的基础.
-
在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M . M = Mac
-
苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中.这里称为公钥A , 私钥A. A=Apple
-
把公钥M 以及一些你开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥 A 去签名公钥M。得到一份数据包含了公钥M 以及其签名,把这份数据称为证书。
-
描述文件
描述文件(Provisioning profile)一般包括三样东西:证书、App ID、设备。当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性
- 苹果为了解决应用滥用的问题,所以苹果又加了两个限制.
- 第一限制在苹果后台注册过的设备才可以安装.
- 第二限制签名只能针对某一个具体的APP. 并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.
- 描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
- 在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。
codesigning证书签名
- 查看可用证书
security find-identity -v -p codesigning 列出钥匙串可签名的证书 (iPhone Developer: zed_lv@163.com (TWVF26846Y) )
-
查看包 显示包内容
8cba7a8bcc733cbd333592b65058be5f - 通过反编译查看二进制文件 或者终端命令
1.cd 到Korea_Fan.app
2.otool -l Korea_Fan 查看
3.otool -l Korea_Fan > ~/Desktop/123.txt 重定向成文本输出
# otool -l Korea_Fan | grep xxx xxx 筛选一xxx开头的
# 查看里面的加密id-> cryptid (越狱为0不加密 正版微信1 属于appstore加密 对称加密)
重签app
手动重签名
-
终端命令
64ebab11fa8390b726d94f5942c6695e -
步骤
c41e5f10060bf1a9a365286ffae0bbc0 -
详细步骤
-
cd '/Volumes/吕亚洲/软件/微信-7.0.8(越狱应用)/Payload/WeChat.app/Frameworks
-
codesign -fs "iPhone Developer: zed_lv@163.com (TWVF26846Y)” andromeda.framework)
-
WeChat 可执行文件是否有权限执行?
5dc443fb61c269d71193646ab9832016 -
黑色可支持,白色不可以,不支持
- 加权限 chmod +x WeChat
-
描述文件
-
新建一个工程 真机运行之后 描述文件以及运行到手机中.找个找个运行的ipa 然后显示包内容
70c45ca5070ca075f0c5ecbac4ad96d2
756fc6db108c58b69948773e8ff03980
-
-
描述文件复制粘贴到WeChat中
53c3a5082b0ebb01a01d7bd293cba08e -
找个WeChat里面的plist文件 把bouldeID改一下,改成描述文件的那个
cb04e44fa76c1c67d0c8fe7b397fba43 -
签名app包
abfb1f4372f29a39ada2d95085fe40ca -
查看 security cms -D -i XXX 描述文件名字
ece67dfc709e2ac0e7922708e89d308f -
在工程里面新建一个plist文件,把内容复制进去,然后拿到文件,对WeChat这个app重签名, codesign -fs “证书串” —no-strict —entitlements=xxx.plist app包
c4dd7544af66c970947226fb57d2cd12 -
进入调试状态
629efc8335830429f67cec1931120233
-
Xcode 重签名
-
创建一个与包名相同的文件,这里继续以WeChat为例子,运行到手机上
6f353f8db2059461714823d17922d0ad -
将WeChat包复制 到 运行安装到手机上的WeChat自建工程
3b0f4e1390c57af6849373cd072b1ef2
9bead69b58b38c789057cdfbad78e8e4
如图:
00cca8bee25cfefe117172c3776a62ad
-
这个时候还是不能运行的
- 删插件
- 签名framework
- 注意点 info.plist 里面bouldID不用改 自动回改变
疑问?如果工程名字是Demo,能否将WebChat改成名字为Demo,后面能运行成功吗?
- 不能,demo 显示包文件里面会生成一个个Demo的可执行文件,在command+r 生成的
疑问?能否将二进制文件WebChat改成名字为Demo,后面能运行成功吗?
- 不能,comand + r 运行不通过
如果查看运行的mach-o文件
4c290c5a160faaaee6c2264f2ba096dbshell脚本重签名
切换zsh 或bash 终端脚本
chsh -s /bin/zsh
chsh -s /bin/bash
-
shell脚本
e1c40bf06581b94ec8cbac8e90028706 -
shell脚本执行相关命令
- 举例子
- 相关指令
查看系统的shell脚本
cd /private/etc -> ls->cat shells->
05ce204efcf59482fba63e114f1b7588
ls ~ 查看root目录
ls -l 查看文件权限
d开头文件夹
drwxrwxr-x+ 16 root admin 512 2 28 22:22 Applications
-开头文件
-rwxr-xr-x 1 root wheel 633328 12 5 17:33 zsh
文件权限与类型
66be76f51ecd47f5dbaf5955c9f5cff2改变权限
56882e37f966770276dfd75dc1fd01941 2 4 是二进制 0001 0010 0100
chmod +x 文件名 单写一个代表三个用户x权限
chmod 6 文件名
shell脚本签名
-
将xcoed手动签名 用命令行写出来,并创建APP Temp文件夹,
-
写脚本
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
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"
#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径WeChat
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"
#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
echo "证书名称:$EXPANDED_CODE_SIGN_IDENTITY"
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入
#yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/HankHook.framework/HankHook"
-
通过运行知道 ,shell执行路径为工程根路径 $(SRCROOT)
e64430c39739edc002fdf7ecb54710be -
脚本执行
58fa02d376302308adf70bca93ce196d - 通过脚本执行命令,执行脚本…….
framework注入 工具注入
- 为什么重签名?
- 签名->破解->调式->执行我们自己的代码
- 应用执行的代码?
- 1.machO文件(需要汇编来改) 系统文件(不能改) framework (可以加一个自己的)
猜想:我们往重签名的app中加入自己的framework,但是加进去如何执行?
b49f1a354b0bdf3fea68b34a914aaa91首先,了解一下macho文件,首先查看WeChat的文件
load commands 代码依赖的一些库,等等一些信息,都是统一由>dyld加载—>动态库加载到内存
-
手动注入
1. 新建framework工程,创建一个类,写入一段代码
bb635a4c0d8ef495539f6a361fbe2a27
a921c2ba1a9cf89b6f2352d2cf053d172. 然后编译一下,查看framework是否编译进去,真机编译,真机编译 真机编译,创建framework 都要编译一下 ![0189b48a0262da2fd1d456d4b51bee8f](https://img.haomeiwen.com/i2280900/2fe5cce692913a7e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 3. 已经在包里面.但是此刻运行肯定还是不会调用,因为WeChat二进制文件,并没有包含这个文件,此时要借助大神脚本,操作一下.改变load comamnd,通过yololib指令修改wechat的二进制内容,yololib,放在 ,一定要有执行权限. 4. yololib ![8ac36d152685b2c25980c630dcad6105](https://img.haomeiwen.com/i2280900/f133dd256c826445.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 5. 命令执行,修改WeChat ![791f08a2852fcb0ecd4151298762423e](https://img.haomeiwen.com/i2280900/200b991995353f6b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 6. 然后查看macho文件里面是否包含我们自己的库 ![b7ec0f0b57082dc363c235fd4367a82a](https://img.haomeiwen.com/i2280900/e89cc083827cf076.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 7. 疑问:替换好的Wecha二进制文件,去替换哪里的WeChat? 下面那个 ![4d86a91b42c0459c47a9c198028f6d9c](https://img.haomeiwen.com/i2280900/606f0458b72d2a6d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![1cef89859aa76f4f271ee3c27c98f2c6](https://img.haomeiwen.com/i2280900/d19b766a1deb2c90.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 8. 很明显,每次都会解压编译,要替换最初的,也就是ipa包里面 ,所以先解压,替换,压缩成ipa包 9. 然后开始运行项目….. 打印出我们注入的代码![cd1ead89de3082a7edc0b1475fc1cb30](https://img.haomeiwen.com/i2280900/a5c3f412508ab360.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 10. 步骤 ![95fbaa6958fdb3242bac82e90b757f53](https://img.haomeiwen.com/i2280900/e86d8e913d4ed988.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
脚本注入
-
手动修稿二进制太麻烦,直接将yololib 写成脚本
a95d3cb500a052a29119c0432114ae68 -
执行
e707e03becb0da725a2a19176b670f1d
dyld注入
-
创建dyld,真机运行
2e197cdece2257d8a6c68774a0edf4da -
把自动签名一些文件拷贝过来,脚本也要写,运行发现,framework里面并没有,注入的包.
- masOS,改成iOS才能用 a612a531ed6e1a8fdae80f3ff9262ef4
-
修改签名
3fee6ac58fa4ac41b9ab4ff66e82ea42 -
手动加一下动态库,让xcode帮我移过去
5d21d692d34f54cef5ed0b5556448eaa -
修改脚本,为dylib
3b6e5ba68682b306a0285aeddcd50519 -
运行….
fb7a087c9ab060a220b000f80f01a5a1
-
网友评论