Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 通过更改校验和头更改PE可执行文件的哈希_C#_Md5_Checksum_Sha256 - Fatal编程技术网

C# 通过更改校验和头更改PE可执行文件的哈希

C# 通过更改校验和头更改PE可执行文件的哈希,c#,md5,checksum,sha256,C#,Md5,Checksum,Sha256,我正在编写一段代码,用于计算程序的MD5/SHA256,稍后我希望能够对其进行更改 我编写了计算MD5/SHA256的代码,它是: using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(textBox1.Text)) { MessageBox.Show(BitConverter.ToString(md5.ComputeHash(stream)).

我正在编写一段代码,用于计算程序的MD5/SHA256,稍后我希望能够对其进行更改

我编写了计算MD5/SHA256的代码,它是:

    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(textBox1.Text))
        {
            MessageBox.Show(BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", ""));
        }
    }
    using (var sha256 = SHA256.Create())
    {
        using (var stream = File.OpenRead(textBox1.Text))
        {
            MessageBox.Show(BitConverter.ToString(sha256.ComputeHash(stream)).Replace("-", ""));
        }
    }
接下来,我希望能够更改指定文件的MD5/SHA256的值。我搜索了一下,只找到了这个类:

class FileUtils
{
    #region VARIABLES
    private const int OFFSET_CHECKSUM = 0x12;
    #endregion

    #region METHODS
    public static ushort GetCheckSum(string fileName)
    {
        if (!File.Exists(fileName))
            throw new FileNotFoundException("Invalid fileName");
        return GetCheckSum(File.ReadAllBytes(fileName));
    }
    public static ushort GetCheckSum(byte[] fileData)
    {
        if (fileData.Length < OFFSET_CHECKSUM + 1)
            throw new ArgumentException("Invalid fileData");
        return BitConverter.ToUInt16(fileData, OFFSET_CHECKSUM);
    }
    public static void WriteCheckSum(string sourceFile, string destFile, ushort checkSum)
    {
        if (!File.Exists(sourceFile))
            throw new FileNotFoundException("Invalid fileName");
        WriteCheckSum(File.ReadAllBytes(sourceFile), destFile, checkSum);
    }
    public static void WriteCheckSum(byte[] data, string destFile, ushort checkSum)
    {
        byte[] checkSumData = BitConverter.GetBytes(checkSum);
        checkSumData.CopyTo(data, OFFSET_CHECKSUM);
        File.WriteAllBytes(destFile, data);
    }
    #endregion
    }
类文件utils
{
#区域变量
私有常量int OFFSET_校验和=0x12;
#端区
#区域方法
公共静态ushort GetCheckSum(字符串文件名)
{
如果(!File.Exists(fileName))
抛出新的FileNotFoundException(“无效文件名”);
返回GetCheckSum(File.ReadAllBytes(fileName));
}
公共静态ushort GetCheckSum(字节[]fileData)
{
if(fileData.Length
我不太明白它是如何工作的,只是改变了MD5。对于不太高级的用户,有没有更简单的方法来实现这一点?如果这门课能满足我的需要,有人能告诉我如何使用它吗


编辑:我知道文件的MD5不能更改,我的目标不是更改实际文件的MD5,我想向文件中添加一些内容,这些内容会改变MD5,通过这样做,我希望文件在功能上保持不变。

您不能仅仅决定您希望文件具有不同的哈希,因为哈希是存储在该文件中的数据的直接结果。就包含的内容而言,两个相同的文件将始终生成相同的哈希,而不管它们的名称是什么


对文件本身内容的任何更改都将导致完全不同的哈希值

您不能仅仅决定希望您的文件具有不同的散列,因为散列是存储在该文件中的数据的直接结果。就包含的内容而言,两个相同的文件将始终生成相同的哈希,而不管它们的名称是什么


对文件本身内容的任何更改都将导致完全不同的哈希值

您不能仅仅决定希望您的文件具有不同的散列,因为散列是存储在该文件中的数据的直接结果。就包含的内容而言,两个相同的文件将始终生成相同的哈希,而不管它们的名称是什么


对文件本身内容的任何更改都将导致完全不同的哈希值

您不能仅仅决定希望您的文件具有不同的散列,因为散列是存储在该文件中的数据的直接结果。就包含的内容而言,两个相同的文件将始终生成相同的哈希,而不管它们的名称是什么


对文件本身内容的任何更改都将导致完全不同的哈希值

MD5是通过传递字节(例如文件)并以十六进制唯一地表示它们来计算的,您不会更改文件的“MD5”,结果MD5会随着文件的更改而更改。

MD5是通过传递字节(例如文件)并以十六进制唯一地表示它们来计算的,您不会更改文件的“MD5”,结果MD5将随着文件的更改而更改。

MD5是通过传递字节(例如文件)并以十六进制唯一地表示它们来计算的,如果不更改文件的“MD5”,结果MD5将随着文件的更改而更改。

MD5是通过传递字节(例如文件)并以十六进制唯一地表示它们来计算的,您不更改文件的“MD5”,结果MD5将随着文件的更改而更改。

据我所知,您拥有或想要相同PE可执行文件的两个副本。现在,您需要更改其中一个或两个文件,以便在计算文件内容的哈希时,它们是不同的

如果您更改了校验和,那么可执行文件很可能不再运行。如果你同意,你可以很容易地使用你展示的类。它似乎假设校验和由两个字节组成,并且在可执行文件中偏移在字节0x12处。我现在无法验证它是否正确,但乍一看它似乎不正确

无论如何,您可以为每个文件创建唯一的校验和并设置它:

FileUtils.WriteCheckSum(sourceFile, destFile1, 1);
FileUtils.WriteCheckSum(sourceFile, destFile2, 2);

现在这两个文件将具有不同的内容,因此其内容的哈希将不同。

据我所知,您拥有或想要相同PE可执行文件的两个副本。现在,您需要更改其中一个或两个文件,以便在计算文件内容的哈希时,它们是不同的

如果您更改了校验和,那么可执行文件很可能不再运行。如果你同意,你可以很容易地使用你展示的类。它似乎假设校验和由两个字节组成,并且在可执行文件中偏移在字节0x12处。我现在无法验证它是否正确,但乍一看它似乎不正确

无论如何,您可以为每个文件创建唯一的校验和并设置它:

FileUtils.WriteCheckSum(sourceFile, destFile1, 1);
FileUtils.WriteCheckSum(sourceFile, destFile2, 2);

现在这两个文件将具有不同的内容,因此其内容的哈希将不同。

据我所知,您拥有或想要相同PE可执行文件的两个副本。现在,您需要更改其中一个或两个文件,以便在计算文件内容的哈希时,它们是不同的

如果你知道