【问题标题】:Prevent Method Swizzling Objective-c防止方法混杂 Objective-c
【发布时间】:2017-01-30 18:40:13
【问题描述】:

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

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

我知道method swizzling的危险,并且已经浏览过这里的相关帖子,但找不到相关信息来防止它。

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

【问题讨论】:

    标签: ios objective-c objective-c-runtime method-swizzling


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢罗伯。我非常感谢详细的解释。对检查有一些类似的想法,但它似乎不是很以性能为中心。但我很感激你的回答。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多