メソッド名はEXEにコンパイルされますか?
-
03-07-2019 - |
質問
Windows AppプロジェクトをEXEにコンパイルした後、クラス、メソッド、および変数名前がMSILに含まれますか?
- 難読化の場合-名前が少ないほど、リバースエンジニアリングが難しくなります。
- そしてパフォーマンスのために-短い名前、より速いアクセス。
e.g。したがって、メソッドが名前で呼び出される場合:
- 名前を短くにして、名前付きルックアップのパフォーマンスを向上させます。
- 名前を暗号化にしておくと、逆コンパイルが難しくなります。
解決
はい、彼らはILにいます- Reflector を起動すると、それらを表示します。それらがILで終わらない場合、ライブラリとしてそれらに対してビルドできませんでした。 (はい、クラスライブラリであるかのように.exeファイルを参照できます。)
ただし、これはすべてJITで一度解決されます。
今後もコードを維持できるように、名前を読み取り可能にしてください。パフォーマンスの問題によって測定可能な差が生じることはほとんどありません。コードを難読化する場合は、ソースコードレベルで実行しないでください(あなたがコードを読むために1つ)-専用の難読化ツールでそれを行います。
編集:何が含まれているのか-Reflectorまたはildasmを起動して調べてみませんか?メモリから、ローカル変数名(ビルドした場合はpdbファイル内にあります)が失われますが、それだけです。プライベートメソッド名とプライベート変数名はまだあります。
他のヒント
はい、そうです。短い名前を使用することで顕著なパフォーマンスの向上が得られるとは思いません。ゲインが読みやすさの損失を克服する方法はありません。
ローカル変数はMSILに含まれていません。フィールド、メソッド、クラスなどです。 変数はインデックスベースです。
メンバー名は、プライベートであれパブリックであれ、ILに含まれます。実際、すべてのコードも含まれます。Reflectorを使用する場合は、アプリケーションのすべてのソースコードを実際に読み取ることができます。残っているのはアプリのデバッグであり、そのためのツールがあるかもしれません。
多数のクライアントと競合を持つパッケージ化されたアプリケーションを作成している場合は、絶対にコードを難読化する必要があります(これ以上強調することはできません)。幸いなことに、多くの難読化ツールが利用可能です。
これは、.Netで私が抱えている大きな不満です。 MSはこれに多大な労力を費やしているので、プロの難読化ツールを開発(または取得)し、それをVSの一部にしないでください。 Dotfuscatorは、コミュニティ用に用意したバージョンではなく、カットしません。
- 名前を短く、より適切に保つ 名前付きルックアップのパフォーマンス。
これはどのように違いをもたらすのでしょうか? VMで識別子がどのように検索されるかはわかりませんが、ストレート文字列比較ルックアップを実行していないことは確かです。これは最悪の方法です。
- 名前を暗号化し、逆コンパイルを困難にします。
正直なところ、コードの難読化はそれほど役立つとは思いません。そこにいる有能な開発者のほとんどは、すでに「第六感」を開発しています。メソッド名などの識別子が維持または改善する必要のあるソースコードにはすでにこれらの問題があることが非常に多いため、メソッド名などの識別子がまったく役に立たない場合でも、物事を迅速に把握します(" DoAllStuff()"などのメソッド名について話します)。
とにかく、隠蔽によるセキュリティは通常悪い考えです。
難読化について懸念がある場合は、.NET Reactorをチェックしてください。 8種類の難読化ツールをテストしましたが、Reactorは最も安価な市販のものであるだけでなく、2番目に優れたものでした(最高のものは最も高価なDotfuscator Goldでした)。
[編集]
実際に考えてみると、メソッド名を難読化するだけなら、VS.NETに付属するDotfuscator Community Editionは問題なく動作するはずです。
追加されたと思いますが、関数名の検索方法のため、名前の長さは何にも影響しません。難読化に関しては、基本的にあなたが言っていることを正確に行うツール(Dotfuscatorなど)があると思います。