2012-02-08 52 views
9

崩溃,我做在那里我做了一些安全的东西一个xcode项目,他们问我混淆方法名Objective-C的混淆工作在DEBUG但在发布

像这样

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

我从项目(项目A)中创建了一个框架库,并将其包含到另一个项目(项目B)中。

但是当我运行(项目B)与发布构建配置它总是崩溃像这样。

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

所以它试图访问该方法时崩溃。

但是当我运行(项目B)它与调试版本配置它运行平稳

(我遵守了我所有的构建配置设置为默认值)

+0

你的编译器标志是什么? – CarlJ 2012-02-08 14:55:58

+1

它在发布版本中工作,没有混淆的方法名称? – 2012-02-08 14:56:32

+4

他们对默默无闻的安全性有何评论? – JeremyP 2012-02-08 15:14:21

回答

7

你在哪里放置#define为混淆?它是在框架的头文件(.h)还是在实现文件(.m)中?

为了使混淆生效,它必须放置在实现和调用者都包含的文件中。

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

+0

通过助手编辑器也可以查看预处理结果。 – Danra 2012-02-19 22:17:24

1

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

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

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不可见的情况下,可能会调用该方法。

1

如果你已经将所有东西都包装到了框架中,你是否确定在框架之外暴露了适当的头文件?框架中的标题不像普通文件一样暴露。转到您的Project-> Build Phases,在右下角您应该看到“Add Copy Headers”。这将在您的构建阶段添加一个新的部分。在此部分内,单击“+”和定义方法名称的标题。