应用Strong Name保存.NET应用程序集
关于Strong Name的主题,网上已经有很多这方面的介绍,你可能最熟悉的印象就是这样

大部分的情况,这样就可以了。如果代码是机密的,还可能用到Delay sign only,这就复杂一些,请查找相关资料。
如果就这么做了,代码中没有什么处理,可能你的程序还不够安全,因为有个Strong Name Remover可以很容易的清除你的签名,它运行起来是这样的

如果你不想让你的程序被这个小程序折磨,那你应该看一下这篇文章。
仅仅有签名还不够,你还需要在你的程序集中检测签名,而且检测到的签名只能是我自己的名字。
请到Visual Studio Tools中找到命令行,启动它,并执行sn –Tp Application,如下图所示

它显示出了public key token,把这个记下来,稍后我的程序中要用到。再来写检测签名的代码,代码如下所示
public static void PreInitCoreSetup()
{
//check singature
bool pfWasVerified = false; string fcommon = "Flextronics.Framework.Common.dll";
bool licensed = StrongNameSignatureVerificationEx(fcommon, true, ref pfWasVerified);
if (!licensed)
throw new FatalException(Shared.LicenseExceptionError);
}
看这几句话,它检测传入应用程序集是否有签名,也就是否有strong name,如果没有则会抛出异常。这里用到了Native method,它的签名如下所示
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
private static extern bool StrongNameSignatureVerificationEx(
string filePath,
bool forceVerification,
ref bool wasVerified
);
继续看代码,我们不仅仅要保证程序集有签名,而且要有我自己的签名。请看下面的程序片段
public static void EnsureAssemblyIsSigned(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly"); byte[] pubkey = assembly.GetName().GetPublicKeyToken();
if (pubkey.Length == 0)
throw new ArgumentException("No public key token in assembly."); StringBuilder builder = new StringBuilder();
foreach (byte b in pubkey)
{
builder.AppendFormat("{0:x2}", b);
}
string pkString = builder.ToString(); if(pkString != Shared.PublickKey)
{
throw new FatalException(Shared.LicenseExceptionError);
}
}
这几句话的意思,是获取程序集的签名,与我们自己的签名是否相符合,如果是则验证通过,否则立即终止程序执行。
最后一句中的Shared.PublickKey,就是上面图中sn中最后一行显示的d1063c1538fcc2c8。
启动程序调试,在Visual Studio中看到,它显示的publick key与我们用sn工具看到的是一样的。

有了这两步,不仅仅实现了验证程序集有签名,而且要有自己的签名。为什么要这样做呢,因为strong name可以被替换掉,在破解程序中,经常会用到替换strong name,比如这个程序,它可以实现替换程序集的strong name

如图所示,选择指定的程序集,再指定一个key,它就可以实现strong name的替换。自己辛苦写的程序,那么轻松的就被人破解了,你肯定很不舒服,那就请使用这篇文章中介绍给你技术,应用strong name来保护你的程序集。
软件破解与保护,矛与盾的斗争,希望本文能给你带来帮助。
请到epn.codeplex.com(http://epn.codeplex.com/releases/view/68647)中下载最新版的Data Loader。
应用Strong Name保存.NET应用程序集的更多相关文章
- 强名称程序集(strong name assembly)——为程序集赋予强名称
,唯一标识一个程序集 2,放置程序集被仿冒和被篡改. 3,能够部署到全局程序集缓存(GAC:GlobalAssembly Cache)中:在将强名称程序集不熟在GAC其中以后,强名称程序集也能够称为共 ...
- C#程序集使用强名字(Strong Name)签名/强名称签名
强名称签名的方法: 强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的 ...
- CLR 关于强命名程序集 .
如何创建强命名程序集(Strong Name Assembly) 创建一个强命名程序集首先需要获得一个用强命名实用工具 (Strong Name Utility,即SN.exe,.NET ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- 大型.NET商业软件代码保护技术 技术与实践相结合保护辛苦创造的劳动成果
列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...
- [转载].NET商业软件源码保护
列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...
- 解析大型.NET ERP系统 自动更新
C/S架构的应用程序需要支持自动更新功能,当新版本程序发布后,正在运行的客户端能检测到新版本的程序,通知用户是否下载更新.工作以来参与过几个自动更新模块的设计与维护,撰文总结自动更新模块设计与实现. ...
- const,readonly 这些你真的懂吗? 也许会被面试到哦。。。
首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看ms ...
- iOS CoreData学习资料 和 问题
这里是另一篇好文章 http://blog.csdn.net/kesalin/article/details/6739319 这里是另一篇 http://hxsdit.com/1622 (不一定能访问 ...
随机推荐
- 【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌
<ignore_js_op> 软件名称:神行者(破解)软件版本:v1.3.0001授权类别:免费测试机型:大可乐手机 下载链接: http://pan.baidu.com/s/1qWwSM ...
- [转帖]HTML5 Audio/Video 标签,属性,方法,事件汇总
HTML5 Audio/Video 标签,属性,方法,事件汇总 <audio>标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 co ...
- GCT之数学公式(三角函数)
- Google语音识别API 使用方法
官方位置:https://cloud.google.com/speech/
- 解决计算机改名无法连接TFS的问题
闲着没事改了下计算机名字,结果造成TFS无法连接. 报错讯息如下: ---------------------------Microsoft Visual Studio---------------- ...
- 配置nginx.config 报错:connect() failed (111: Connection refused) while connecting to upstream解决
php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 查看: netstat -ant | grep 9000 执行 /usr/local/php/s ...
- js中判断浏览器版本
var ai = { ovb: { /** * 该对象用于判断系统,系统版本,浏览器,苹果设备等等功能.ovb是单词 Os Version Browser 的头字母缩写. */ _version_va ...
- ASCII码与16进制的互相转换(表)
所谓的ASCII和16进制都只是概念上的东西,在计算机中通通是二进制 转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样ASCII是针对字符的编码,几乎是键盘上的字符的编码 ...
- MS Chart Control 學習手記(二) - 圓餅圖
using System.Web.UI.DataVisualization.Charting; 02 using System.Drawing; 03 04 namespace Chart.AJA ...
- JS三种简单排序算法
冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快 //js利用systemSort进行排序 systemSort: ...