Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种方法可以混淆.cmd文件?_C#_Batch File_Cmd - Fatal编程技术网

C# 是否有一种方法可以混淆.cmd文件?

C# 是否有一种方法可以混淆.cmd文件?,c#,batch-file,cmd,C#,Batch File,Cmd,我已经创建了一个c程序,当点击一个按钮时,它会运行一个.cmd文件。但是,任何人都可以编辑该.cmd文件。如何混淆/保护.cmd文件以防止其被反向工程?您可以将.cmd文件设置为只读右键单击>属性>只读 然而,这不是很安全,因为windows权限系统并不是最好的 主意 我建议在执行之前检查该文件,看看是否未经编辑。 为此,您可以对文件进行哈希,并将其与哈希进行比较。只要你把散列的代码硬编码到你的软件中,就很难进行逆向工程 实施 计算正确的校验和 字符串CMDFileChecksum 使用var

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

您可以将.cmd文件设置为只读右键单击>属性>只读 然而,这不是很安全,因为windows权限系统并不是最好的

主意 我建议在执行之前检查该文件,看看是否未经编辑。 为此,您可以对文件进行哈希,并将其与哈希进行比较。只要你把散列的代码硬编码到你的软件中,就很难进行逆向工程

实施 计算正确的校验和 字符串CMDFileChecksum 使用var md5=md5.Create; 将var stream=File.OpenReadPATH\u用于\u命令 var hash=md5.ComputeHashstream;//计算散列 返回BitConverter.ToStringhash .Replace-,.ToLowerInvariant;//将哈希转换为字符串 } 检查文件 然后您需要运行它一次,以获得正确的哈希值。复制结果并按如下方式使用:

//将CMDFileChecksum计算的校验和放在此处 常量字符串更正校验和=校验和;//使用const将字符串烘焙到代码中 如果correctChecksum==CMDFileChecksum { //运行CMD文件 } 其他的 { //CMD文件已编辑=>抛出错误或警告用户等。 }
这将计算文件的校验和,并将其与正确的校验和进行比较。如果文件已修改,则不会执行该文件。如果出现这种情况,您可以从服务器下载正确的文件,警告用户不要这样做,或者您真正想要的任何东西。

是否有理由需要直接从C应用程序内部执行.cmd文件而不是包含的命令

您可以尝试以下方法:

string cmdText = "/C **your commmand file code here**";
System.Diagnostics.Process.Start("cmd.exe", cmdText);
不要忘记命令字符串的/C部分,因为它是至关重要的


这样,您的代码就不会有被最终用户窃取或编辑的风险。

首先:如果要保护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进程,因此它将使用脚本中设置的环境变量

如果只想获得输出,还可以在每行之后获取输出,并从中剥离命令,即第1行

您还可以重定向StdErr,这将有助于查找各种错误

crypto函数有许多缺陷,最明显的是它不是设计用于双字节编码或更高的ascii字符

进程和StreamWriter应该被丢弃或放在using子句中


如果你能解释一下你认为的“阻止它被编辑”,这真的会对我们有帮助。这将确保没有人可以反向工程和窃取源代码。你可以用解密版本加密文件和cmd进程。我把所有代码放在哪里?啊,对不起。没有看到编辑。如果你想阻止它被偷,你需要某种加密。但我认为cmd不值得加密,一个被偷走的cmd怎么办?可能付出了比实际更多的努力。NET不太难反编译,因此这可能不会很好地保护代码。请参阅以获取.NETdecompiling@blenderfreaky我意识到了这一点,但它仍然比纯文本.cmd文件更进一步,而不使用加密,这在OP的情况下可能超出了范围。我的cmd代码有18行长,那么我如何将其转换为在c中工作?为了简单起见,您可以使用。您是否尝试过将所有代码直接复制为一个文件整根绳子?
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());