让c#的exe只要被修改就无法运行,支持混淆和数字证书

原文:让c#的exe只要被修改就无法运行,支持混淆和数字证书

首先用sdk的sn工具或者makecert工具生成公钥和密钥,推荐makecert,做自己的证书,我做了一个受信任的根证书放在受信任的根证书颁发机构,用这个根证书颁发了一个下级证书放在个认证书里。把这两个证书都保存起来,平时给程序签名就用这个子证书就行了。以后都用这一个,显得正规点。

 

 

程序里工程属性-签名把那clickonce和程序清单签名都选上,时间戳用这个http://timestamp.wosign.com/timestamp

2个都从文件选择,这里用刚才子证书的那个带密钥的pfx,需要填入密码。

 

这样编译后不能防篡改,因为微软有个跳过机制,这样只有生成dll放到gac才会检查强名称是否匹配,而一个单独的exe是没用的,修改里面一点东西后还是可以执行。微软说可以在app.config里加入一条强制检查,那样是行了只要修改exe就没法执行,但是只有exe一直带着那个app.config放在同一目录才行,如果单独把exe拿出来就不行了。

 

怎么把那句话弄到exe里呢,我费了半天劲,终于想到了一个办法,平时只注意功能实现了,没想到.net里的安全机制这么复杂。

此方法无论是console的还是winform的,无论2.0 3.0 3.5 4.0通用。

如果是console程序,在Main的下面加入

 

System.Security.Policy.Evidence evi = new System.Security.Policy.Evidence();
evi.AddHost(new System.Security.Policy.Zone(System.Security.SecurityZone.Intranet));
System.Security.PermissionSet ps = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None);
ps.AddPermission(new System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityPermissionFlag.Assertion | System.Security.Permissions.SecurityPermissionFlag.Execution | System.Security.Permissions.SecurityPermissionFlag.BindingRedirects));
ps.AddPermission(new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted));
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = System.IO.Directory.GetCurrentDirectory();
AppDomain app = AppDomain.CreateDomain("JiaoYanShiFouGaiDongGuo", evi, ads, ps, null);
try
{
string JiaoYanShiFouGaiDongGuo = (string)app.CreateInstanceFromAndUnwrap(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, typeof(string).FullName);
AppDomain.Unload(app);
}
catch (Exception e)
{
AppDomain.Unload(app);
if (e.Message.Contains("8013141A") || e.Message.Contains("8013141a"))
{
Console.WriteLine("本程序被修改过不允许执行。");
System.Threading.Thread.Sleep(6000);
return;
}

 

 如果是winform程序,在Main的下面加入

  System.Security.Policy.Evidence evi = new System.Security.Policy.Evidence();
evi.AddHost(new System.Security.Policy.Zone(System.Security.SecurityZone.Intranet));
System.Security.PermissionSet ps = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None);
ps.AddPermission(new System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityPermissionFlag.Assertion | System.Security.Permissions.SecurityPermissionFlag.Execution | System.Security.Permissions.SecurityPermissionFlag.BindingRedirects));
ps.AddPermission(new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted));
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = System.IO.Directory.GetCurrentDirectory();
AppDomain app = AppDomain.CreateDomain("JiaoYanShiFouGaiDongGuo", evi, ads, ps, null);
try
{
string JiaoYanShiFouGaiDongGuo = (string)app.CreateInstanceFromAndUnwrap(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, typeof(string).FullName);
AppDomain.Unload(app);
}
catch (Exception e)
{
AppDomain.Unload(app);
if (e.Message.Contains("8013141A") || e.Message.Contains("8013141a"))
{
System.Windows.Forms.MessageBox.Show("本程序被修改过不允许执行。", "危险!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Stop, System.Windows.Forms.MessageBoxDefaultButton.Button1, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false);
return;
}
}

 

原理是在桌面程序的zone是mycomputer,是完全信任的,所以就有一个强名称跳过,这些代码是建一个Intranet的appdomain,不是完全信任的,所以就会检查强名称,这个appdomain是空的,目的不是为了执行里面的内容而是为了让.net去检查强名称,什么时候执行到这些代码什么时候就会出错,所以要放到main下面第一句,如果通过检查不会影响后面的正常代码。在.net4中上面代码可以更简单,有个沙盒GetStandardSandbox,但是2和3中没有,就不通用了,而这样无论234都通用,所以4会报某些方法过时,不去管它。

 

 

然后编译就行了,这样就不用拖家带口的带着app.config了,只要修改一点就不能执行了,会出现“已修改不允许执行”的提示,然后程序会自动关闭。

 

 

这样还不行,反编译很容易就去掉了,需要混淆。

 

直接把这个exe混淆,双击没法执行吧。别急。

 

用sn.exe再用刚才那个子证书pfx把这个混淆过的exe再次签名就可以执行了,好了,这样exe不但混淆了,而且被加上了强名称签名,只要修改1个字节就不能运行了。sn -R是重新签名。

 

继续,加上数字签名,signtool工具,还是用刚才那个子证书,这样右键就可以看到这样了。

 

 

这样这个程序只要修改一点,那么不但不能执行,而且右键看数字证书,也通不过,是这样的

 

 

而且exe还是混淆过的,嘿嘿嘿,大功告成。

 

 

当然自己用makecert做的证书在自己的机器上,显示“数字签名正常”,但是别人的机器上没有你的证书,会显示无法验证此证书之类的,但是还是会校验,就是说如果把这个exe改了,那么就会显示”数字签名无效“而不是”无法验证证书“,所以凭这一点也可以验证是否被篡改过,但是其实用不着了,这个只是好看用的,因为刚才说了,只要修改连运行都不能运行了。

 

如果用的人多了,可以让用户把你的证书导入他的证书库或者去买个真正的证书,那样就不会出那个红叉号了。

时间: 2024-12-26 01:26:59

让c#的exe只要被修改就无法运行,支持混淆和数字证书的相关文章

中关村win7系统下获取exe文件的修改权限的方法

  1.首先到网上下载获取文件权限的注册表文件,解压后得到安装"获取文件权限".reg 和 卸载"获取文件权限".reg 两个文件; 2.然后双击安装"获取文件权限".reg ,这样即可完成注册表的修改; 3.接着鼠标右键单击C盘的Windows文件夹,在菜单中找到"获取文件权限"选项,然后稍等一会就完成了对explorer.exe文件的修改了. ps:直接在explorer.exe文件上点击鼠标右键是不会出现"获取

exe文件 修改日期-如何修改exe文件的修改日期呢?

问题描述 如何修改exe文件的修改日期呢? 如何修改exe文件的修改日期呢?有没有什么简单的方法呢?请求指教. 解决方案 把电脑的时间改成你想要的,再改文件,最后再把电脑时间改回来 解决方案二: reshacker等工具修改一下exe文件

求助大神,这个matlab程序如何修改才能正确运行?

问题描述 求助大神,这个matlab程序如何修改才能正确运行? function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P) %-------------------------------------------------------------------------- %??JSPGA.m %??流水线型车间作业调度遗传算法 %??GreenSim团队原创作品,转载请注明 %??Email:greensim@163.com %??Green

