5

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

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

我知道方法混用的危险,并且已经浏览了这里的相关帖子,但找不到相关信息来防止它。

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

4

1 回答 1

9

避免方法混用很简单;使用函数而不是方法(即在 C++ 中,或至少在 Core Foundation 中,以老式的没有对象的方式做事)。但是,如果您使用的是 ObjC 运行时,您可能会感到困惑。

原则上,您可以通过缓存所有IMP指针来检测 swizzling,例如在全局变量(之前运行)上使用class_getMethodImplementation类似或 C++ 构造函数,然后在不同时间重新检查所有指针以确保它们没有没变。+loadmain()IMP

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

减缓这种攻击,即使是一点点,也需要大量的混淆。有一些技术(大多数情况下效果不佳),但它们只能在保密的情况下发挥作用。这就是混淆和安全之间的区别。

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

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

(顺便说一句,如果这个问题甚至有“我愿意做任何事情”的答案,那么苹果只会使用这种技术来使越狱变得不可能。iPhone 经常越狱的事实表明了这个问题的难度。 )

于 2017-01-30T19:08:01.107 回答