热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS应用程序安全(23)对抗运行时分析和操作

作者:PrateekGianchandani译者:吴发伟原文网址:http:resources.infosecinstitute.comios-application-se

作者:Prateek Gianchandani

译者:吴发伟

原文网址:http://resources.infosecinstitute.com/ios-application-security-part-23-defending-runtime-analysis-manipulation/

版权声明:自由转载-非商用-保持署名

在前面的文章中,我们看到了如何使用调试器和工具如Cycript对iOS应用进行运行时分析和操作。我们也看到了在运行时通过使用GDB来修改寄存器的值是如何修改方法的具体实现的,看到了怎样使用工具如Cycript来进行swizzling方法实现。有Cycript和GDB这样的工具在手,加上你的应用程序可执行文件的拷贝,一切就都在攻击者的掌控之中。不过,有一些技巧能够使得攻击者更难攻击。本文我们将查看开发者能够用来对抗运行时分析和操作的防御技巧。

在Xcode中,开发者(译者注:原文写的是攻击者,按上下文理解应该是开发者)能够使用一些检测方法来查看一个应用是否正被调试。在Xcode中,你可以用下面的代码来检查调试器是否存在。

#ifndef DEBUG
SEC_IS_BEING_DEBUGGED_RETURN_NIL();
#endif

正如名字指出的,如果应用正被调试,那么这个宏会返回nil。你可以把这个检查放到一些重要的地方,比如访问或者返回重要数据的地方。如果在那时(访问或者返回重要数据的时候)应用正被调试,这个宏就会返回nil。因此你的应用就不会工作正常,因此攻击者就会遇到问题。或者你可以在一个Timer中调用,一旦你发现应用正被调试,你可以删除存储在应用中的所有重要信息、重要文件等等。但是,请注意攻击者使用Cycript能够劫持你的方法实现,因此比较明智的是只使用一个宏而不是在一个方法内使用这个宏。请注意这个宏只在release下能工作正常。要在你的设备上测试,你需要在build中选择release。选择scheme,然后点击Edit
Scheme。

bubuko.com,布布扣

在Info下面,把Build Configuration设置为Release。

bubuko.com,布布扣

现在你可以使用Xcode在你的设备上运行这个应用,你会看到成功检测到调试器。这是因为Xcode会给正在运行的应用附加一个调试器。

再次说一下,这个方法并不能保证应用不会被调试。一个技艺熟练的攻击者能够对应用程序的二进制文件对这个宏相关的汇编指令打补丁。作为开发者,你应该在多个地方检查,使得攻击者更难调试。

另一个阻止调试器附加到应用程序的方法是使用ptrace函数。使用这个函数,传递一个特定的参数,能够阻止其它任何调试器附加到应用程序上。像GDB和LLDB在附加到进程的时候就会使用ptrace函数。使用ptrace,加上参数PT_DENY_ATTACH就会告诉这个函数,应用不允许追踪。下面是苹果官方文档关于 PT_DENY_ATTACH 的截图。

bubuko.com,布布扣

让我们试试。在Xcode中创建一个新工程。点击File->New->Project->Single View Application。然后在模拟器中运行。你会得到如下的视图。

bubuko.com,布布扣

现在,使用如下的代码来修改main.m文件。导入ptrace.文件,然后在main函数中增加如下代码。

#ifndef DEBUG
ptrace(PT_DENY_ATTACH, 0, 0, 0);
#endif

你的main.m看起来应该像这样。

bubuko.com,布布扣

现在运行程序,你会发现应用加载不起来。这是因为当Xcode加载应用的时候,它会把一个调试器(LLDB或者GDB)附加到应用上。因为我们在main.m中加了反调试代码,因此Xcode不能附加调试器,因此它就退出应用。

双击模拟器上的home按钮,然后kill这个测试应用。再次运行,这次能够启动起来。这是因为我们没有通过Xcode加载,因此没有调试器附加到上面。

当然,这个方法也不能保证你的应用就绝对安全。技术熟练的攻击者能够在解密应用之后对这个防检测代码打补丁。作为开发者,你应该在多个地方使用这个方法,使得攻击者的工作变得更难。

需要注意的事,上述两种方法都将试图阻止调试器加载到应用上,但是它对Cycript没有用,因为Cycrit并不追踪应用。作为开发者,你能够做下面的一些检查使得攻击者的工作变得尽可能的难。例如,你可以在应用中增加一些假的方法,攻击者可能会对这些假方法感兴趣。例如,用userDidLogin:(BOOL)didLogin;作为名字,肯定会吸引攻击者的注意。当然,攻击者会试图用Cycript执行。在这个方法实现中,你可以清除应用中的所有数据,甚至报告服务器,这个应用已经被侵入。对于特别需要安全的银行应用,你也可以检查设备是否已经越狱。如果是,可以拒绝所有访问服务器并且删除所有存在应用本地的重要信息。在下一篇文章中,我们将查看如何检查设备是否越狱。另一件需要做的事情就是检查应用是否被破解,然后执行必要的步骤来防止攻击者获取信息。在github上有一个很简单的类可以帮你完成这个工作。当然,攻击者总是能够劫持方法实现的,因此,把它改一个不那么起疑的名字。

对于那些检查应用是否安全的方法,你也可以给它们改个名字以便它们看起来不那么重要。例如,一个检查应用是否正被调试的方法不应该被命名为-(BOOL)isAppBeingDebugged。这肯定将会引起攻击者的注意并替换方法实现。相反,命名为-(BOOL)didChangeColor 或者 -(BOOL)didSetFont。就不错。这个情况下,这个函数在攻击者看来就不那么重要了。

如果你已经检测到可疑行为,并且认为最好退出应用,你可以使用下面的命令。

exit(-1);

这将退出应用。

最好,一个需要注意的非常重要的一点就是,没有任何应用在一个技艺熟练的攻击者面前是安全的。有你的应用的二进制文件的拷贝,加上Cycript、GDB等工具在手,一切就都在攻击者的掌控之中。我们能做的就是使用尽可能多的检查,使得攻击者的任务变得困难以至于他放弃我们的应用去找那些更容易攻击的应用。

译者注1:第一种方法,我在Xcode5上没有试成功,如果有人知道原因,麻烦说一下。

译者注2;SEC_IS_BEING_DEBUGGED_RETURN_NIL是一个自定义的宏,请参见iOS App Security
and Analysis: Part 2/2 和 这 (感谢小伙伴
方彬@支付宝 给我提示)



本文原文 IOS Application
Security Part 23 – Defending against runtime analysis and manipulation


推荐阅读
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
author-avatar
mnuee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有