fake crc32(在文件末尾添加4个字节)

fake crc32 (add 4 bytes in the end of the file)

我正在尝试伪造所需的 CRC32,我找到了名为 PEid 的应用程序,因此它有一个名为 crc32 的插件可以执行此操作

如你所见,文件的CRC校验码为0x97B9850E,我需要0x73CBFFB5 当我点击修复它时,应用程序会将 0xA6D43474 附加到文件中,crc32 将变为 0x73CBFFB5 我找到了这个插件的源代码:

#include "stdafx.h"


int main()
{
    unsigned long c, c2, p2, pol = 0xEDB88320;

    long n, k;

    

    {

        printf("CRC32 Adjuster (c) 2001 by RElf @ HHT/2\n");

        printf("Length of data: "); scanf_s("%ld", &n);

        printf("Offset to patch: "); scanf_s("%ld", &k);

        n = (n - k) << 3;

        printf("Current CRC32: 0x"); scanf_s("%x", &c);

        printf("Desired CRC32: 0x"); scanf_s("%x", &c2);

        c ^= c2;

        p2 = (pol << 1) | 1;

        while (n--) if (c & 0x80000000) c = (c << 1) ^ p2; else c <<= 1;

printf("XOR masks:%02X%02X%02X%02X\n", c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff, c >> 24);

    }
    return 0;
}

用 C++ .net 编译它 visual studio,控制台给了我什么(我把所有数据作为文件的长度 3436 并自己偏移到 patch 和 crc32 列):

CRC32 Adjuster (c) 2001 by RElf @ HHT/2
Length of data: 3436
Offset to patch: 0
Current CRC32: 0x97B9850E
Desired CRC32: 0x73CBFFB5
XOR masks:1606010E

为什么它给了我异或掩码“0x1606010E”,而它应该是“0xA6D43474”,我做错了什么?

在第一种情况下,它将四个字节附加到文件以获得所需的 CRC。结果是一个长度为 3440 的文件。在第二种情况下,它告诉您可以使用提供的文件独占或 前四个字节 (您给它偏移量 0)常数以获得所需的 CRC,保持文件长度为 3436。

您可以通过首先向文件附加四个零字节、获取该文件的 CRC (0x7d096252) 并为其提供该 CRC、您想要的 CRC 和长度 3440 来获取要附加的字节和补丁 3436 的偏移量(即覆盖最后四个零):

CRC32 Adjuster (c) 2001 by RElf @ HHT/2
Length of data: 3440
Offset to patch: 3436
Current CRC32: 0x7d096252
Desired CRC32: 0x73CBFFB5
XOR masks:a6d43474

另一种方法是 spoof,它允许您在输入中的任何位置提供一组分散的位的位置,欺骗可以翻转这些位以获得所需的 CRC。它还允许任何 CRC 定义,而不仅仅是通常的 CRC-32。