`

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

阅读更多
原帖地址:http://www.cnblogs.com/JamesLi2015/archive/2013/06/06/3120490.html

使用.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>





<style type="text/css"><br/><br/><br/><br/>.csharpcode, .csharpcode pre<br/>{<br/>font-size: small;<br/>color: black;<br/>font-family: consolas, "Courier New", courier, monospace;<br/>background-color: #ffffff;<br/>/*white-space: pre;*/<br/>}<br/>.csharpcode pre { margin: 0em; }<br/>.csharpcode .rem { color: #008000; }<br/>.csharpcode .kwrd { color: #0000ff; }<br/>.csharpcode .str { color: #006080; }<br/>.csharpcode .op { color: #0000c0; }<br/>.csharpcode .preproc { color: #cc6633; }<br/>.csharpcode .asp { background-color: #ffff00; }<br/>.csharpcode .html { color: #800000; }<br/>.csharpcode .attr { color: #ff0000; }<br/>.csharpcode .alt <br/>{<br/>background-color: #f4f4f4;<br/>width: 100%;<br/>margin: 0em;<br/>}<br/>.csharpcode .lnum { color: #606060; }</style>

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程序员简历模板

    对于.NET程序员来说,这部分还应包含你的编程语言熟练程度、数据库管理能力(如SQL Server)、软件开发生命周期的理解,以及对敏捷开发方法的熟悉程度。 在压缩包子文件的文件名称列表中,"标准简历模板.doc"和...

    .net程序员面试指南

    《.NET程序员面试指南》是一本专为准备.NET程序员面试者设计的实用参考资料,旨在帮助求职者更好地理解和应对面试中的各种技术问题。该指南涵盖了.NET框架的基础知识、C#编程语言、ASP.NET web开发、数据库交互、...

    FastReport.NET 程序员手册2023(中文版)

    《FastReport.NET 程序员手册2023(中文版)》是针对.NET开发者设计的一款详尽的报表开发指南。FastReport是一款强大的报表解决方案,它为.NET Framework和.NET Core提供了全面的报告生成和设计功能。这款工具以其...

    C#与.NET程序员面试宝典

    《C#与.NET程序员面试宝典》取材于各大IT公司的历年面试题252个(包括研发类笔试及口试题目、情商及智商类题目),详细分析了应聘C#与.NET程序员职位的常见考点。《C#与.NET程序员面试宝典》主要内容包括:面试流程...

    .NET程序员面试指南2

    .NET程序员面试指南2 .NET程序员面试指南2 .NET程序员面试指南2

    ASP.NET程序员职业规划

    在积累了几年的工作经验后,ASP.NET程序员可能需要考虑职业发展方向。可以选择成为资深开发者,专注于技术深度,研究更高级的技术,如微服务、容器化(Docker)、Kubernetes等,或者转向架构师的角色,负责设计和...

    .NET程序员面试指南1.pdf

    这是.NET程序员面试指南1 .NET程序员面试指南2=http://download.csdn.net/source/1597090

    .net程序员简历模板

    .NET 程序员简历模板是目前软件行业中最为流行的技术栈之一,以 Microsoft 的 .NET Framework 为基础,提供了强大的应用程序开发平台。以下是该模板中所涉及到的知识点: 1. .NET Framework:.NET Framework 是 ...

    《.net程序员面试指南》 第6章源代码

    理解程序集的概念,包括私有和公有程序集,以及如何使用`Assembly`类进行操作,对于模块化开发和程序部署至关重要。 9. 多次申明同一特性:在.NET中,同一种特性可以在同一元素上声明多次,这在需要传递多个参数或...

    .net程序员面试题

    收集了很多师兄师姐出去就业后,收集回来的企业面试.net程序员的面试题啊!不容易啊!1-8份面试题,好好看啊!都是技术题,祝面试上自己喜欢的职业

    认证培训之一:微软.NET程序员高级培训教程系列资料

    本资源主要面向微软.NET程序员,旨在提供高级培训教程系列资料,涵盖从软件构架的基础知识到企业级应用程序的构架、.NET软件构架的基础知识、Teamwork与Bug Tracking概念工具与实践等多个方面的知识点。 Session 1...

    .net程序员总结一些编程的技术

    综上所述,.NET程序员需要掌握的技能广泛,包括服务器端的ASP.NET,客户端的JavaScript和jQuery,数据库管理的SQL Server,以及各种编程实践和第三方库的使用。通过不断学习和实践,可以提升个人在.NET领域的专业...

    .net程序员面试宝典.pdf

    2011年.net程序员面试宝典.pdf

    .net 面试题(.net程序员面试必看)

    .NET是微软推出的一种开发平台,主要用于构建Web应用、桌面应用和服务。对于.NET程序员来说,面试时可能会遇到各种技术问题,涵盖语言基础、框架理解、设计模式、并发处理、数据库交互等多个方面。以下是一些可能在...

    .NET程序员_2008最新

    对于.NET程序员来说,熟练掌握MVC模式可以帮助他们更有效地开发复杂的Web应用程序。 ### 结论 综上所述,作为一名.NET程序员,不仅需要熟悉.NET框架的基础知识,还需要深入理解ASP.NET、C#编程语言、数据库操作...

    ASP.NET程序员面试题及答案

    在IT行业,尤其是软件开发领域,ASP.NET作为一款流行的服务器端Web应用程序框架,备受程序员们的青睐。对于求职者而言,掌握ASP.NET及其相关的C#编程语言知识点至关重要。本篇文章将针对“ASP.NET程序员面试题及答案...

    .net程序员成长中书籍的推荐

    ### .NET程序员成长之路:精选30本书籍推荐 在IT行业中,持续学习与技能提升是保持竞争力的关键。本文将围绕HTML(Web的基础)、JavaScript(让网页动起来)、C#(程序开发)以及数据库管理这四个方向,推荐一系列...

    初级ASP.NET程序员应聘时几个常问的问题几答案

    数据展示控件是ASP.NET开发中的重要组成部分,常见的几种数据展示控件包括GridView、ListView、DataList和Repeater。GridView是最常用的数据展示控件,它提供了丰富的内置功能,如排序、分页和编辑,但灵活性较低。...

Global site tag (gtag.js) - Google Analytics