【问题标题】:Verify that file is not altered/replaced验证文件未更改/替换
【发布时间】:2012-11-25 01:44:39
【问题描述】:

我需要将安全信息传递给我的应用程序中的可执行文件。换句话说,我有这行:

Process.Start("someExecutable.exe","MyUsername, myPassword");

我想阻止人们看到这些参数。 (用户名和密码由用户在运行时指定,所以我不必担心这些参数。

现在我遇到的一个问题是:如果有人用他们自己的程序替换 someExecutable.exe,他们将能够看到凭据!

为了将来的参考,我参考 someExecutable.exe(我将凭据作为参数发送的程序)A,我将把这个程序创建的可执行文件称为 B

我想防止这个问题,这里有一些我想到的解决方案:

  1. 计算A的哈希值并在执行前检查它。

    static bool? VerifyThatExeIsReliable(string pathOfExe)
    {
        if (System.IO.File.Exists(pathOfExe) == false)
            return null;            
    
        var bytes = System.IO.File.ReadAllBytes(pathOfExe);
    
        using (SHA1Managed a = new SHA1Managed())
        {
            var hash = a.ComputeHash(bytes);
    
            StringBuilder formatted = new StringBuilder(2 * hash.Length);
            foreach (byte b in hash)                
                formatted.AppendFormat("{0:X2}", b);                
    
            var code = formatted.ToString();
    
            if (code == "4835658749AF89A65C5F4835658749AF89A65C5F")
                return true;
        }            
    
        return false;
    }
    

    这种方法的问题是哈希 4835658749AF89A65C5F4835658749AF89A65C5F 将存储在可执行文件 A 中,如果有人用十六进制编辑器打开这个程序,他将能够找到哈希并修改它。换句话说,他们将计算他们编写的程序的 sha1 哈希,并放置该哈希而不是 4835658749AF89A65C5F4835658749AF89A65C5F

  2. 使用文件观察器类来检测文件何时被修改。如果我的程序没有运行,我将无法检测到这一点

  3. 确保用户看不到传递给该可执行文件的命令行参数:See command line arguments being passed to a program

【问题讨论】:

  • 这完全取决于你想要付出多少努力让生活变得困难。如果两个程序都在本地机器上运行,那么对它们传递给彼此的内容进行逆向工程永远是不可能的。
  • 本质上,软件破解所做的只是将整个功能替换为static bool? VerifyThatExeIsReliable(System.String) { return true; }。没有办法完全防止这种情况。

标签: c# security hash


【解决方案1】:

要解决选项 #1 的问题,对散列使用非对称加密,这样您的程序(和用户)将只能解密散列,而不能加密其他散列。当然,如果他们可以编辑编译后的 C# 代码,那么您无法阻止他们修改它以不解密哈希,但这需要更多的时间和专业知识。

要解决问题 #2,在您的程序中存储可执行文件 A 的哈希值,并在启动之前验证可执行文件 A 与哈希值匹配。

至于#3,据我所知,没有办法解决这个问题。但是,如果您能够修改目标程序,例如,您可以通过加密的网络套接字发送用户名和密码。

还要注意,可以对 .NET 应用程序进行逆向工程,如果安全性对您很重要,您应该考虑在可执行文件上运行某种混淆工具。归根结底,它不是让程序 100% 防篡改,因为那是不可能的。它的目的是让任何有理由这样做的人都不值得为此烦恼。

【讨论】:

  • 威廉 +1 感谢您的帮助。使用 Asym 加密将是我的首选选项,但用户名和密码可能会更改……我不知道要采取什么方法。我想知道哪种方法对黑客来说更难……
  • @Tono 您始终可以将非对称加密的用户名和密码存储在单独的文件或注册表中,然后您的程序就有可能通过 Internet 获取经过数字签名的凭据更新。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2011-01-29
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多