不注册使用 .NET Reactor

简介:

.NET Reactor 是个好东西,只不过这家伙升级的速度非常快,加密算法经常变化,而且越来越厉害,实在懒得 "跟" 了。这类工具通常在 "壳" 上做了大量的工作,诸如什么 JIT Hook、native loader 之类的。而我通常只使用它的混淆功能,所以用另外一种方法 "绕" 过去,即便不注册,也可以使用最新版本。

  首先,我们准备一个简单一点的 DLL,用于分析 .NET Reactor 混淆后的限制。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 <PrivateImplementationDetails>{B4838DC1-AC79-43d1-949F-41B518B904A8}::CS$0$0006()
    L_0005: ret 
}

  很显然,<PrivateImplementationDetails>{B4838DC1-AC79-43d1-949F-41B518B904A8} 类型是 .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 <PrivateImplementationDetails>{B4838DC1-AC79-43d1-949F-41B518B904A8}::CS$0$0004
    L_000c: brtrue.s L_002f
    L_000e: ldc.i4.1 
    L_000f: stsfld bool <PrivateImplementationDetails>{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

  我们试试这个 test2.dll,那个讨厌的对话框已经消失了,不见了……

  结束了?等等……

  我们给 MyClass2 添加一个私有方法。

namespace MyLibrary.Test
{
    public class MyClass2
    {
        public void TestXXX()
        {
            Test2();
        }

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

  用 .NET Reactor 混淆后,可能你会发现上面写的那个 <PrivateImplementationDetails>{B4838DC1-AC79-43d1-949F-41B518B904A8} 不见了,.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,那么还是老老实实进行脱壳,然后修复,再然后……










本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1174565,如需转载请自行联系原作者
目录
相关文章
|
存储 安全 .NET
ASP.NET Core Identity 实战(2)——注册、登录、Claim
上一篇文章(ASP.NET Core Identity Hands On(1)——Identity 初次体验)中,我们初识了Identity,并且详细分析了AspNetUsers用户存储表,这篇我们将一起学习Identity 默认生成的样板代码的注册与登陆过程 注册/Register 打开Accou...
2539 0
|
4月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
95 5
|
JSON API 数据格式
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
1608 1
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
.Net Reactor 5脱壳教程
原文:.Net Reactor 5脱壳教程 今天别人发来一个.Net的DLL让我脱壳,第一步自然是先扔进de4dot 我这个de4dot 是集成了  Ivancito0z / TheProxy / PC-RET 4.9mod / wuhensoft(5.0) 各大神修改的版本,无法脱壳,肯定就是新的reactor 5加的壳了。
2854 0
|
Web App开发 前端开发 .NET
ASP.NET Core 一步步搭建个人网站(2)_一键部署和用户注册登录
俗话说,磨刀不费砍柴工。为了更方便的进行项目管理,我们先将个人网站项目配置一下,满足以下2个目标: VS2017中支持Git存储库,绑定Github项目,实现本地VS程序与线上Github一键代码提交和同步; 搭建服务器FTP站点,VS2017中配置一键部署网站文件到服务器; 有了以上的配置,我们可以不用每次拉取和同步我们的程序到Github中,也不用每次在本地发布,拷贝服务器,我们只用在VS2017中简单的一键同步到Github或网站服务器。
1642 0
|
网络协议 API 微服务
.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)
重温Consul最少化集群的搭建     我们再复习一下上一篇的内容,先建立三台consul server节点,两个consul client节点,分别在每个节点上跑不同(名称不同而已)的实例。
2007 0
|
网络协议 前端开发 .NET
.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一)
Consul介绍   Consul是HashiCorp公司推出的开源工具[开源地址:https://github.com/hashicorp/consul],用于实现分布式系统的服务发现与配置。     与市面上其他系统比较如下:     总体而言, Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
3361 0
|
.NET 开发框架 C#
ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建了用户表,现在,磨拳擦掌,是时候把注册功能给完善了。
2128 0
|
C# 数据安全/隐私保护
.net reactor 学习系列(一)---.net reactor介绍
原文:.net reactor 学习系列(一)---.net reactor介绍       学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF),不断地让我更深入地了解了.net平台的应用场景。
1271 0
.net reactor 学习系列(四)---.net reactor应用场景
原文:.net reactor 学习系列(四)---.net reactor应用场景         前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景。
846 0