• .NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制


    .NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制

    使用.NET开发程序,因为元数据存在于程序集中,可以轻易的被反编译成源代码。在分发给客户之间,会应用加密软件混淆程序集,这样让程序集被反编译时,

    理解起来困难一些,增加一点破解难度。以下列举我常见到的几种保护方法,可应用于实际的产品保护。

    方法一  以Red Gate的SQL Toolbet为代表的 需要连接到服务器端进行验证

    Red Gate开发的SQL系列工具非常有名气,比如著名的SQL Prompt,可以在SQL Server Management Studio实现智能提示功能。每当有新的可用的版本

    出现(希望你可以理解我说的意思),它成为必收藏的工具之一。它的保护机制比较典型,客户下载并安装试用版软件,超过试用期限后,需要连接到

    服务器进行激活验证,否则退出程序。

    image

    这种情况下网络连接必须可用。然而由于种种原因,有些机器是不能连接到互联网上的,或是因为开发服务器,资料和数据比较宝贵,或是因为开发人员

    不允许上网,没有网络防问权限。这种情况下,它也提供了一种验证机制,可以将验证信息打包,通过邮件或是即时通讯软件发送到官方,

    获取一个类似于注册码的字符串,如下图所示

    image

    这两种方式配合起来,这种类型的验证保护机制就做的相对完善,也比较人性化。

    方法二 企业管理软件类 ERP 许可授权文件

    在企业管理软件中,经常要涉及软件许可(license)。无论是按站点收费(用友),还是按功能收费(金蝶),或是按用户用量收费, 这种方法的灵活性高。

    用户从官方网站或是CD盘中得到的是正式的安装程序文件,需要一个license文件才能激活进入系统。根据用户的实际购买情况,产生不同的license文件,

    在系统运行时,会检测文件是否有效,是否有授权,全部的秘密都在生成的这个license文件,以下面的license文件所示

    <?xml version="1.0" encoding="utf-16"?>
    <SolutionLicense xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <RegistrationName>Enterprise Solution Limited</RegistrationName>
      <Version>2.2</Version>
      <MaxUser>100</MaxUser>
      <MaxViewer>100</MaxViewer>
      <MaxDatabase>4</MaxDatabase>
      <WithHaspKey>false</WithHaspKey>
      <AllowInstallOnVirtualMachine>true</AllowInstallOnVirtualMachine>
      <IssuedDate>2013-05-27T15:55:15.3440758+08:00</IssuedDate>
      <ExpiryDate>2013-06-26T23:59:59.997</ExpiryDate>
      <LicenseType>Internal</LicenseType>  <HardwareFingerprint>+MV/ImkUxQV3RWDrD4rso4dplxmr5WHDDJ37WdwE09ogGhACKWjp+tWmDB5RVqfu/
    tqx5i1p15g7t5ChynBwR0UKxNaSb1WyG4kdt5etndm7wg45DWzDpIryKLCYVQ4SuE3ykmXTR8NgTsYriI0CCP1DC5YrCiGfbAjNJ8zwC5A=wfUHYiIpI2DQ/kSXyM6TMx
    0pCUWqa9V/UGukBPcAhafmeseTEBKeJ1Fdqwoie8QuV3Zy8GzGz9DX9d43QXYKMKpHzdLG6CL848a4MzRw1nmQ9s7i+kB/+AjPM+yaJGFp8EpxYROfjJoDgat+ES1KSimh
    t5VNB5AL2FY1QLwqoiOjk6q/ClCzsEB6ieLMHsS0HLmc=GQQTPgTgRuI4NsVLZ803HhUP+Lf/cG9OqtOreEWdMSRbuYIJKCyp8SDBygH7B+Omt1k3nEvpt3FUyMR+yyDNRql
    qhAH7/KtVcJwvrs9Ye7LywpwcGKSJcJot/jTKKagSFn20fYXjZROIpxfc8tsnxBXpkchYSrTMJb+93EnLOUg=ACvXKe/WfGEvjyrUIm+BVZty0NfxemFLeQDZtdQnsLnfjDcK
    FP3fhLY3dcYvDMJJmJx4cnYtp+8kabxxPr1M5i6qosEUULyIGb6kjyWjGQJ7M1/JEO8J5oZv/3PRLs307FO69WpIZ36O4Y=</HardwareFingerprint>
      <AdditionalInformations />
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC
    -xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><T
    ransform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://ww
    w.w3.org/2000/09/xmldsig#sha1" /><DigestValue>RUdHeihpzCcTda4kH9VPm/n7aBE=</DigestValue></Reference></SignedInfo><Sig
    natureValue>OHBWoz1WjG2D2Pfno9mSOuHg9oFRaSTYjw7w9oJh0NTtBYbMhb5CLwZz5WXXpfYsghnax4RfqoUt3edvYU2b1vu3//0YaQHkY+qbczrBiX
    3svfKB+DSSm+WZvyruucnTsTp39RKutcim+fhAt/wDA2Iarwdm1/ztPAhoOi+zzbA=</SignatureValue></Signature></SolutionLicense>
    
    
    

    license文件的格式是文本文件,以方便查看。上面的许可文件中,我给了100个用户,4 个帐套的权限。再运用SignedXml对文件内容进行签名,

    阻止篡改。此外,如果想限定用户,还可以加上机器标识(hardware fingerprint),如果检测到被收取的license文件,不在被授权的机器上运行,

    也会抛出异常,终止程序。

    还有一个许可生成工具,它的原型看起来像这样

    image

    再来说明一下,如何破解这种加密。首先,如果程序集有强签名(strong name),需要找一个工具,把它的签名去掉,其次,找到算法验证license.xml文件的地方,把它的public key替换成自己生成的public key,再写一个以private key生成的licnese生成工具,生成license文件,同时替换自己修改过的验证程序集文件,即可让程序验证成功

    上面所说的破解过程,是比较理想的情况。如果程序集有strong name,而且在程序集中有验证strong name是否存在,strong name是否匹配作者生成的public token,这种情况下,要生成一个strong name,替换作者生成的和已经写入到程序集中的public token。其次,要可以反编译程序集,著名的工具Red Gate Reflector, ILSpy,dotPeek,都可以做到反编译程序集。如果程序集有加壳,还应该去壳。

    方法三 序列号注册码

    经典的源代码编辑软件UltraEdit至今还保持这种保护方法。在首次运行时,需要输入注册码

    image

    一个用户名和注册码,可以让多台机器的试用版软件变成正式版。这个问题,在我们国家是普遍存在的。许可一般是Single PC 许可,而我们常常是只要来自于官方下载,又有官方的许可文件或是序列号,即把它当成正版,其实这种情况下,也非正版。仅仅是输入注册码,不需要连接到网络验证服务器,如果想进一步连接到服务器做验证,还需要网络连接。

    关于网络连接的额外话。Windows 自Windows 7开始,为了激活它,就必须要有网络连接可用。对于新买的机器,想装旧的Windows Server 2003,死活都找不到网卡驱动,无法连接到网络上去,无法激活,只好装最新的系统。有个小小的建议,如果你的机器是Windows 7以下的,可以考虑备份一下你手头的驱动程序,网卡,显卡,主板芯片组。这些驱动以后会越来越难找,厂家也直接拒绝提供旧系统的驱动(Windows 2003,XP),让你被迫无奈只能用Windows 7或是更新的系统。硬件制造设备厂商也是有预谋的逼迫你对旧机器改朝换代啊。

    方法四  license to license2 双重许可验证

    以著名的.NET加密软件.NET Reactor为代表,要通过它的许可验证需要两次许可文件。

    购买正版软件后,软件供应商会给出一个license.license 文件。打开dotNET_Reactor.exe,菜单->Help-》 Registeration ,在线获取另外一个License文件, 点击超链接进入官方网站:查收邮件,下载真正的License 
    打开dotNET_Reactor.exe,菜单->Help-Registeration ,注册,软件才成为正式用户。

    image

    回想一下这个注册过程,它会产生一个本机的硬件标识,把这个复制到网页中去才能激活软件,从而得知这个软件需要配合硬件,即使有序列号,许可文件,但是硬件标识不相同,也是无效的license文件。

    clip_image001

    硬件标识通常会写到license许可文件中,这是唯一可以动手脚,但又不会出问题的地方。硬件标识写注册表,可以被用户导出,再导入到其它机器上,硬件表示可以写到系统隐藏文件中,用户误删除会导致出错。

    方法五  微软批量激活工具

    以Office 2010为代表,它的批量激活工具主界面如下,控制台界面风格,小巧强悍

    image

    再比如杀毒软件卡巴斯基,对企业批量授权。也是实现批量生成许可的方式。

    这种授权方法的好处是,可以被命令行调用。在域管理的企业基础架构中,只需要域管理员修改一下域策略,在每台客户端登录域时,执行一个脚本文件即刻激活企业内所有的软件许可。

    我理解的这种加密方法,也是生成一个许可文件。因为Office系列软件太流行了,可以很轻松的找到可用的版本。很少会被他的许可难住,不过这种产生许可的方式,值得学习和研究。

     

     

     

     

     

    分类: .NET Solution

  • 相关阅读:
    从.Net迁移到.Net Core时,需要注意的兼容性变更
    P/Invoke各种总结(五、在C#中使用指针类型)
    P/Invoke各种总结(四、平台调用时的数据类型对应)
    解决Visual Studio 2017/2019 "const char *"类型的值不能用于初始化"char *"类型的实体的问题
    .Net Framework、.Net Core和.Net Standard的区别
    C#代码分析工具Style Cop使用
    《代码不朽:编写可维护软件的10大要则(C#版)》读书笔记
    Visual C++中宽字节与多字节字符互相转换的方法
    浮动和定位
    关于如何设置图片大小和图片形状
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3120713.html
Copyright © 2020-2023  润新知