使用を登録しない.NET Reactor


from: www.cnblogs.com/aidd2008/archive/2012/01/15/2323093.html
.NET Reactorはいいものですが、こいつはアップグレードが非常に速く、暗号化アルゴリズムが常に変化し、ますますひどくなって、本当に「ついて行く」のがおっくうです.このようなツールは通常、JIT Hookやnative loaderなど、「シェル」上で多くの仕事をしています.私は通常、その混同機能しか使用しないので、別の方法で「迂回」して、登録しなくても最新バージョンを使用することができます.
まず,.NET Reactor混同後の制約を解析するための簡単なDLLを用意した.test.dll
namespace MyLibrary
{
    public class MyClass
    {
        public void Test()
        {
            Console.WriteLine("MyClass.Test...");
        }
    }
}

namespace MyLibrary.Test
{
    public class MyClass2
    {
        public void TestXXX()
        {
            Console.WriteLine("MyClass2.Test...");
        }
    }
}

.NET Reactorを使用してDLLを混同すると、次のようなプロンプトが表示されます.
  OK! 次に、これを取り除きます.
Reflectorを開くと、.cctorごとに次のコードが追加されています(暗号化結果の名前が異なる場合があります).
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
    .maxstack 8
    L_0000: call void {B4838DC1-AC79-43d1-949F-41B518B904A8}::CS$0$0006()
    L_0005: ret 
}

明らかに,{B 4838 DC 1-AC 79-43 d 1-949 F-41 B 518 B 904 A 8}タイプは.NET Reactorが注入し,順藤が瓜を触ってCS$0$0006()に入る.
.method assembly hidebysig static void CS$0$0006() cil managed
{
    .maxstack 8
    L_0000: br L_0007
    L_0005: pop 
    L_0006: ldc.i4.0 
    L_0007: ldsfld bool {B4838DC1-AC79-43d1-949F-41B518B904A8}::CS$0$0004
    L_000c: brtrue.s L_002f
    L_000e: ldc.i4.1 
    L_000f: stsfld bool {B4838DC1-AC79-43d1-949F-41B518B904A8}::CS$0$0004
    L_0014: ldstr "This assembly is protected by an unregistered version of \".NET Reactor\". Copyright @ Eziriz, www.eziriz.com"
    L_0019: ldstr "Lock System"
    L_001e: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult 
    [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string, string)
    L_0023: pop 
    L_0024: leave L_002f
    L_0029: pop 
    L_002a: leave L_002f
    L_002f: ret 
    .try L_0014 to L_0029 catch object handler L_0029 to L_002f
}

その文字列は私たちの指名手配目標の特徴に合っていますが、次はどうしますか?もちろんこの方法の内部コードを削除しました.(よろしければ、すべての.cctorの行コードをバッチに置き換えることもできます)
d:\temp> ildasm test.dll /out=test.il
Protected module -- cannot disassemble

申し訳ありませんが、Suppress ILDASMは最も基本的な手段です.ILDASM.exeを交換します(この修正バージョンは、SuppressIldasmAttributeの特性制限を除いて、ネット上で入手できます).
d:\temp> d:\program\tools\ILDasm\ILDasm.exe test.dll /out=test.il
// WARNING: Created Win32 resource file test.res

エディタを開き、CS$0$0006を検索し、メソッドボディを削除してretのみを保持します.(publickeyがある場合は削除に注意)
.method assembly hidebysig static void CS$0$0006() cil managed
{
    .maxstack 8
    ret 
}

このILコードを保存し、再コンパイルします(Public Keyがある場合は、/key=...).
d:\temp> ilasm /dll test.il /out=test2.dll

...
Emitting fields and methods:
Global  Methods: 1;
Class 1 Fields: 4;      Methods: 8;
Class 2 Methods: 3;
Class 3 Methods: 3;
Resolving local member refs: 9 -> 9 defs, 0 refs, 0 unresolved

