使用を登録しない.NET Reactor
from: www.cnblogs.com/aidd2008/archive/2012/01/15/2323093.html
.NET Reactorはいいものですが、こいつはアップグレードが非常に速く、暗号化アルゴリズムが常に変化し、ますますひどくなって、本当に「ついて行く」のがおっくうです.このようなツールは通常、JIT Hookやnative loaderなど、「シェル」上で多くの仕事をしています.私は通常、その混同機能しか使用しないので、別の方法で「迂回」して、登録しなくても最新バージョンを使用することができます.
まず,.NET Reactor混同後の制約を解析するための簡単なDLLを用意した.test.dll
.NET Reactorを使用してDLLを混同すると、次のようなプロンプトが表示されます.
OK! 次に、これを取り除きます.
Reflectorを開くと、.cctorごとに次のコードが追加されています(暗号化結果の名前が異なる場合があります).
明らかに,{B 4838 DC 1-AC 79-43 d 1-949 F-41 B 518 B 904 A 8}タイプは.NET Reactorが注入し,順藤が瓜を触ってCS$0$0006()に入る.
その文字列は私たちの指名手配目標の特徴に合っていますが、次はどうしますか?もちろんこの方法の内部コードを削除しました.(よろしければ、すべての.cctorの行コードをバッチに置き換えることもできます)
申し訳ありませんが、Suppress ILDASMは最も基本的な手段です.ILDASM.exeを交換します(この修正バージョンは、SuppressIldasmAttributeの特性制限を除いて、ネット上で入手できます).
エディタを開き、CS$0$0006を検索し、メソッドボディを削除してretのみを保持します.(publickeyがある場合は削除に注意)
このILコードを保存し、再コンパイルします(Public Keyがある場合は、/key=...).
このtest 2.dllを試してみましょう.あの嫌なダイアログボックスはもう消えて、なくなりました.
終わったの?待って...
MyClass 2にプライベートメソッドを追加します.
.NET Reactorで混同すると、上に書いてある{B 4838 DC 1-AC 79-43 d 1-949 F-41 B 518 B 904 A 8}がなくなったことに気づくかもしれません..cctorには追加のコードが注入されていません.違うのは、下のように名前の変なやつが現れたことだ.
私たちはその内部方法をめくって、明らかに次が私たちが修正する目標です.
後でどうするかについては、私が言う必要はありません.(実はこの例では、このメソッドはまったく呼び出されていません.つまり、ポップアップボックスは現れません......)
-------------------------------
附:EXEを暗号化したいなら、おとなしく脱殻して修復してから...
.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を暗号化したいなら、おとなしく脱殻して修復してから...