VS写的.net小程序如何做防篡改检测?

用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