メソッド名やプロパティ名をどう埋め込むか
難読化といえば、問題になるのがリフレクション関係の部分。
public void method4() { typeof(Class1).GetMethod("method1") ... } public void method5(string methodName) { typeof(Class1).GetMethod(methodName) ... }
なんてするときの "method1" を難読化後の名称に変更するのは不可能ではないが面倒くさい。特に、そのメソッド名やらプロパティ名が簡単な英単語だったりすると、難読化による置換マップを使った機械的な置換で失敗することもある。
method5 のような引数で受け取る場合は、元文字列がどこから来るかによって修正する場所がかわってしまうので、さらにややこしかったりするが、このパターンは対象のメソッドが難読化対象外だったりすることが多いように思う。
typeof(class1) で型情報を文字列を元にした方の検索ではなく、型への参照として静的にアセンブリに埋め込めるように、メソッドやプロパティの名前もデリゲートのようなかんじで nameof(class1.method1) とかで埋め込めてもいいんじゃないかな。
単純に nameof(method1) と書くと、"method1" にコンパイルされるが、静的文字列プールに登録される "method1" に nameof() を利用しているという何らかの付加情報がメタデータ的に保存されるだけでも、それを元に静的難読化による置き換えが実行できるようになる気もする。
ああ、そういえば DotFuscator の製品版って {PROPERTY}Changed とか Reset{PROPERTY} とか、意味をもつプレフィックスやサフィックスを維持した難読化を行うオプションってあるのかなぁ〜?