c++ - 假 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”,我做错了什么?
解决方案
在第一种情况下,它将四个字节附加到文件中以获得所需的 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。
推荐阅读
- sql-server - 如何在不删除 SQL Server 中的时间的情况下比较日期时间
- amazon-web-services - 如何使用 IAM 角色在 Spring Boot Application 中为任务轮换 AWS 密钥
- ruby-on-rails - 上传时不显示文件名
- .net - .net 是否有允许 ref 返回值的集合类?
- java - 数组列表
共享偏好 - angular - “OperatorFunction”类型上不存在属性“地图”
'.ts(2339) - jquery - Jquey $(this).serialize() 返回空字符串
- r - 在 r 中添加具有相似变量的行值
- authentication - Github API Rate Limit Exceeded when it used when it used to work
- sqlite - 在 Android Studio Kotlin 中打开 SQLite 数据库