.NET DLL 保护措施详解(五)常规条件下的破解

  为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密算法的密钥及数据库字符串。

  反编译:

  我这里使用了.net dll反编译工具ILSpy,以下为真实截图。

  1. NetProtect.BLLDemo.dll

  

  2. NetProtect.ConsoleApplication1.exe

  

  3. NetProtect.CoreClr.dll

  

  

  

综合上图,可以发现,反编译是没有得到有效信息的(AES密钥及数据库密钥),实现了”不能看“的目的。

       反射:

首先我准备了以下测试代码,新建一个控制台应用程序,并在Program.cs中加入如下代码:

Console.WriteLine("DLL保护之WinForm演示");
Console.WriteLine("------------------------------------------------------");

var a = Assembly.LoadFile(Path.Combine(Application.StartupPath, "NetProtect.CoreClr.dll"));

object dalobj = a.CreateInstance("NetProtectCoreClr");
Type t = a.GetType("NetProtectCoreClr", false, true);

var dal = t.GetField("dalClassObj").GetValue(dalobj).GetType();

object coreAssmbly = dal.Assembly.CreateInstance("Core");
Type t1 = dal.Assembly.GetType("Core", false, true);

MethodInfo method = t1.GetMethod("GetDataBasePassword");
var result = method.Invoke(coreAssmbly, null);
Console.WriteLine("获取密码:" + result);

FieldInfo[] fieldArray = t1.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

foreach (var f in fieldArray)
{
    Console.WriteLine(string.Format("{0}:{1}", f.Name, f.GetValue(coreAssmbly).ToString()));
}

Console.ReadKey();

然后生成项目,运行EXE,得到下图:

  

  可以看到,程序发生了异常(this caller is unauthorized(0x11111111),此异常是保护措施验证调用者身份未通过抛出(在实际情况中,反编译了相应的EXE及DLL重新生成或者通过当前演示的直接反射都会验证不通过)),说明核心代码里面的保护措施起到了有效作用。实现了非合法身份者”不能调”的目的。

  通过以上两方面的验证,可以得出结论,此思路提升了在常规条件下的保护层次。

.net dll保护系列

--------------------------------------------------------------------------------------------

.NET DLL 保护措施详解(一)(非混淆加密加壳)

.NET DLL 保护措施详解(二)关于性能的测试

.NET DLL 保护措施详解(三)最终效果

.NET DLL 保护措施详解(四)各操作系统运行情况

.NET DLL 保护措施详解(五)常规条件下的破解

时间: 2024-10-13 20:42:25

.NET DLL 保护措施详解(五)常规条件下的破解的相关文章

.NET DLL 保护措施详解(三)最终效果

针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后运行NetProtect.ConsoleApplication1.exe即可查看运行结果 NetProtect.CoreClr.dll库库提供了加密.解密.获取一段密钥的功能封装且指定了只能由NetProtect.ConsoleApplication1.exe及NetProtect.BLLDemo.

.NET DLL 保护措施详解(非混淆加密加壳)

为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素. 首先,我来介绍一下发布出去的DLL所面临的风险: 一.直接引用 二.反编译 三.反射 如果DLL一点措施都不做的话,上面任意一种都可以达到破解目的的. 然后,通常网上能搜到如下的保护方式,但真心的来说,用处不大,当然对小白破解者增加了难度. 一.混淆类的工具(如Dotfuscator,但是可以通过ILSpy.Reflector等反编译哦,直接COPY代码也能运行) 二.加密类的工具

转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模式. 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵扯出更多让我困惑的问题. 为了将这些困惑一网打尽,我花了一下午加一晚上的时间查阅了大量资料,并做了一番实验后,终于把这些困惑全都搞得清清楚楚了. 说实话,之所以花了这么

一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp] view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDelegate> { UITe

保护模式详解

在ia32下,cpu有两种工作模式:实模式和保护模式. 在实模式下,16位的寄存器用"段+偏移"的方法计算有效地址. 段寄存器始终是16位的.在实模式下,段值xxxxh表示的以xxxx0h开始的一段内存.但在保护模式下,段寄存器的值变成了一个索引(还有附加信息)这个索引指向了一个数据结构的表(gdt/ldt)项,表项(描述符)中详细定义了段的其实地址.界限.属性等内容. 保护模式需要理解:描述符,选择子 描述符包括,存储段描述符(代码段,数据段,堆栈段),系统描述符(任务状态段TSS,

Android基础入门教程——8.3.8 Paint API之—— Xfermode与PorterDuff详解(五)

Android基础入门教程--8.3.8 Paint API之-- Xfermode与PorterDuff详解(五) 标签(空格分隔): Android基础入门教程 本节引言: 好的,上一节中,我们又写了一个关于Xfermode图片混排的例子--擦美女衣服的Demo,加上前面的 利用Xfermode来实现圆角或圆形ImageView,相信大家对Xfermode已经不再像以前那么陌生了,或者 说有点熟悉了,嗯,本节我们来写Xfermode的最后一个例子,通过Xfermode的ProterDuff.

Kafka详解五、Kafka Consumer的底层API- SimpleConsumer

Kafka提供了两套API给Consumer The high-level Consumer API The SimpleConsumer API 第一种高度抽象的Consumer API,它使用起来简单.方便,但是对于某些特殊的需求我们可能要用到第二种更底层的API,那么先介绍下第二种API能够帮助我们做哪些事情 一个消息读取多次 在一个处理过程中只消费Partition其中的一部分消息 添加事务管理机制以保证消息被处理且仅被处理一次 使用SimpleConsumer有哪些弊端呢? 必须在程序

Animation动画详解(五)——ValueAnimator高级进阶(一)

前言:唯有脚踏实地,才能厚积薄发,未来只属于为梦想而奋斗的人们,今天的你决定未来的自己. 上一篇给大家介绍了ValueAnimator的大部分函数的用法,不过还都是些简单的用法,这篇我们带大家来看看有关加速器.animator和keyFrame的知识. 一.插值器 插值器,也叫加速器:有关插值器的知识,我在<Animation动画详解(二)--Interpolator插值器>中专门讲过,大家可以先看看这篇文章中各个加速器的效果.这里再讲一下什么是插值器.我们知道,我们通过ofInt(0,400

文件IO详解(五)---open函数详解

open函数用来在进程中打开文件,如果成功则返回一个文件描述符fd. ======================================================= 函数原型: 函数参数: pathname:打开文件的路径名 flags:用来控制打开文件的模式 mode:用来设置创建文件的权限(rwx).当flags中带有O_CREAT时才有效. 返回值: 调用成功时返回一个文件描述符fd 调用失败时返回-1,并修改errno ==========================