用C#写的桌面小程序。
假设会有无聊攻击者给小程序加个病毒再传播,
我想如果能给小程序做个防篡改检测,如果检测到程序被篡改,就弹出提示,让用户不要使用(最好能够不要运行)。
假设无聊攻击者并不会反编译之类的,不用考虑偷了源码复制修改,它们只会用傻瓜式病毒注入exe中。
网上搜了一下,VS自带有“强名称程序集签名”。
但问题是,这个功能设计初,只是为了防止dll重名出错,且不说很容易就去除跳过强名称签名检测,
更主要的问题是,我这桌面小程序,引用了一些没有强名称数字签名的开源dll,而根据规则,强名称签名必须所有引用的dll也都已经有数字签名。很明显,我不能拿人家开源的东西签自己的名字。
那如果自己写检测,怎么搞?如果算一下本程序文件的hash,可以,怎么比较呢?如果我把应该正确的hash值记到本程序里,那本程序的hash不又变了吗?如果记到另外一个文件dll里,那人家直接修改一下不就认假为真了?。。
实时连到网上检查一下?那要增加网络通信,太麻烦了。
我不需要完全反编译防篡改,只想要篡改检测提示这种,怎么实现?
你的程序算出完整的MD5值加密后写入注册表,写入程序单做,在你的程序里加入MD5检测代码,取注册表里加密的md5值作比对即可
说到底,好像只能“部分”防篡改,比如关键的链接、作者信息等进行md5计算比较,而“存放md5值”的地方,不能包括在计算md5值的部分。。
private string GetFileMd5Code(string filePath)
{
StringBuilder builder = new StringBuilder();
using(var md5=new MD5CryptoServiceProvider())
{
File.Copy(filePath,filePath+"e");//复制一份,防止占用
using(FileStream fs=new FileStream(filePath+"e",FileMode.Open))
{
byte[] bt=md5.ComputeHash(fs);
for (int i = 0; i < bt.Length; i++)
{
builder.Append(bt[i].ToString("x2"));
}
}
File.Delete(filePath+"e");//删除复制的文件,这里没处理异常等....
}
return builder.ToString();
}
其实你这个问题可以归结为程序如何获取运行状态下的MD5值问题,MD5很好算,主要是获取运行的文件流,前面已经给以提供了采用副本方式,一还可以使用Assembly.GetExecutingAssembly().GetFile(fileName)方式直接获取当前的文件流来计算md5