iOS逆向学习(签名机制)

iOS签名机制的做用

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签名流程

要想知道上述全部文件的具体做用,就须要了解iOS签名的完整流程。在使用Xcode编译、运行完项目以后,Xcode其实帮咱们作了签名操做。ide

其实就是利用codeSign指令对.app文件进行签名操做。

准备

想要执行iOS签名流程,就须要有如下公钥、私钥信息工具

  • Mac设备的公钥和私钥,通常是Mac设备本身生成
  • Apple官方的私钥,保存在Apple的后台
  • Apple官方的公钥,每一台iPhone出厂以后都会保存Apple官方的公钥信息

签名流程分析

iOS项目在编译完成以后会生成.app文件,App的签名操做从拿到.app文件开始学习

  • 第一步,拿到.app文件以后,使用Mac私钥对.app文件进行签名操做,生成的签名文件存放在.app目录下的_CodeSignature/CodeResources

  • 第二步,使用Apple私钥对Mac公钥进行签名,生成证书文件

  • 第三步,将第二步获取到的证书文件和devices、app id以及entitlement一块儿使用Apple私钥再次进行签名,生成mobileprovision文件,也就是描述文件。

  • 第四步,将第一步签名事后的.app文件和第三步生成的mobileprovision文件一块儿压缩生成ipa安装包。

  • 最后,完整的签名打包过程以下

验证流程

对.app安装包进行签名以后,压缩生成ipa安装包,而后将ipa安装包安装到iPhone上时,会进行签名验证操做。网站

  • 第一步,使用iPhone上存放的Apple公钥验证mobileprovision文件中的签名。
  • 第二步,签名验证成功以后,拿到mobileprovision中存放的devices、app id以及entitlement信息。同时拿到证书文件。而后使用Apple公钥对证书中的签名进行验证。验证成功以后拿到Mac公钥。
  • 第三步,拿到Mac公钥以后,使用Mac公钥对App的签名文件进行验证,若是验证成功,则代表当前的App的源码没有被篡改过。而后此App就能安装到iPhone上 最后获得完整的签名加验证流程,以下

在文件mobileprovision中,有devices、app id以及entitlement信息,它们的做用分别是:

* devices标识着哪些设备能够安装此App,若是设备不在devices中,安装会失败。
* app id,指定此标识的App才能安装,若是App的惟一标识和此app id不对应,则安装失败。
* entitlement中存放在App所具有的权限信息,若是App所使用的权限和entitlement中存放的权限不一致,也会产生问题。

。
复制代码

签名实际操做流程

Apple官方验证流程

Apple官方验证流程以下:spa

重签名

当咱们逆向了一款App,为App编写了相应的插件,而且安装到了咱们本身的越狱手机上。可是,逆向过的App只能在本身越狱手机上使用,若是咱们想要将App和咱们本身编写的插件从新打包,安装到未越狱的iPhone上,那就须要学习如何对App进行重签名。插件

学习重签名以前,须要注意几点命令行

  • 第一,安装包中的可执行文件必须是进行过脱壳操做的,重签名才会生效,否则会安装失败
  • 第二,重签名所须要的mobileprovision文件必须是付费开发者帐号申请的才能够,免费开发者帐号没法进行重签名。
  • 第三,.app包中的全部动态库(.framework,.dylib)、AppExtension(PlugIns文件夹,拓展名是appex)、WatchApp(Watch文件夹)等都须要进行重签名操做

CodeSign指令重签名

  • 首先,须要准备一个embedded.mobileprovision文件(必须是付费开发者帐号生成的,里面的appid、device等须要匹配),而后将此文件放入.app包中
生成mobileprovision文件有两种方式,第一种是经过Xcode自动生成,在编译后的App包中能够找到,第二种是到Apple官网生成,上文有详细步骤。
复制代码
  • 从embedded.mobileprovision文件中提取出entitlements.plist权限文件,具体有两步:
// 首先从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

复制代码
  • 查看Mac上可使用的证书,获取到证书的Identity,后续签名须要使用,具体指令以下
security find-identity -v -p codesigning

复制代码

获得的结果以下

➜  ~ security find-identity -v -p codesigning
  1) D9E2802126C89BF6BF6621064FC5547F895FC25E "iPhone Developer: xxxxx@xxxx.com (KT9PJDKFVG)"

复制代码
  • 对.app包中的全部动态库、AppExtension等进行重签名,前提是修改过这些动态库或者AppExtension,若是没有修改的动态库或者AppExtension,能够跳过此步骤。指令以下:
# -fs 是 -f -s 的缩写
codesign -fs 证书ID xxx.dylib

复制代码
  • 对.app包进行签名,须要使用到以前生成的entitlements.plist文件,指令以下:
codesign -fs 证书ID --entitlements entitlements.plist xxx.app

复制代码

Theos插件重签名

使用Xcode编译本身的项目,咱们知道源码,因此知道怎么修改Mach-O文件,可是若是咱们在逆向别人的App时,是不知作别人的源码的,因此没法直接修改Mach-O文件。

以前的文章中学习了Theos,知道了怎么经过建立Tweak项目来修改App的行为,

Tweak加载方式

建立了Tweak项目以后,经过Cydia安装到越狱手机上,而后就能够改变App的行为。具体是怎么实现的呢?

  • 首先,Tweak项目通过编译生成的是一个dylib动态库文件,存放在Tweak项目目录.theos/obj/debug/目录下。
  • 执行make package打包以后生成对应的deb文件,存放在packages目录下。
  • 执行make install以后,会经过Cydia安装到手机上,dylib文件存放在~/Library/MobileSubstrate/DynamicLibraries/目录下。
  • 在App启动以后,会同时将dylib加载到内存中,App中若是访问被咱们hook的类中的方法,会直接执行dylib中的方法。

动态库的注入

Tweak项目本质上是生成动态库,并且动态库不是存放在.app目录下,因此,想要将咱们逆向过的App安装到别人的手机上,首先须要作的就是将Tweak项目生成的动态库注入到App中的可执行文件中,也就是Mach-O文件中。

可使用insert_dylib库来将动态库注入到Mach-O文件中,能够经过insert_dylib库主页下载insert_dylib工具。在Release环境下编译,获得命令行工具,将命令行工具放在/usr/local/bin目录下。

insert_dylib库用法

insert_dylib的本质其实就是往Mach-O文件的Load Commands中添加了一个LC_LOAD_DYLIB或者LC_LOAD_WEAK_DYLIB。具体注入方法以下:

insert_dylib 动态库加载路径 Mach-O文件 --all-yes --weak

复制代码
  • --weak选项表示,即便当前注入的动态库找不到,App也不会报错
  • --all-yes选项表示,后面全部的选项都选yes

查看Mach-O的动态库依赖信息

查看动态库依赖信息两种方式

  • 经过otool查看Mach-O的动态库依赖信息
otool -L Mach-O文件

复制代码

  • 经过MachOView查看Mach-O的动态库依赖信息

更改动态库的加载地址

在向Mach-O文件中注入动态库以后,须要更改Mach-O文件中动态库的加载地址,不然在App运行时,会由于找不到动态库报错。

可使用install_name_tool指令来修改Mach-O文件中动态库的加载地址:

install_name_tool -change 旧地址 新地址 Mach-O文件

复制代码

须要注意的是,上述指令中的新地址,必须填写全路径地址,可是咱们不知道App安装到手机上后dylib存放的具体地址,所以,可使用如下两个经常使用的环境变量:

  • @executable_path表明可执行文件所在的目录,也就是Mach-O文件所在目录。咱们将dylib和可执行文件放在同一个目录下,而后将地址修改成@executable_path/dylib名称。这就表示在加载动态库时,到可执行文件所在的目录下去寻找动态库。
  • @loader_path表明动态库所在的目录,此环境变量通常在动态库依赖其它动态库的状况下使用,若是咱们须要注入的动态库还依赖其它动态库,那么就须要将所依赖的动态库和原动态库存放在同一目录下,而后更改动态库的加载地址为@loader_path/动态库名称。这表示到原动态库所在目录下加载须要依赖的动态库。

Theos开发的动态库插件注意事项

  • 咱们使用Theos开发的动态库插件(dylib)由于使用过Cydia安装的,因此它默认是依赖CydiaSubstrate插件的。CydiaSubstrate插件存放目录为iPhone的/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate。
  • 若是想要将咱们开发的动态库插件打包到ipa中, 就须要同时将CydiaSubstrate一块儿打包到ipa中,而且须要修改CydiaSubstrate的加载地址。

重签名GUI工具

iReSign 和 iOS App Signer

相关文章
相关标签/搜索