【发布时间】:2012-11-25 01:44:39
【问题描述】:
我需要将安全信息传递给我的应用程序中的可执行文件。换句话说,我有这行:
Process.Start("someExecutable.exe","MyUsername, myPassword");
我想阻止人们看到这些参数。 (用户名和密码由用户在运行时指定,所以我不必担心这些参数。
现在我遇到的一个问题是:如果有人用他们自己的程序替换 someExecutable.exe,他们将能够看到凭据!
为了将来的参考,我参考 someExecutable.exe(我将凭据作为参数发送的程序)A,我将把这个程序创建的可执行文件称为 B
我想防止这个问题,这里有一些我想到的解决方案:
-
计算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 使用文件观察器类来检测文件何时被修改。如果我的程序没有运行,我将无法检测到这一点
确保用户看不到传递给该可执行文件的命令行参数:See command line arguments being passed to a program
【问题讨论】:
-
这完全取决于你想要付出多少努力让生活变得困难。如果两个程序都在本地机器上运行,那么对它们传递给彼此的内容进行逆向工程永远是不可能的。
-
本质上,软件破解所做的只是将整个功能替换为
static bool? VerifyThatExeIsReliable(System.String) { return true; }。没有办法完全防止这种情况。