私は名前の難読化について研究し、最近文字列の暗号化についていくつか読みました。
難読化保護と暗号化シェルには文字列暗号化保護機能があります。
一般に、文字列暗号化は次の 2 つのカテゴリに分類できます。
1 つ目のカテゴリは、難読化保護における文字列暗号化テクノロジです。主な機能は、コードの実行パスを変更することです。
ほとんどの難読化保護ツールで使用される文字列暗号化は、このカテゴリに分類されます。
2 番目のカテゴリは、暗号化シェルの文字列暗号化テクノロジです。この方法では、IL コードを変更せずに、メタデータ内の文字列を直接暗号化します。
このカテゴリは、remotesoft および maxtocode によって表されます。
まず最初のカテゴリを見てみましょう。暗号化の実装はおおよそ次のとおりです。
暗号化前:
MessageBox.Show("Hello World!");
暗号化後:
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
簡単に言うと、元々文字列が使用されていた場所が、文字列の間接的な使用に変更されます。
ここでは、保護ソフトウェアは文字列「Hellow World!」を暗号化し、結果「A34579dfbbeyu346563345/==」を取得します。
Helper.Decode は、保護ソフトウェアが提供する復号化機能で、「A34579dfbbeyu346563345/==」を「Hellow World!」に戻します。
難読化保護されているため、デコードされたコードを解析して取得できます。次に、この関数のコードを直接使用して、アセンブリ内のすべての暗号化された文字列を復元するための小さなツールを作成します。文字列対応表を生成します。コードの読み取りとデバッグを容易にするため。
さらに深く進むと、文字列を元のアセンブリに自動的に復元できます。
上の例の IL コードを見てみましょう。
暗号化前:
ldstr 「ハローワールド!」
MessageBox.Show(string) を呼び出します
。
ldstr "A34579dfbbeyu346563345/=="
呼び出し文字列 Helper.Decode(string)
MessageBox.Show(string) の呼び出し
、実際には非常に簡単です。デコード コードはすでにわかっており、文字列を復号化することができます。対応する文字列のテーブルが取得されます。
ldstr "A34579dfbbeyu346563345/==" を
直接変更します
。
呼び出し文字列 Helper.Decode(string)
ldstr "Hellow World"
に置き換える
だけです。正規表現を使用して検索と置換を行う小さなツールを作成するだけです。
2 番目のタイプの文字列暗号化保護:
実装では、メタデータ内の文字列ストリームを直接暗号化します。
このタイプの保護には欠陥があり、プログラムの実行後、メタデータ内の文字列ストリームが復号化され、メモリに完全に復元されます。前回の記事ではメタデータのダンプについて紹介しました。ここでは繰り返しません。
最初のタイプの文字列暗号化保護には、他の形式もあります。たとえば、Helper.Decode 関数をネイティブ関数にすることができます。
またはプロセスに混入します。