防止方法混淆 Objective-c

6
我试图搜索如何防止我的当前库中的方法替换(Method Swizzle),但我发现几乎所有的文档或博客文章都是关于如何实现Swizzling。在此过程中,有几个问题我一直无法找到答案。
  • 如何在运行时检测Method Swizzling?
  • 如果存在Method Swizzle,如何防止它?
我知道方法替换的危险性,并已经阅读过相关帖子,但找不到相关信息以防止它。如果有任何关于以上主题的文档或博客文章可用,我将非常感激帮助。
1个回答

9
避免方法交换很简单,使用函数而不是方法(即以C++的方式进行操作,或至少在Core Foundation中)。但如果您正在使用ObjC运行时,则可能会被交换。
您可以原则上通过缓存所有IMP指针来检测方法交换,例如在类似于+load的函数中使用class_getMethodImplementation,或者在全局变量的C++构造函数中(在main()之前运行),然后在各种时间重新检查所有IMP指针,以确保它们没有更改。
这可能不会太难,但很难想象所有这些都能实现什么。如果有人拥有您的框架二进制文件,那么删除您的检查就不是一项主要工作。在源代码中,必须有if (swizzled) { ... },这将转换为汇编中的条件跳转指令。您可以把调试器放在系统上,等待分支“ah!我们被交换了”的发生,注意它发生的位置,并将该字节修补为“branch-if-not”或添加不受限制的跳转。
即使是稍微减慢攻击速度,也需要实施大量混淆。有一些技术(大多数效果不太好),但只有通过保守秘密才能奏效。这就是混淆和安全之间的区别。
简短的答案是您无法以任何稳定的方式实现此目标。这意味着您需要一个专门致力于不断提出新的、更先进的混淆并定期更新以应对新的攻击方法的团队(即像暴雪或苹果这样的公司如何防止黑客入侵),或者需要找到一种不需要这个的方法。
最简单的答案是尽可能少地使用ObjC类来工作,并主要采用C++(这将防止方法交换,但不会防止反向工程或修补)。或接受方法交换是无法避免的事实。
(顺便说一下,如果甚至有一个“我愿意付出任何代价”的答案,那么苹果将只需使用该技术使越狱成为不可能。 iPhone经常被越狱表明了问题的难度。)

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Akhilesh Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接