防止方法调整Objective-c

Akh*_*rma 4 objective-c objective-c-runtime ios method-swizzling

我试图搜索以防止我当前库中的方法Swizzle,但我或多或少发现每个文档或博客文章是关于如何实现Swizzling.关于Method swizzling,我有几个问题,我无法找到所有问题.

  • 如何在运行时检测方法Swizzling?
  • 如果有一个方法Swizzle如何防止它?

我知道方法调整的危险,并且已经在这里查看了相关的帖子,但是找不到相关信息来阻止它.

如果上述主题中有任何文档或博客文章,我将非常感谢您的帮助.

Rob*_*ier 7

避免方法调配很简单; 使用函数而不是方法(即在没有对象的情况下以C++方式,或者至少在Core Foundation中以老式的方式做事).但是如果你正在使用ObjC运行时,你可以被调整.

你原则上可以通过缓存你的所有IMP指针来检测调配,例如class_getMethodImplementation+load全局变量(之前运行main())中使用类似或者可能是C++构造函数,然后IMP在不同时间重新检查所有指针以确保它们没有没改变.

这可能不会辛苦,但很难想象有什么这一切会实现.如果某人拥有您的框架二进制文件,那么修补它以删除您的支票并不是一项重大工作.在源代码的某处,必须有一个if (swizzled) { ... },这将转换为程序集中的branch-if条件指令.你在系统上粘贴一个调试器,等待分支"啊!我们被调配"发生,注意它发生的点,并将该字节修补为"如果不是分支"或只是添加无条件跳转.

减轻这种攻击,即使是一点点,也需要大量的混淆.有些技术(大多数都不能很好地工作),但它们只是保密.这就是混淆和安全之间的区别.

简短的回答是你真的无法以任何稳定的方式实现这一点.这意味着您要么需要一个团队致力于不断提出新的,更高级的混淆,并在新的攻击出现时定期更新它们(即暴雪或苹果公司如何防止黑客入侵),或者您需要找到一种方法来需要这个.

最简单的答案?主要使用C++工作并尽可能少地使用ObjC类(这将防止调配,但不能进行逆向工程或修补).或接受调配是不可避免的.

(顺便说一句,如果甚至有"我愿意做任何事情"这个问题的答案,那么苹果公司只会使用这种技术使越狱变得不可能.事实上,iPhone经常被越狱,这表明问题很难解决. )