ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> IOS开发 >> iOS应用程序的脱壳实现原理浅析

iOS应用程序的脱壳实现原理浅析(1/3)

来源:网络整理     时间:2018-10-25     关键词:

本篇文章主要介绍了" iOS应用程序的脱壳实现原理浅析",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: 应用程序加载过程对于诸多逆向爱好者来说,给一个app脱壳是一项必做的事情。基于安全性的考虑,苹果对上架到appstore的应用都会进行加密处理,所以如果直接逆向...

应用程序加载过程

对于诸多逆向爱好者来说,给一个app脱壳是一项必做的事情。基于安全性的考虑,苹果对上架到appstore的应用都会进行加密处理,所以如果直接逆向一个从appstore下载的应用程序时,所能看到的“源代码”将非常的晦涩难懂。为了能看懂应用程序的“源代码”,就必须对应用程序进行解密,也就是所谓的脱壳。脱壳后的目的是可以分析应用程序的一些技术实现原理,或者利用一些漏洞进行攻击和测试。

这篇文章不是一篇介绍如何利用工具去进行脱壳的教程,而只是简单的分析这些常用脱壳工具的实现原理。要想了解脱壳原理,就要先去了解一个被加密的应用程序是如何被运行的。下面一张图片简单的介绍了一个被加壳后的应用程序被加载和运行的过程:

脱壳原理以及常见的工具

要对一个壳应用进行脱壳处理,无非就是采用静态脱壳和动态脱壳两种方法:静态脱壳就是在已经掌握和了解到了壳应用的加密算法和逻辑后在不运行壳应用程序的前提下将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后就可能会改用更加高级和复杂的加密技术;动态脱壳就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。从上面的壳应用程序运行的过程就可以看出无论壳程序如何被加密处理,最终运行后在进程中的代码映像(image)始终是被解密后的原始程序二进制。所以只要一个进程内存空间中的代码映像(image)能被读取和访问就可以实现动态脱壳。下面要介绍的两个工具就是巧妙的运用了两种不同的访问技巧来实现动态脱壳的。

一、利用动态库注入来实现脱壳的dumpdecrypted/frida-ios-dump

dumpdecrypted和frida-ios-dump都是在github上开源的项目,下载地址分别为:https://github.com/stefanesser/dumpdecrypted和https://github.com/AloneMonkey/frida-ios-dump。关于使用这两个工具来进行脱壳的文档非常之多。我们知道一个应用除了有一个可执行程序外,还会链接非常多的动态库。动态库加载后和可执行程序共享相同的进程内存空间,而且动态库中的代码是可以访问整个进程内存空间中的有权限的区域的,包括可执行程序的image被加载到进程中的内存区域。因此只要想办法让应用程序加载某个特定的第三方动态库,也就是让这个第三方动态库注入到应用程序的进程中去就可以实现将被解密过后的可执行程序在进程内存中的image信息转储到文件中去从而实现脱壳处理。对于一个越狱后的设备来说主要可以通过两种方法来实现第三方动态库的注入:

  1. 设置环境变量DYLD_INSERT_LIBRARIES的值指向这个第三方动态库的路径。然后运行要脱壳的应用程序即可。 DYLD_INSERT_LIBRARIES环境变量的设置是一个操作系统提供的特性,所有运行的程序都会加载这个环境变量中所指向的动态库文件。

  2. 将第三方动态库文件保存在越狱设备的/Library/MobileSubstrate/DynamicLibraries/目录下并编写对应的库的同名plist文件,所有plist中指定的可执行程序一旦运行就会加载对应的动态库(此目录即Tweak插件所在的目录)。

还有一种直接修改对应mach-o格式的可执行文件内容来实现动态库注入。

动态库加载的问题解决后就需要解决动态库中代码运行的时机问题了。要想让一个被加载的动态库在加载后自动运行某一段代码可以有四种方法:

  1. 建立一个C++全局对象,并在对象所属类的构造函数中添加特定代码。

  2. 建立一个OC类,并在OC类的+load方法中添加特定的代码。

相关图片

相关文章