m0_51740965
无处不在的风儿
2021-03-24 20:09
采纳率: 0%
浏览 42

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

用C#写的桌面小程序。

假设会有无聊攻击者给小程序加个病毒再传播,

我想如果能给小程序做个防篡改检测,如果检测到程序被篡改,就弹出提示,让用户不要使用(最好能够不要运行)。

假设无聊攻击者并不会反编译之类的,不用考虑偷了源码复制修改,它们只会用傻瓜式病毒注入exe中。

网上搜了一下,VS自带有“强名称程序集签名”。

但问题是,这个功能设计初,只是为了防止dll重名出错,且不说很容易就去除跳过强名称签名检测,

更主要的问题是,我这桌面小程序,引用了一些没有强名称数字签名的开源dll,而根据规则,强名称签名必须所有引用的dll也都已经有数字签名。很明显,我不能拿人家开源的东西签自己的名字。

那如果自己写检测,怎么搞?如果算一下本程序文件的hash,可以,怎么比较呢?如果我把应该正确的hash值记到本程序里,那本程序的hash不又变了吗?如果记到另外一个文件dll里,那人家直接修改一下不就认假为真了?。。

实时连到网上检查一下?那要增加网络通信,太麻烦了。

我不需要完全反编译防篡改,只想要篡改检测提示这种,怎么实现?

  • 点赞
  • 收藏

4条回答 默认 最新

  • flybox0384
    flybox0384 2021-03-25 10:40

    你的程序算出完整的MD5值加密后写入注册表,写入程序单做,在你的程序里加入MD5检测代码,取注册表里加密的md5值作比对即可

    点赞 评论
  • m0_51740965
    无处不在的风儿 2021-03-25 20:49

    说到底,好像只能“部分”防篡改,比如关键的链接、作者信息等进行md5计算比较,而“存放md5值”的地方,不能包括在计算md5值的部分。。

    点赞 评论
  • flybox0384
    flybox0384 2021-03-26 10:01
    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();
    }
    点赞 评论
  • flybox0384
    flybox0384 2021-03-26 10:36

    其实你这个问题可以归结为程序如何获取运行状态下的MD5值问题,MD5很好算,主要是获取运行的文件流,前面已经给以提供了采用副本方式,一还可以使用Assembly.GetExecutingAssembly().GetFile(fileName)方式直接获取当前的文件流来计算md5

    点赞 评论

相关推荐