#c #binary #crc32
#c #двоичный #crc32
Вопрос:
Я пытаюсь подделать необходимый 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/2n");
printf("Length of data: "); scanf_s("%ld", amp;n);
printf("Offset to patch: "); scanf_s("%ld", amp;k);
n = (n - k) << 3;
printf("Current CRC32: 0x"); scanf_s("%x", amp;c);
printf("Desired CRC32: 0x"); scanf_s("%x", amp;c2);
c ^= c2;
p2 = (pol << 1) | 1;
while (n--) if (c amp; 0x80000000) c = (c << 1) ^ p2; else c <<= 1;
printf("XOR masks:XXXXn", c amp; 0xff, (c >> 8) amp; 0xff, (c >> 16) amp; 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
почему он выдает мне маски XOR «0x1606010E», когда он должен быть «0xA6D43474», что я делаю не так?
Комментарии:
1. Что значит подделать необходимый CRC? Если у вас есть данные, которые защищает CRC, вы сможете легко их вычислить. В чем проблема?
2. @JohnFilleau Угадайте здесь: OP изменил данные и хочет, чтобы все, что их читает, принимало их как нетронутые.
3. @TedLyngmo да, мне потребовалась секунда, я уверен, что вы правы. OP: вы говорите, что нашли инструмент, и вы нашли исходный код для этого инструмента, и вы хотите знать, почему функциональность обоих отличается?
4. Вычисленный CRC будет отличаться в зависимости от многочлена. Вы уверены, что используете в своем скомпилированном коде тот же многочлен, что и приложение?
5. Также только заголовок этого плагина и первая строка, напечатанная вашим кодом, указывают мне, что это не исходный код для этого плагина. Один от Gelios, другой от RElf.
Ответ №1:
В первом случае он добавляет четыре байта к файлу, чтобы получить желаемый 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 , который позволяет вам указывать местоположения разбросанного набора битов в любом месте ввода, которые spoof может перевернуть, чтобы получить желаемый CRC. Он также разрешает любое определение CRC, а не только обычный CRC-32.