前回の続き。
ですが、前回は3年前です。
なのに、皆さん難読化に興味があるのか、Blogの人気記事は難読化です。
今回はリフレクションとアゼンブリマージを使った場合の難読化について検証します。
Explanation
前回は、ソースコードの実行結果が、難読化前後で変化しないこと、逆アセンブルした後、人間が容易に理解できるようなソースコードではなくなっていたことを確認しました。
今回は、リフレクションとアゼンブリマージがどう変化するのかを実際に見てみます。
サンプルソースは、**GitHub** に置きました。
前回のように、できあがった exe (今回は Obfuscation4.exe) を Eazfuscator.NET の右側の緑の領域に、作成したプログラムをドラッグアンドドロップします。
Reflection
(1) 実行結果の検証
Before
After
(2) 逆コンパイラによるソースコード解析
リフレクションは成功していることがわかります。
Assembly Merge
ではアセンブリをマージしてみましょう。
次はできあがった exe と dll (Obfuscation4Lib.dll) を Eazfuscator.NET の右側の緑の領域に、作成したプログラムをドラッグアンドドロップします。
次にexeを実行すると…
失敗します。
直感的に、複数のアセンブリを複数ドロップすることでマージできそうですが、それでは失敗します。
結論から言うと、Eazfuscator.NET はアセンブリマージの機能は対応していますが、一工夫必要です。
1 | using System.Reflection; |
上記コードの中央下の [assembly: Obfuscation(Feature = “merge with Obfuscation4Lib.dll”, Exclude = false)] によってマージするアセンブリを指定できます。
その後、exe だけを再びドラッグアンドドロップして難読化を実行します。
さらに、アセンブリがマージされたことを確認するため、exe だけを別の場所に配置して実行すると上手くいきません。
1 | ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Obfuscation4Lib'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 |
(゜Д゜) ハア??
という落とし穴があります。
どうも、Mergeには副作用があるようで、難読化等が失敗することがあるようです。
これはヘルプファイルに記載してあります。
Usage of assemblies merging may lead to some side effects which may make obfuscation fail. If such is the case then use the principle of the least common denominator – merge just those assemblies which do not cause obfuscation failure.
Assemblies embedding can be used in conjunction or as an alternative to assemblies merging.
訳) アセンブリマージの使用は難読化の失敗させるかもしれない副作用を引き起こすかもしれません。そのようなケースでは、最小公倍数の原理-難読化失敗を引き起こさないアセンブリだけマージします。
アセンブリの埋め込みは結合に使うことができ、またはアセンブリマージの代用にすることができます。
そのため、
1 | - [assembly: Obfuscation(Feature = "merge with Obfuscation4Lib.dll", Exclude = false)] |
のように変更します。
その後に、ビルド、exeのドラッグアンドドロップ実行、exeの隔離、実行をすると、今度こそ成功します。
ですが、先ほどと同じように JetBrains dotPeek で逆コンパイルして確認すると、参照アセンブリにObfuscation4Lib.dllが含まれたままです。
なのに、exeを隔離して実行しても上手くいくのは、単純にdotPeekが上手く処理できていないだけなのでしょうか?
ただ、思うところはあります。
アセンブリをマージしているのに、 Assembly.Loadでマージ(埋め込み)対象のアセンブリを読み込もうとしているのを認識しているのでしょうか?
何はともあれ、参照済みのアセンブリをわざわざリフレクションでアセンブリをロードするのはやめた方が良いようです。イレギュラーでしょうし。
理由はこれ以上深く追求できませんしませんが、この問題を克服した結果をお見せします。