iOS应用程序安全(3)-理解Objective-C Runtime

本文探讨了Objective-C作为面向运行时的语言特性,解释了Objective-C运行时的概念,并通过实例展示了如何使用运行时库进行消息传递分析。进一步介绍了MethodSwizzling技术,用于修改iOS程序的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:Prateek Gianchandani
译者:吴发伟
原文网址:http://resources.infosecinstitute.com/ios-application-security-part-3-understanding-the-objective-c-runtime/
版权声明:自由转载-非商用-保持署名

引言

基本上所有的iOS应用都是用Objective-C编写的。所有这些应用都使用Cocoa,Cocoa在Objective-C上面,提供更高层次的API,使得Mac和iOS开发变得更容易一些。Cocoa也给应用提供了一个运行时环境。本文我们将着重理解Objective-C的运行时和关于内部函数如何运行的错综复杂的细节。这会让我们能够更深入的理解应用程序。


Objective-C runtime

Objective-C是一个面向运行时的语言。所以问题就是,什么是一个运行时语言?一个运行时语言就是在应用程序运行的时候来决定函数内部实现什么以及做出其它决定的语言。Objective-C是一个运行时语言吗?不是。它是一个面向运行时的语言,这意味着只要有可能,它就把做决定的时间从编译时和链接时延迟到这段代码真正执行的时候。正如前面指出的,Cocoa提供了iOS应用程序所需要的运行时环境。下面的截图来自苹果官方的文档,说的非常清楚。你可以到阅读这个文档。

我们来看看运行时库是否被工程引入了。理想情况下,它应该存在于每个iOS应用中。登录进设备,然后进入到应用程序目录。

在命令行中输入“ls *”

现在来看看BADLAND iOS应用程序。BADLAND是一个流行的iOS游戏。进入到BadLand的目录内,一旦进入到BADLAND.app目录内,对BadLand的二进制文件使用otool。

可以看到引入了很多的framework以及库文件。objc-runtime也在其中,如图:

这个运行时库使得在Objective-C中进行运行时操作变得可能。默认所有iOS应用都包含这个库。下面是对Google Maps应用使用otool得到的结果,你可以看到,它也包含了Objective-C 运行时库。


使用GDB进行运行时分析

在本节,我们将使用GDB来观察程序的流程。第一件事情就是安装一个合适版本的gdb。从Cydia能获得的gdb版本并不能工作正常。因此,确保你从其他地方获得gdb,然后可以通过sftp安装到设备上。如图:

确保你有能够运行的权限。

为了能够挂钩(hook)进一个运行的进程,第一件事就是确保这个进程正在运行。在这里,我们将在Google Maps应用上测试。首先我们启动应用,然后获得它的进程id。确保它在前台运行。如下图所示,Google Maps的进程id是661。请注意这个id在你的设备上可能不同。

现在,我们用GDB 挂钩这个进程。

你可以看到,我们成功挂钩进入这个进程。目前我们可以忽略其中的警告。

Objective-C是基于消息的,一旦一个消息被发出,objc_msgSend就会被调用。为了能够分析应用的运行流程,我将给一个最基本的调用下一个断点,例如objc_msgSend, 并且打印出$r0和$r1的值。从$r0我们可以知道这个方法对应的类是什么,从$r1我们可以知道selector。请注意,即使是这样,也可能会打印出太多的细节信息,因为objc_msgSend在消息发出的每个地方都会被调用。在接下来的文章里,我们将看看如何能够更有效使用它。因此,基本上只要断点断下来,我就将打印出$r0和$r1的值然后继续运行程序。下面是如何做的。

输入 c 继续运行程序

如你所看到的那样,这个在分析应用的执行流程的时候很有用。这里打印太多信息了,因此在实际分析应用的时候,不会太有用处,不过在这是为了让大家知道我们能够看到应用是如何实现的。


Method Swizzling

我们已经学到许多iOS应用都使用运行时环境、并且在运行时再做决定。正如其名,method swizzling是我们用来修改iOS程序的另一个武器,我们可以用它来调用我们自己的方法。在下一篇文章中,我们将详细介绍Method Swizzling。


参考:

The Dark art of IOS Application hacking

The Objective-C runtime


本文原文是 IOS Application security Part 3 – Understanding the Objective-C Runtime

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值