0

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

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. 确保用户无法看到传递给该可执行文件的命令行参数:查看传递给程序的命令行参数

4

1 回答 1

1

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

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

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

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

于 2012-11-25T01:55:24.110 回答