поддельный crc32 (добавьте 4 байта в конец файла)

#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.