我创建了一个c#程序,当单击一个按钮时,该程序将运行.cmd文件。但是,任何人都可以编辑该.cmd文件。如何混淆/保护.cmd文件,以防止对其进行反向工程?
答案 0 :(得分:2)
您可以将.cmd文件设置为只读(右键单击>属性>只读) 但是,这并不是很安全,因为Windows权限系统并不是最好的。
我建议在执行之前检查文件,以查看是否未编辑。 为此,您可以对文件进行哈希处理,然后将其与哈希进行比较。只要将哈希值硬编码到软件中,就很难进行反向工程。
let obj = { ... this.$route.query }
this.$router.push({
query: Object.assign({}, this.$route.query, obj),
});
然后,您将需要运行一次以获取正确的哈希值。复制结果并像这样使用它:
string CMDFileChecksum()
using var md5 = MD5.Create();
using var stream = File.OpenRead(PATH_TO_YOUR_CMD)
var hash = md5.ComputeHash(stream); // Compute the hash
return BitConverter.ToString(hash)
.Replace("-", "").ToLowerInvariant(); // Convert the hash to a string
}
这将计算文件的校验和并将其与正确的校验和进行比较。如果文件已被修改,则该文件将不会执行。如果发生这种情况,您可以从服务器下载正确的文件,警告用户不要这样做,或者执行任何您真正想要的操作。
答案 1 :(得分:0)
是否有理由为什么需要执行.cmd文件而不是直接从C#应用程序内部执行包含的命令?
您可以尝试以下方法:
string cmdText = "/C **your commmand file code here**";
System.Diagnostics.Process.Start("cmd.exe", cmdText);
请不要忘记命令字符串的/C
部分,因为它至关重要。
这样,您的代码就不会冒被最终用户窃取或编辑的风险。
答案 2 :(得分:0)
首先:如果您想保护自己的cmd脚本,则需要对其进行加密。从简单到全面的保护都有很多例子。
这里严格测试是一种简单的方法:
string crypto(string input, bool encrypt)
{
Random rnd = new Random(123);
StringBuilder sb = new StringBuilder();
int sgn = encrypt ? 1 : -1;
for (int i = 0; i < input.Length; i++)
{
sb.Append( ((char) ( (byte)input[i] + sgn * rnd.Next(63))) .ToString());
}
return sb.ToString();
}
下一步,您需要将解密行一个一个接一个地输入到运行cmd.exe
的进程中。为此,您需要使用StdIn
属性,并重定向以从行中输入的stream
中读取。.
Process cmdProc = new Process();
cmdProc.StartInfo.FileName = "cmd.exe";
cmdProc.StartInfo.RedirectStandardOutput = true;
cmdProc.StartInfo.RedirectStandardInput = true;
cmdProc.StartInfo.UseShellExecute = false;
cmdProc.StartInfo.CreateNoWindow = true;
cmdProc.Start();
StreamWriter myStreamWriter = cmdProc.StandardInput;
myStreamWriter.WriteLine("@echo off"); // optional
foreach (var line in lines)
{
if (line.Trim().ToLower() != "pause")
myStreamWriter.WriteLine(line);
}
myStreamWriter.WriteLine("exit"); // optional
// show the output somewhere, if needed
textbox_out.Text += (cmdProc.StandardOutput.ReadToEnd());
一些注意事项:
仅使用一个cmd进程,它将与脚本中设置的环境变量一起使用。
如果只想获取输出,也可以在每行之后获取输出并从命令中剥离命令,即第一行。
您还可以重定向StdErr
,这将有助于发现各种错误。
加密功能有很多缺陷,最值得注意的是,它并非设计用于双字节编码或更高的ascii字符。
Process
和StreamWriter
应该放置或放在using
子句中。