iOS签名机制的做用就是保证安装到用户手机上的App都是通过Apple官方容许的。固然,越狱设备除外。 在平时开发时,不论是真机调试,仍是发布App到App Store,咱们都须要通过如下几个步骤ios
首先,在Mac上生成CertificateSigningRequest.certSigningRequest文件 而后在Apple开发者网站上获取到ios_development.cer或者ios_distribution.cer证书文件,前者是开发证书,后者是发布证书 在Apple开发者网站上注册device,添加App ID。 选择device、App ID以及开发证书或者生产证书,生成mobileprovision文件bash
通过以上的一系列操做以后,咱们最终就能够拿到ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件。经过安装这些文件到Mac上就能够进行真机调试。固然,若是你在Xcode中勾选了Automatically manage signing选项,那么Xcode会自动帮咱们执行以上的全部操做。 那么,以上操做每一步执行的做用是什么?最后得到的ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件的做用又是什么?这些文件中又包含了什么内容?app
要想知道上述全部文件的具体做用,就须要了解iOS签名的完整流程。在使用Xcode编译、运行完项目以后,Xcode其实帮咱们作了签名操做。ide
想要执行iOS签名流程,就须要有如下公钥、私钥信息工具
iOS项目在编译完成以后会生成.app文件,App的签名操做从拿到.app文件开始学习
对.app安装包进行签名以后,压缩生成ipa安装包,而后将ipa安装包安装到iPhone上时,会进行签名验证操做。网站
在文件mobileprovision中,有devices、app id以及entitlement信息,它们的做用分别是:
* devices标识着哪些设备能够安装此App,若是设备不在devices中,安装会失败。
* app id,指定此标识的App才能安装,若是App的惟一标识和此app id不对应,则安装失败。
* entitlement中存放在App所具有的权限信息,若是App所使用的权限和entitlement中存放的权限不一致,也会产生问题。
。
复制代码
Apple官方验证流程以下:spa
当咱们逆向了一款App,为App编写了相应的插件,而且安装到了咱们本身的越狱手机上。可是,逆向过的App只能在本身越狱手机上使用,若是咱们想要将App和咱们本身编写的插件从新打包,安装到未越狱的iPhone上,那就须要学习如何对App进行重签名。插件
学习重签名以前,须要注意几点命令行
生成mobileprovision文件有两种方式,第一种是经过Xcode自动生成,在编译后的App包中能够找到,第二种是到Apple官网生成,上文有详细步骤。
复制代码
// 首先从embedded.mobileprovision文件中导出权限信息,存放到temp.plist中
security cms -D -i embedded.mobileprovision > temp.plist
# 而后使用PlistBuddy工具将temp.plist转换成Entitlements格式的文件entitlements.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
复制代码
security find-identity -v -p codesigning
复制代码
获得的结果以下
➜ ~ security find-identity -v -p codesigning
1) D9E2802126C89BF6BF6621064FC5547F895FC25E "iPhone Developer: xxxxx@xxxx.com (KT9PJDKFVG)"
复制代码
# -fs 是 -f -s 的缩写
codesign -fs 证书ID xxx.dylib
复制代码
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
复制代码
使用Xcode编译本身的项目,咱们知道源码,因此知道怎么修改Mach-O文件,可是若是咱们在逆向别人的App时,是不知作别人的源码的,因此没法直接修改Mach-O文件。
以前的文章中学习了Theos,知道了怎么经过建立Tweak项目来修改App的行为,
建立了Tweak项目以后,经过Cydia安装到越狱手机上,而后就能够改变App的行为。具体是怎么实现的呢?
Tweak项目本质上是生成动态库,并且动态库不是存放在.app目录下,因此,想要将咱们逆向过的App安装到别人的手机上,首先须要作的就是将Tweak项目生成的动态库注入到App中的可执行文件中,也就是Mach-O文件中。
可使用insert_dylib库来将动态库注入到Mach-O文件中,能够经过insert_dylib库主页下载insert_dylib工具。在Release环境下编译,获得命令行工具,将命令行工具放在/usr/local/bin目录下。
insert_dylib的本质其实就是往Mach-O文件的Load Commands中添加了一个LC_LOAD_DYLIB或者LC_LOAD_WEAK_DYLIB。具体注入方法以下:
insert_dylib 动态库加载路径 Mach-O文件 --all-yes --weak
复制代码
查看动态库依赖信息两种方式
otool -L Mach-O文件
复制代码
在向Mach-O文件中注入动态库以后,须要更改Mach-O文件中动态库的加载地址,不然在App运行时,会由于找不到动态库报错。
可使用install_name_tool指令来修改Mach-O文件中动态库的加载地址:
install_name_tool -change 旧地址 新地址 Mach-O文件
复制代码
须要注意的是,上述指令中的新地址,必须填写全路径地址,可是咱们不知道App安装到手机上后dylib存放的具体地址,所以,可使用如下两个经常使用的环境变量: