为什么要说iOS的签名呢?现在移动平台的逆向的教程和书籍已经相当多了。针对签名的文章也很多,我这里想说的一些是可能别的地方看不到的比较细微的内容(虽然都是老黄历~~)。
iOS的签名目的其实也比较纯粹,就是为了能够在不越狱的情况下安装破解版的ipa。当然,如果是各种助手的话还有另外的一个目的,那就是应用分发(更重要的是在分发之前加入自己的广告sdk)。
说到iOS的应用分发其实主要方式有如下几种:
在ipa安装的过程中并不会校验设备上有没有授权信息,只有到运行的时候才会校验授权信息。此时如果没有授权 那么会弹出要求输入用户名和密码的弹框。
如果要验证上面的内容。有个简单的做法,那就是删除设备上的授权文件。除了要删除上面的iTunes目录下的文件还要删除以下的文件。
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sidr
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sids
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sidt
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sisb
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sisv
/private/var/mobile/Library/FairPlay/iTunes_Control/iTunes/IC-Info.sidb
/iTunes_Control/iTunes/iTunesControl 目录下的文件及时删除也不会影响应用的正常云信,并且在启动app之后下面的文件会进行重建。
通过appstore下载ipa,早期的itunes通过两步进行的。
通过接口创建授权文件以及相关目录SC_Info,该目录位于ipa的Payload\EmojiUltimate.app 目录下。并且同时创建iTunesMetadata.plist文件
。该文件包含了ipa购买的apple id的相关信息。
SC_info 目录结构:
关于ipa结构的文章可以看这个链接: https://blog.razb.me/pulling-apart-an-ios-app/
旧版的ipa在Frameworks目录下的支持库下并没有独立的SC_info
新版的ipa在所有的库目录下都创建了SC_info, 具体是哪个版本变更的,由于长时间没有接触这个,我也不知道~~
虽然存在多个文件,但是文件的内容是一样的,通过md5就可以比对出来了,当然现在md5碰撞比较容易实现了,但是参考一下还是可以的。
将授权文件,购买信息打包到ipa内。这个就是通过itunes最终下载到的ipa。现在最新的itunes已经没有应用商店了~~
通过该文件可以看到,购买的appleid 为[email protected]。各种助手也是通过该文件来判断应用的版本信息,是否是苹果的官方应用(如果要准确判断还需要依赖SC_info)。不过在安装的过程中该文件并不参与校验。即使删除该文件也可以正常安装,并且该文件不参与签名。
众所周知,苹果一向以安全著称,那么既然最后的ipa是通过拼接合成的,那么会不会在下载的过程中被篡改?或者加入一些其他的功能?其实苹果早就想到了这一点了。即使是应用商店下载的ipa也是带数字签名的。
ipa的签名信息分为两部分:
ipa文件信息签名包括资源签名都位于Payload\EmojiUltimate.app_CodeSignature 下的 CodeResources文件内:
文件部分内容:
对应文件的额哈希值为sha1 + base64, 较新的ipa同时还会有sha256 + base64的签名方式。
新版签名数据
计算方法:
with open(filepath, 'rb') as f: sha1obj = hashlib.sha1() sha1obj.update(f.read()) hash = sha1obj.hexdigest() print("sha1:", hash) bs = base64.encodebytes(sha1obj.digest()) print("hash:", bs)
通过计算可以发现,数值与plist文件中的数值是一样的:
看到这里,既然已经知道了计算方法,那么是不是可以修改文件,更新哈希值之后进行安装呢? 如果尝试以下你就会发现这条路行不通!为什么?哈希明明是对的?
那是因为虽然当前文件的哈希是对的,但是由于文件内容变化,导致整个CodeResources文件的哈希值变了。而这个文件的哈希值则是记录在可执行文件的签名信息中的。
通过jtool可以便捷查看对应的签名信息:
标记的地方就是CodeResources的哈希值,通过文中的python代码也可以快速的计算该文件的sha1,两者是一致的。
如果是新版本的ipa则还会有sha256的值。如下:
这也就解释了,为什么下载的ipa是不能随便修改的,当然修改二进制文件最后的效果也是一样的,无法通过签名校验。
虽然如此,还是有一部分文件是可以修改的,那就是SC-info以及目录下的相关文件。这些文件对应的是记录的ipa的购买信息,以及授权信息。那么如果用两个不同的账号购买下载同一款应用,替换内部的sc-info文件是可以正常安装运行的。
至于为什么能通过签名校验,这个放在下一篇吧。
苹果开源代码中,关于签名的代码: https://opensource.apple.com/source/Security/Security-55471/sec/Security/Tool/codesign.c.auto.html