Emitting events and properties:
Global
Class 1
Class 2
Class 3
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved
Writing PE file
Signing file with strong name
Operation completed successfully

このtest 2.dllを試してみましょう.あの嫌なダイアログボックスはもう消えて、なくなりました.
終わったの?待って...
MyClass 2にプライベートメソッドを追加します.
namespace MyLibrary.Test
{
    public class MyClass2
    {
        public void TestXXX()
        {
            Test2();
        }

        private void Test2()
        {
            Console.WriteLine("MyClass2 Private Test...");
        }
    }
}

.NET Reactorで混同すると、上に書いてある{B 4838 DC 1-AC 79-43 d 1-949 F-41 B 518 B 904 A 8}がなくなったことに気づくかもしれません..cctorには追加のコードが注入されていません.違うのは、下のように名前の変なやつが現れたことだ.
.namespace AKEtMeX)o
{
    .class private auto ansi beforefieldinit AAxshPnXX
        extends [mscorlib]System.Object
    {
        .method private hidebysig specialname rtspecialname static void .cctor() cil managed
        {
        }

        .method assembly hidebysig static pinvokeimpl("nr_native_lib.dll" as "nr_nli" ansi winapi) bool AAxshPnXX(string marshal(bstr), int32) cil managed preservesig
        {
        }

        .method assembly hidebysig static pinvokeimpl("Learn.Library_nat.dll" as "nr_nli" ansi winapi) bool ABy2LSAxY(string marshal(bstr), int32) cil managed preservesig
        {
        }

        .method assembly hidebysig static pinvokeimpl("Learn.Library_nat.dll" as "nr_startup" ansi winapi) void ACiuCWtbY(string marshal(bstr)) cil managed preservesig
        {
        }

        .method assembly hidebysig static void ADxAfYIbq() cil managed
        {
        }

        .method assembly hidebysig static void AER(Ib2WO(bool) cil managed
        {
        }

        .method assembly hidebysig static string AFxcDdVK8(string) cil managed
        {
        }

        .method assembly hidebysig static string AGEdqxnDQ(string) cil managed
        {
        }

        .method assembly hidebysig static void AHrgRGDAh() cil managed
        {
        }

        .method assembly hidebysig static int32 AI0mY6Kel() cil managed
        {
        }

        .method assembly hidebysig static object AJM2IfMnl() cil managed
        {
        }

        .method assembly hidebysig static void AKEtMeX)o() cil managed
        {
        }

        .method assembly hidebysig static void ALJw(16JK() cil managed
        {
        }

        .field private static bool AAxshPnXX

        .field private static bool ABy2LSAxY

        .field private static bool ACiuCWtbY

        .field private static bool ADxAfYIbq

    }
}

私たちはその内部方法をめくって、明らかに次が私たちが修正する目標です.
.method assembly hidebysig static void AHrgRGDAh() cil managed
{
    .maxstack 4
    L_0000: br L_0007
    L_0005: pop 
    L_0006: ldc.i4.0 
    L_0007: ldsfld bool AKEtMeX)o.AAxshPnXX::AAxshPnXX
    L_000c: brtrue.s L_002f
    L_000e: ldc.i4.1 
    L_000f: stsfld bool AKEtMeX)o.AAxshPnXX::AAxshPnXX
    L_0014: ldstr ""
    L_0019: ldstr "Lock System"
    L_001e: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult 
    [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string, string)
    L_0023: pop 
    L_0024: leave L_002f
    L_0029: pop 
    L_002a: leave L_002f
    L_002f: ret 
    .try L_0014 to L_0029 catch object handler L_0029 to L_002f
}

後でどうするかについては、私が言う必要はありません.(実はこの例では、このメソッドはまったく呼び出されていません.つまり、ポップアップボックスは現れません......)
-------------------------------
附:EXEを暗号化したいなら、おとなしく脱殻して修復してから...