有没有一种方法来混淆.cmd文件?

时间:2019-06-16 17:02:29

标签: c# batch-file cmd

我创建了一个c#程序,当单击一个按钮时,该程序将运行.cmd文件。但是,任何人都可以编辑该.cmd文件。如何混淆/保护.cmd文件,以防止对其进行反向工程?

3 个答案:

答案 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字符。

  • ProcessStreamWriter应该放置或放在using子句中。