首页 > 解决方案 > 假 crc32(在文件末尾添加 4 个字节)

问题描述

我试图伪造所需的 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 和偏移量到补丁和 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

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

标签: c++binarycrc32

解决方案


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

您可以通过首先将四个零字节附加到文件中来获取要附加的字节,获取该0x7d096252(最后四个零):

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。


推荐阅读