2012-02-08 53 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」。這將在您的構建階段添加一個新的部分。在此部分內,單擊「+」和定義方法名稱的標題。