Objective-c方法的混淆在DEBUG中起作用,但在RELEASE中崩溃

时间:2012-02-08 14:53:36

标签: objective-c ios configuration frameworks build

我做了一个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)时,它使用Debug构建配置,它运行顺畅

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

4 个答案:

答案 0 :(得分:7)

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

要使混淆有效,必须将其放在实现和调用者都包含的文件中。

您还可以通过检查预处理文件来检查预处理是否正常。选择实施文件并转到菜单Product > Generate Output > Generate Preprocessed File(您可以选择屏幕底部的配置)。

答案 1 :(得分: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在其他情况下不可见。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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