2012-02-08 11 views
9

でのクラッシュは、私は私はいくつかのセキュリティのものをやったXcodeプロジェクトを作り、彼らはObjective-Cの難読化はDEBUGで動作しますが、RELEASE

ので

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

のようにメソッド名を難読化するために私に尋ねた私プロジェクト(プロジェクトA)から.frameworkライブラリを作成し、それを別のプロジェクト(プロジェクトB)に組み込みました。

しかし、リリースビルド構成で(プロジェクトB)を実行すると、常にそのようにクラッシュします。

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

それがメソッドをアクセスもしようとすると、それがクラッシュ。あなたが#defineを配置している

しかし、私はデバッグビルド構成で(プロジェクトB)、それを実行すると、それは滑らか

を実行します(私はデフォルトですべての私のビルド構成の設定を保持している)

+0

コンパイラフラグには何がありますか? – CarlJ

+1

難読化されたメソッド名のないリリースビルドでも機能しますか? –

+4

彼らは何があいまいでセキュリティについて言うのですか? – JeremyP

答えて

7

難読化?フレームワークのヘッダファイル(.h)または実装ファイル(.m)にありますか?

難読化を有効にするためには、実装と呼び出し元の両方に含まれるファイルに配置する必要があります。

また、前処理されたファイルを調べて、前処理が正常であることを確認することもできます。実装ファイルを選択し、メニューProduct > Generate Output > Generate Preprocessed Fileに移動します(画面の下部で設定を選択できます)。

+0

アシスタントエディタを使用して、前処理された結果を表示することもできます。 – Danra

1

難読化されたフレームワークをインポートする実行可能ファイルは、難読化されていないメソッドにアクセスしようとしているようです。

フレームワークのシンボルを確認する必要があります。フレームワーク内の静的ライブラリにnmを使用して、エクスポートされたシンボル( 't'でマークされている)を表示します。シンボルが難読化されていることを確認してください。

2

私の勘違いは#defineの位置/可視性です。

しかし、別の角度から考えてみてください。あなたは、変更される可能性:

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

へ:

完全 #defineを落とす
@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]; 
} 

。使用の際に

は:

SecurityClass_LogIn(); 
… 

これはクラスメソッドなので、あなたの代わりに人間が読めるインラインに包まれた難読化関数を書くことができます。よく作られたCの実装は、objcよりはるかに難しいでしょう。

より完全な例は、可能性を絞り込むのに役立ちます。

また、警告がないことを確認します。宣言されていないセレクタを呼び出した場合、警告が表示されます。他の場合に#defineが表示されないメソッドが呼び出される可能性があります。

1

すべてをフレームワークにラップした場合は、適切なヘッダーがフレームワーク外に公開されていることを確認してください。フレームワーク内のヘッダーは、通常のファイルと同じ方法で公開されません。 Project-> Build Phasesに移動し、右下に「Add Copy Headers」と表示されます。これにより、ビルドフェーズに新しいセクションが追加されます。このセクションの中で、メソッド名を定義する "+"とヘッダーをクリックします。

関連する問題