[翻译]iOS 二进制文件补丁技术简介
发表于:
2013-8-21 20:06
16683
跟上一篇文章一样,内容还是非常多。所以还是不贴正文。
想看的请自行下载pdf进行阅读iOS 二进制文件补丁技术简介 (第一部分) Email:root@obaby.org.cn
翻译:obaby
http://www.h4ck.org.cn 作为我的另外一个身份—法政科学家,需要经常来破解一些程序。当在处理一些高等级的案子的时候,并不是总是那么简单的可以从文件系统上获取到相关的数据;这将会变得更加困难,尤其是数据经过加密或者混淆的时候。因而,在这种情况下,对整个文件系统进行克隆,并且执行一个法律允许的破解(forensic hacking)会使情况变得更加简单;这通常会有很多种办法来是一个应用程序展开自己的内部数据并且暴露出来。我们同样会作为一个安全审计院,测试员或者黑客来测试金融/银行、政府、或者其他客户的一些隐私数据安全,我们会针对这些数据或者应用程序(有时候是服务器)进行攻击(可控情况下)来看系统是不是最终安全,多半情况下,我们会在被测试程序中发现一些非常严重的安全漏洞。有时候我会发现许多程序的加密算法实现千疮百孔,允许我攻击这个加密算法的实现方式,而不必对整个应用进行解密(这个将会更加困难)。
这里有很多的不同的方法来篡改一个 iOS 应用。我在我的一本书中(<<Hacking and Securing iOS Applications>>)介绍过其中的一些方法。最常用的(简单的)方法就是使用 gdb 或者 cycript 之类的工具来在执行过程中对 Object-C 的执行代码进行篡改,这个我已经在 Black Hat 2k12 上进行了阐述(幻灯片)。这个是非常容易实现的,因为整个运行时只经过极少数的 C 函数。这样就变得可以非常简单的来劫持一个应用程序的执行流程,或者创建自己的对象,或者替换程序内的方法。很多的时候单独的考虑运行时状态并不能够让你从一个应用程序中得到想要的结果。我在我的书中写到的安全性最差的例子,在启动的时候在登录界面通过一个简单的调用 [ OneSafeAppDelegate userIsLogged: ].就加载了所有的数据,并且加密方法非常简单。因而单独的考虑运行时只能将你带到这么远,cycript 只能在方法级别使用。如果你需要重载一个方法内部的一些逻辑,你需要借助一个调试器来实现。调试一个程序可以给你更多的控制权,但是这同样是一个交互的过程;你需要在每次进行分析的时候都要准备好自己的调试器和调试进程,并且处理程序的相关修改(或者可以写一些脚本来实现)。开发者现在也同样在检测越狱和反调试技巧
上变得更加的聪明,也就是说,你需要去穿越这些保护才能到达你想要的地方。
这就是为什么今天要讲的二进制文件修改的意义。其中好处是二进制文件的修改可以直接修改程序的内部逻辑,而不必在调试过程中每次都要修改。通过修改程序自身的代码,你可以重写整个应用。这同样可以使你达到一个机器指令级别,并且可以控制寄存器,参数,比较操作,或者一些其他的逻辑。二进制文件修改在反盗版系统领域已经有很长的历史了,但是这同样适用于司法取证或者安全审计领域。如果我能找到一个方法修改程序来提供给我访问特定证据的权限,那么我可以拷贝这个二进制文件到原来的系统(如果需要)来释放相关的证据,或者将携带已经修改过的设备交给调查员。对于安全审计来说,我可以提供一个修改过的二进制文件,并且附带一份报告来告诉他们怎么破解他们的应用以及怎么样来加强安全性。
修改二进制程序通常需要对程序进行二次签名,因为在修改的过程中会破坏苹果已经添加的签名信息。通常人们会将程序拷贝到一个已经越狱的设备上,一些越狱的设备并没有完全的禁用签名,这时候就需要使用 ldid 或者 codesigh_allocate 之类的工具进行重签名。将一个开发者的二进制文件进行修改之后重新使用另外的密钥进行签名也是可以的。这是一个黑客最常用的修改方法,来使应用程序运行在越狱的设备上。
现在有很多的工具可以来修改一个二进制文件,你可以使用免费的工具或者可以花$5,000 来使用一个非常好的工具。这篇文章将会介绍怎么来完成这样工作,并且也会涉及到怎么使用一系列工具来使工作变得更简单。文章中的大部分内容也适用于修改其他应用程序(例如 x86 架构下的 Mac OSX 应用),因为他们同样是 Mach-O 文件结构(但是指令集是不一样滴).
使用下面的代码作为例子,这段代码调用了另外一个函数并且随后判断返回值。这类函数在应用中随处可见。它可以用来检测设备是否越狱,或者确保帐户有足够的余额进行转账,或者验证用户的密码(最好不要这样)。这是一个草莓味的例子,(HOHOHO):
#include <stdlib.h>
int test_condition() {
return 0xff;
}
int main() {
int result = test_condition();
if (result) {
exit(0);
}
}
$export
SDK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Develo
per/SDKs/iPhoneOS6.1.sdk
$export
ARM_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Devel
oper/usr/bin/
$ ${ARM_PATH}/arm-apple-darwin10-llvm-gcc-4.2 -o test1 test1.c -isysroot ${SDK_PATH}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: