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。
我正在尝试伪造所需的 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。