【NanDoku】属性の難読化に関するバグ |
- 日時: 2015/01/01 14:56
- 名前: 青城
<aoshiro.hikaru@gmail.com>
- バグ報告です.自作の属性を難読化するとき,属性をつける際にコンストラクタ引数指定ではなく,メンバへ直接書き込む場合に,実行時「メンバが存在しない」旨の例外が発生します.
【難読化前】 class Program { class FooAttribute:Attribute { public string Text { get; set; } }
[Foo(Text = "Main")] static void Main(string[] args) { var infoList = typeof(Program).GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); foreach(var n in infoList) { var att = (FooAttribute)n.GetCustomAttributes(typeof(FooAttribute), false).FirstOrDefault(); Console.WriteLine(att.Text); } } [Foo(Text = "Bar")] static void Bar() { } }
【難読化後】 internal class a { private class a:Attribute { [CompilerGenerated] private string a; public string a { get; set; } } [global::a.a.a(Text = "Main")] private static void b(string[] a) { MethodInfo[] methods = typeof(global::a.a).GetMethods(BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array = methods; for(int i = 0;i < array.Length;i++) { MethodInfo methodInfo = array[i]; global::a.a.a a2 = (global::a.a.a)methodInfo.GetCustomAttributes(typeof(global::a.a.a), false).FirstOrDefault<object>(); Console.WriteLine(a2.a); } } [global::a.a.a(Text = "Bar")] private static void a() { } }
難読化後の [global::a.a.a(Text = "Main")] にあるとおり,"Text" 部分が難読化されていないことが原因と考えられます.実行時,リフレクションをして属性を取得する際に「メンバが存在しない」旨の例外が発生します.
もう一つ,これは要望ですが,NanDoku側で指定の実行ファイルのファイルハンドルを参照するのではなく,コピーを作成してそちらを参照するようにして欲しいです.NanDokuを立ち上げたままコンパイルが出来ない状況は不便です.難読化のバグ取りにかなり手間取ったので,こちらも併せてお願いします.
|
|
Re: 【NanDoku】属性の難読化に関するバグ ( No.1 ) |
- 日時: 2015/03/09 08:39
- 名前: Toki◆pRU.c9X.EOI
- この現象は属性の記述内容が中間コードないで文字列として処理されているために起こります。
正確には文字列を示すバイナリ配列です。
このため、この部分が正確なメンバを特定できないため 対応する部分に合わせての名称変更ができなくなります。
回避方法としては該当するメンバを難読化の対象から除外するしかありません
|
|
|