【问题标题】:Objective-c obfuscation of methods works in DEBUG but crashes in RELEASEObjective-c 方法的混淆在 DEBUG 中有效,但在 RELEASE 中崩溃
【发布时间】:2012-03-01 00:38:40
【问题描述】:

我做了一个 xcode 项目,我做了一些安全工作,他们要求我混淆方法名称

像这样

#define specialMethod a9328238
+(void) specialMethod
{
   // do security stuff
}

我从项目(项目 A)制作了一个 .framework 库,并将其包含到另一个项目(项目 B)中。

但是当我使用 Release 构建配置运行(项目 B)时,它总是像这样崩溃。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SecurityClass a9328238]: unrecognized selector sent to class 0x337cc4'

所以当它尝试访问该方法时会崩溃。

但是当我使用调试构建配置运行(项目 B)它时,它运行顺利

(我将所有构建配置设置保留为默认设置)

【问题讨论】:

  • 编译器标志中有什么?
  • 它是否可以在没有混淆方法名称的发布版本中工作?
  • 他们对默默无闻的安全性有何看法?
  • 它无需混淆即可工作。
  • 也许您应该更多地说明如何使用混淆 - 您在示例中显示的方式,在方法定义(在 .m 文件中)之前使用 #define 不会使该名称对调用者可见(尽管这显然不是您看到的错误的原因,所以我怀疑您正在压缩您的代码)

标签: objective-c ios configuration frameworks build


【解决方案1】:

您将#define 放在哪里进行混淆处理?是在头文件(.h)还是在框架的实现文件(.m)中?

为了使混淆生效,它必须放在一个文件中,该文件既包含在实现中,也包含在调用者中。

您还可以通过检查预处理文件来检查预处理是否正常。选择实现文件,进入菜单Product > Generate Output > Generate Preprocessed File(可以在屏幕底部选择配置)。

【讨论】:

  • 也可以通过助手编辑器查看预处理结果。
【解决方案2】:

我的预感也是#define 位置/可见性。

但您可能想从另一个角度考虑这一点。你可以改变:

#define specialMethod a9328238
+(void) specialMethod
{
   // do security stuff
}

到:

@interface SecurityClass : NSObject

// private obfuscated interface:
+ (void)a9328238;
// {
//    do security stuff in a9328238's definition
// }

@end

// here is the public interface:
static inline void SecurityClass_LogIn() {
   [SecurityClass a9328238];
}

完全放弃#define。

使用中:

SecurityClass_LogIn();
…

由于这是一个类方法,您可以编写一个包含在人类可读内联中的混淆函数。精心设计的 C 实现将比 objc 更难区分。

一个更完整的例子将帮助我们缩小可能性。

还要验证没有警告——如果你调用了一个未声明的选择器,编译器可能会警告你。在其他情况下,#define 不可见时,可能会调用该方法。

【讨论】:

    【解决方案3】:

    似乎导入混淆框架的可执行文件试图访问非混淆方法。

    您应该检查框架中的符号。在框架中的静态库上使用nm 以查看导出的符号(标有“t”)。确保符号被混淆。

    【讨论】:

      【解决方案4】:

      如果您已将所有内容包装到框架中,您是否确保适当的标头暴露在框架之外?框架内的标头与普通文件的公开方式不同。转到您的项目->构建阶段,在右下角您应该会看到“添加复制标题”。这将在您的构建阶段添加一个新部分。在此部分中,单击“+”和定义方法名称的标题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-15
        相关资源
        最近更新 更多