《iOS平台游戏安全之IPA破解原理及防御》由会员分享,可在线阅读,更多相关《iOS平台游戏安全之IPA破解原理及防御(12页珍藏版)》请在金锄头文库上搜索。
1、在博客上谈过了 iOS 游戏的内购安全,存档安全及内存安全。其实还有一个很泛滥但被视为鸡肋的问题,即 iOS IPA 破解问题,因为国内大多数游戏靠内购和广告盈利,游戏安装包也只是在早期象征性的收费,之后就会免费,所以对 IPA 从只能在购买者设备安装变成可免费到处安装并不关注。破解软件的问题,其实不仅仅是 iOS 上,几乎所有平台上,无论是 pc 还是移动终端,都是顽疾。可能在中国这块神奇的国度,大家都习惯用盗版了,并不觉得这是个问题,个人是这么想,甚至某些盈利性质的公司也这么想,著名的智能手机门户网站 前不久就宣传自己平台上盗版全,不花钱。其实这种把盗版软件当成噱头的网站很多,当然还没出
2、现过 91 这种义正言辞地去宣传用盗版是白富美,买正版是傻X 的公司。大家都是做实诚样,把最新最受欢迎的盗版应用一一挂在首页来吸引用户。同步助手就是这种内有好货,不要错过的代表,并且在盗版圈子里,享有良好的口碑,号称同步在手,江山我有。其实 iOS 破解软件的问题,既不起源于中国,现阶段也没有发扬光大到称霸的地位,目前属于老二,当然很有希望赶超。据统计,全球范围内,排名前五的破解 app 分享网站有以下几家:1. Apptrack 代表软件:Crackulous,clutch 破解界的老大哥,出品了多款易用的破解软件,让人人都会破解,鼓励分享破解软件,破解 app 共享卡正以恐怖的速度扩充。2
3、. AppCake 代表软件:CrackNShare新秀,支持三种语言,中文(难得!)、英文、德文,前景很可观3. KulApps 北美4. iDownloads 俄国5. iGUI 俄国以上消息,对于依靠安装包收费的 iOS 开发来说,无疑是噩耗,其实由不少人也在网上号召支持正版,要求知识产权保护的力度加强。这些愿望或许终有一天会实现,但从技术的角度来分析问题的所在,给出有效的防御方案,无疑比愿望更快。破解原理部分Appstore 上的应用都采用了 DRM(digital rights management)数字版权加密保护技术,直接的表现是A 帐号购买的 app,除 A 外的帐号无法使用,
4、其实就是有了数字签名验证,而 app 的破解过程,实质也是去除数字签名的过程。去除过程包括两部分,如下所示:条件一,设备越狱,获得 root 权限,去除掉设备上的签名检查,允许没有合法签名的程序在设备上运行代表工具:AppSync(作者:Dissident ,Apptrack 网站的核心人物)(iOS 3.0 出现,不同的 iOS 版本,原理都不一样)iOS 3.0 后,MobileInstallation 将可执行文件的签名校验委托给独立的二进制文件/usrlibexec/installd 来处理,而 AppSync 就是该执行文件的一个补丁,用来绕过签名校验。iOS 4.0 后,apple
5、 留了个后门(app 给开发者预留的用于测试的沙盒环境),只要在/var/mobile/下建立 tdmtanf 目录,就可以绕过 installd 的签名校验,但该沙盒环境会造成没法进行 IAP 购买,无法在 GameCenter 查看游戏排名和加好友,特征是进入 Game Center 会出现 SandBox 字样。AppSync for iOS 4.0+修复了这一问题。iOS 5.0 后,apple 增加了新的安全机制来保护二进制文件,例如去掉二进制文件的符号表,给破解带来了难度。新版的 AppSync for iOS 5.0+ 使用 MobileSubstrate 来 hook libm
6、is.dylib 库的 MISValidateSignatureAndCopyInfo 函数来绕过签名验证条件二,解密 macho 可执行文件一般采用自购破解的方法,即先通过正常流程购买 appstore 中的 app,然后采用工具或手工的方式解密安装包中的 macho 可执行文件。之所以要先获得正常的 IPA 的原因是 machO 文件是有 DRM 数字签名的,是加密过的,而解密的核心就是解密加密部分,而我们知道,当应用运行时,在内存中是处于解密状态的。所以首要步骤就是让应用先正常运行起来,而只有正常购买的应用才能达到这一目的,所以要先正常购买。购买后,接着就是破解了。随着 iOS 设备 c
7、pu 的不同(arm 6 还是 arm 7),macho 文件格式的不同(thin binary 还是 fat binary),应用是否对破解有防御措施(检测是否越狱,检测应用文件系统的变化),破解步骤也有所不同,但核心步骤如下:第一步:获得 cryptid,cryptoffset,cryptsizecryptid 为加密状态,0 表示未加密,1 表示解密;cryptoffset 未加密部分的偏移量,单位 bytescryptsize 加密段的大小,单位 bytes第二步:将 cryptid 修改为 0第三步:gdb 导出解密部分第四步:用第二步中的解密部分替换掉加密部分第五步:签名第六步:打
8、包成 IPA 安装包整个 IPA 破解历史上,代表性的工具如下:代表工具:Crackulous(GUI 工具)(来自 Hackulous)crackulous 最初版本由 SaladFork 编写,是基于 DecryptApp shell 脚本的,后来 crackulous 的源码泄露,SaladFork 放弃维护,由 Docmorelli 接手,创建了基于 Clutch 工具的最近版本。代表工具:Clutch(命令行工具)(来自 Hackulous)由 dissident 编写,Clutch 从发布到现在,是最快的破解工具。Clutch 工具支持绕过 ASLR(apple 在 iOS 4.3
9、 中加入 ASLR 机制)保护和支持 Fat Binaries,基于 icefire 的 icecrack 工具,objectivec 编写。代表工具:PoedCrackMod(命令行工具)(来自 Hackulous)由 Rastignac 编写,基于 poedCrack,是第一个支持破解 fat binaries 的工具。shell 编写代表工具:CrackTM(命令行工具)(来自 Hackulous)由 MadHouse 编写,最后版本为 3.1.2,据说初版在破解速度上就快过 poedCrack。shell 编写(以下是 bash 脚本工具的发展历史(脚本名(作者),虽然目前都已废弃,但
10、都是目前好用的 ipa 破解工具的基础。autop(Flox)xCrack(SaladFork)DecryptApp(uncon)Decrypt(FloydianSlip)poedCrack(poedgirl)CrackTM(MadHouse)代表工具:CrackNShare (GUI 工具)(来自 appcake)基于 PoedCrackMod 和 CrackTM我们可以通过分析这些工具的行为,原理及产生的结果来启发防御的方法。像 AppSync 这种去掉设备签名检查的问题还是留给 apple 公司来解决(属于 iOS 系统层的安全),对于 app 开发则需要重点关注,app 是如何被解密的
11、(属于 iOS 应用层的安全)。我们以 PoedCrackMod 和 Clutch 为例一、PoedCrackMod 分析(v2.5)源码及详细的源码分析见:http:/ ldid,plutil,otool,gdb 等),伪造特征文件,可以总结为以下几步:第一步. 将 fat binary 切分为 armv6,armv7 部分(采用 swap header 技巧)第二步:获得 cryptid,cryptsize,cryptsize第三步. 将 armv6 部分的 cryptid 修改为 0,gdb 导出对应的 armv6 解密部分(对经过 swap header 处理的 MachO 文件进行操
12、作,使其在 arm 7 设备上,强制运行 arm 6 部分),替换掉 armv6 加密部分,签名第四步. 将 armv7 部分的 cryptid 修改为 0,gdb 导出对应的 armv7 解密部分(对原 MachO 文件进行操作),替换掉 armv7 加密部分,签名第五步.合并解密过的 armv6,armv7第六步.打包成 ipa 安装包注明:第三步和第四步是破解的关键,破解是否成功的关键在于导出的解密部分是否正确完整。由于 binary fat 格式的 macho 文件在 arm 7 设备上默认运行 arm 7 对应代码,当需要导出 arm 6 对应的解密部分时,要先经过 swap hea
13、der 处理,使其在 arm 7 设备上按 arm 6 运行。二、clutch 分析对于最有效的 clutch,由于只找到了 clutch 1.0.1 的源码(最新版本是 1.2.4)。所以从 ipa 破解前后的区别来观察发生了什么。使用 BeyondCompare 进行对比,发现有以下变动。1. 正版的 iTunesMetadata.plist 被移除该文件用来记录 app 的基本信息,例如购买者的 appleID,app 购买时间、app 支持的设备体系结构,app的版本、app 标识符2.正版的 SC_Info 目录被移除SC_Info 目录包含 appname.sinf 和 appna
14、me.supp 两个文件。(1)SINF 为 metadata 文件(2)SUPP 为解密可执行文件的密钥3.可执行文件发生的变动非常大,但最明显的事是 cryptid 的值发生了变化leetekiMac-mini:xxx.app leedani$ otool -l appname | grep cmd LC_ENCRYPTION_INFO -A 4cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 8192cryptsize 6053888cryptid 0-cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 8192cryptsi
15、ze 5001216cryptid 0iTunesMetadata.plist 与 SC_Info 目录的移除只是为了避免泄露正版购买者的一些基本信息,是否去除不影响 ipa 的正常安装运行。破解防御部分在 IPA 防御方面,目前没有预防破解的好办法,但可以做事后检测,使得破解 IPA 无法正常运行以达到防御作用。而该如何做事后检测呢,最直接的检测方法是将破解前后文件系统的变化作为特征值来检测。通过分析 PoedCrackMod 源码,会发现根据破解前后文件时间戳的变化,或文件内容的变化为特征来判断是不可靠的,因为这些特征都可以伪造。如下所示,摘自于 PoedCrackMod 脚本1.Info.plist增加 SignerIdentity,(目前主流的 MinimumOSVersion 版本为 3.0,版本 3.0 之前的需要伪造 SignerIdentity)plutil -key SignerIdentity -value Apple iPhone OS Application Signing $WorkDir/$AppName/Info.plist 2&1 /dev/null伪造 Info.plist 文件时间戳touch