ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> IOS开发 >> iOS应用程序的脱壳实现原理浅析

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

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

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

  • 生成动态库时指定一个初始化init入口函数,并在入口函数中添加特定的代码。

  • 在动态库中定义一个带有_attribute_((constructor))声明的函数,并在函数内添加特定的代码。

  • 如果你想更进一步的了解上述那些方法的加载的原理,请参考我的文章:深入解构iOS系统下的全局对象和初始化函数

    dumpdecrypted这个工具就是通过建立一个名为dumpdecrypted.dylib的动态库并在库内部定义了一个

    __attribute__((constructor))
    void dumptofile(int argc, const char **argv, const char **envp, const char **apple, struct ProgramVars *pvars)

    函数来实现脱壳的。这个函数的大体实现会在后面继续介绍。

    二、利用父子进程关系来实现脱壳的Clutch

    Clutch也是一个在github上开源的项目,下载地址为:https://github.com/KJCracks/Clutch。关于这个工具的使用jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播也非常之多。我们知道在unix系列的操作系统中父进程可以通过fork或者posix_spawnp两个函数来运行或者建立一个子进程的,这两个函数都会返回对应的子进程ID(PID)。iOS系统则可以通过task_for_pid函数来从进程ID获取进程在mach内核子系统中的mach port标识。得到mach port 标识后,就可以借助mach_vm_read_overwrite函数来读取指定进程空间中的任意虚拟内存区域中所存储的内容。因此Clutch内部的实现就是Clutch这个程序对将要进行脱壳的程序文件路径调用posix_spawnp函数来运行从而成为其子进程,然后借助task_for_pid以及mach_vm_read_overwrite函数来读取脱壳程序子进程在内存中已经被解密后的可执行程序的image所映射的内存空间来达到脱壳的目的的。

    一个思考:可能在实际中并不一定要求是父子进程关系,是否只要某个具有特权的程序或者运行在root用户上的程序只要拿到了对应进程的PID就可以通过mach子系统提供的API来读取其他进程内存空间中的信息呢?

    上述的两种方法中不管是dumpdecrypted还是Clutch最终都是将被解密后的可执行程序的image在内存中的映射写入到一个文件中去来保存脱壳后的内容。参考dumpdecrypted中的dumptofile函数实现以及Clutch中的Dumpers目录下的实现代码就可以看出:一个可执行程序image在内存中映射的内容的结构和mach-o格式的可执行文件结构基本上是保持一致的。都是有一个mach_header结构体头还有诸多的load_command结构体组成。因此所谓的dump处理就是将内存中的这些结构和数据原封不动的写入到文件中去即完成了脱壳中的最核心的部分。如果想仔细的阅读这部分代码的实现,建议先了解一下mach-o文件格式的组成。

    后记

    当你了解了这些内部实现后,也许你会发觉其实它的原理很简单。而且有可能你也能很快的去实现。可问题的关键是为什么这些方法总是别人能想到,而我们却想不到呢?这是否和国人的思维以及解决问题的方式相关呢?在我们的教育和实践体系中更多的是拿来主义和实用主义,往往很少人会对问题进行深入的探索研究以及进行问题的关联性思考。但愿这种情况在未来能够得到改进,尤其作为一个程序员,更加应该秉持探索求知的强烈意愿而不是简单复制和应用就满足了。

    相关图片

    相关文章