xcode6.1下,修改了architectures为支持64位系统

问题描述 xcode6.1下,修改了architectures为支持64位系统 xcode6.1下,修改了architectures为支持64位系统,报错,有人遇到吗?能不能帮我解决 Check dependencies No architectures to compile for (ARCHS=Standard Architectures (including 64-bit), VALID_ARCHS=arm64 armv7 armv7s). 解决方案 安装的版本没支持x64 解决方案二:

vs2008编写的串口通信程序生成的exe怎么在其它电脑上运行?

问题描述 vs2008编写的串口通信程序生成的exe怎么在其它电脑上运行? 20C 如题 要求生成的exe在任何一台没有注册mscomm或者vs集成环境的电脑上能够打开使用 解决方案 VS2008编写的程序在有些电脑上不能运行的解决办法.VS2008下编的程序生成的EXE 在没有安装VS2008的计算机上能运行VS2008生成EXE无法在其他电脑上使用 解决方案二: 不要使用mscomm串口编程,使用系统的api来做就行了:https://msdn.microsoft.com/en-us/lib

W3C着手修改技术规格增加网络摄影机支持

CNET科技资讯网12月17日国际报道 负责制定网页语言标准的W3C表示,已开始着手修改技术规格,准备支持网络摄影机(webcam). W3C已开始着手修改超文字标示语言(Html)规格,准备加入Html Device支持.12月11日拟订的规格草案说:"装置元素提供装置选择,让使用者允许网页访问某种装置,比方说一台摄影机." 此举显示网络标准的范畴进一步扩大.支持者设法让Web不只是静态网页的展示平台,而能变成执行互动式应用软件的平台,因此让应用程序直接访问硬件设备就变得很重要. H

关于数字证书修改密码的问题,望各位大侠不吝赐教

问题描述 问题如下:本人从信任的第三方获取了数字证书,但是这个证书是在制作过程中加入了密码,由于初始加入的密码与需求不符,现需要修改证书的初始密码.另外,请教一下如何向用openssl工具生成的证书中加入密码?CA证书和普通用户证书加入密码与修改.删除密码有什么不同的地方?哪位大侠能帮忙解决一下这几个问题,小弟将感激不尽,在此先谢过了! 解决方案 本帖最后由 repozen 于 2012-08-27 00:11:35 编辑解决方案二:沙发,坐等大神解答~~~解决方案三:有没有第三方提供的CA驱动

求助帖,VS生成的exe在32位机器不能运行!!折腾我半个月了

问题描述 如上图,是一个开源软件,webkitbrowser的,在64位机器上面运行没有一点问题,32位机器却不行.提示如上.什么原因呢 解决方案 解决方案二:这个是提示的错误,我不知道怎么改了解决方案三:使用了64位的组件解决方案四:32位和64位DLL不能混用看来你需要做2个版本了解决方案五:你好,请问从哪儿看出来使用64位的组件了?我能不能做到兼容?解决方案六:另外,我这儿有能在32位运行的版本,只是有一点小问题,我可不可以把64位的Debug文件里面的某一个组件替换掉?还请不吝赐教解决方

支持中文/英文/数字的动网ASP验证码类修改教程

完美支持中文验证码,英文及数字验证码. 设置起来相对比较简单,打开文件(Dv_GetCode.asp)进行相应参数修改: 以下是引用片段:   mCodeType     = 0        '0数字,1字母,2汉字     mCodeTotal    = 4        '生成的验证码个数     mMaxWidth    = 30        '可取的一个字符的最大宽度     mMinWidth    = 25        '可取的一个字符的最小宽度     mMaxHeight