原文:让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改了,那么就会显示”数字签名无效“而不是”无法验证证书“,所以凭这一点也可以验证是否被篡改过,但是其实用不着了,这个只是好看用的,因为刚才说了,只要修改连运行都不能运行了。

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

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

  1. dnSpy进行反编译修改并编译运行EXE或DLL

    dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行 本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: h ...

  2. Atitit.Java exe bat  作为windows系统服务程序运行

    Atitit.Java exe bat  作为windows系统服务程序运行 1. 使用SC命令+srvany.exe (不错,推荐)+net start1 1.1. First 创建一个java的运 ...

  3. 让InstallShield 2015 Limited Edition for Visual Studio 2015生成的setup.exe双击时以管理员权限运行

    转载:http://blog.csdn.net/zztoll/article/details/52096700 如题,如何让InstallShield 2015 Limited Edition for ...

  4. 将Python文件打包为exe文件,并在控制台运行之简易教程

       第一步  在线安装 pyinstaller. 方法:打开win+ R,输入cmd,在命令行输入"pip install pyinstaller" 静等几分钟后即可安装成功. ...

  5. 修改json源码支持datetime序列化

    修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...

  6. 如何修改Docker已运行实例的端口映射

    如何修改Docker已运行实例的端口映射 Docker的端口映射,往往出现在两个阶段需要处理: 1.是在docker启动前就已经确定好,哪个docker实例映射哪个端口(往往这个情况比较,需要提前做规 ...

  7. Linux单用户模式(修改密码、运行级别)方法详解

    很多新手当面对"忘记 root 账户密码导致无法登陆系统"这个问题时,直接选择重新系统.其实大可不必,我只需要进入 emergency mode(单用户模式)更新 root 账户的 ...

  8. [C#]使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...

  9. 使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...

随机推荐

  1. 修改emlog后台登录路径的方法(转)

    emlog后台登录地址的目录名称默认为admin,并且官方没有提供自定义后台登录入口名字的功能,这多少让我们觉得有些不安全,毕竟暴露一个网站的后台不是一件安全的事,今天就给您说下修改方法,增加一下网站 ...

  2. UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

    刘汝佳的题目,悲剧文本 -_-||| 这里使用vector<string>容器倒置记录数据,然后从后面输出就能够了. 难度就是不知道这种文档究竟哪里是開始输出,故此使用动态管理内存的容器比 ...

  3. [置顶] JQuery实战总结三 标签页效果图实现

    在浏览网站时我们会看到当我们鼠标移到多个选项卡上时,不同的选项卡会出现自己对应的界面的要求,在同一个界面上表达了尽量多的信息.大大额提高了空间的利用率.界面的切换效果也是不错的哦,这次自己可以实现啦. ...

  4. emeditor只显示特定类型的文件

    emeditor过滤文件类型,右侧资源管理器中只显示特定类型的文件,如只显示java,xml,txt,properties等文件,而不显示doc,jpg,xls等emeditor不能打开的文件. 右击 ...

  5. 《Nginx文件类型错误解析漏洞--攻击演练》 (转)

    今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...

  6. Shell split character line by line

    while read line      do            account=`echo "$line"| cut -c1-9`'|'            account ...

  7. SDL2源码分析5:更新纹理(SDL_UpdateTexture())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  8. 划分树 静态第k大

    划分树是保存了快速排序的过程的树,可以用来求静态第k小的数 如果,划分树可以看做是线段树,它的左孩子保存了mid-L+1 个 小于等于 a[mid] 的数字,  右孩子保存了 R-mid个大于等于a[ ...

  9. Windows Phone开发(31):画刷

    原文:Windows Phone开发(31):画刷 画刷是啥玩意儿?哈,其实画刷是用来涂鸦,真的,没骗你,至于你信不信,反正我信了. 本文通过价绍几个典型的画刷,使你明白画刷就是用来涂鸦的. 一.纯色 ...

  10. 浅谈新一代Android操作系统Android L

    今天早一些的时候,Google公布了新一代Android操作系统Android L.让我很意外的是命名规则的变化,之前外界纷纷推測会叫Android5.0,同一时候会给一个甜品的名字命名.由于Andr ...