Проверка целостности кода CRC

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

CRC (англ. ) относится к криптографическим алгоритмам хэширования. На входе функции вычисления контрольной суммы (CRC) может быть представлено любое количество байт, задача алгоритма заключается в том, чтобы получить на основе всего объема входных данные 32 битное число (8 байт), это число должно зависеть от каждого байта входной последовательности, таким образом получаемое 32 битное число является цифровой подписью исходного массива данных. 32 бита даёт два в степени 32 (4 294 967 296 = 4,29 миллиарда) вариантов различных значений цифровой подписи. То есть, цифровая подпись CRC32 массива данных с вероятностью 99,9999999767 процента даёт возможность предположить, что является цифровой подписью именно этих данных. Однако, существует один шанс и 4,29 миллиардов, что у двух разных массивов данных может быть одинаковая CRC32 подпись, такой случай называется в криптографии коллизией.

Проверка целостности кода на базе CRC

Shareware программисты, а особенно программисты протекторов стали использовать проверку целостности EXE файла, а также проверку целостности кода программы в памяти для целей защиты своего детища от пропатчивания и воздействия вирусов. При пропатчивание такая программа будет показывать окно с сообщением об ошибке, либо втихую менять свой алгоритм работы или регистрации.

Сложностью при написание защиты с проверкой целостности кода является то, что на момент написания исходников программист, естественно не имеет скомпилированной финальной версии программы, то есть для CRC32 нет известных входных данных, кроме того, если саму подпись хранить внутри исполняемого файла, то иметь валидную подпись в нём, если файл подписывается целиком, невозможно. Причина в том, что сама электронная подпись входит в массив входных байт, таким образом, программисту всегда необходимо отвести отдельную область внутри файла где будет храниться сама CRC32 запись, а остальные байты файла будут входными данными. После компиляции релиза программы, необходимо обработать её внешним инструментом, который создаст валидную контрольную сумму для первой области файла и поместит саму подпись во вторую заранее известную область файла.

Для крэкера сломать проверку целостности кода CRC, в общем, не сложно (если нет дополнительных опций защиты, противодействующих этому). Если пропатченный файл выводит сообщение о нарушение целостности файла, тогда крэкер ставит брейкпоинт в отладчике на вызов этого окна, далее в отладчике же определяется место сравнения верной и неверной контрольной суммы на данный момент времени, верное значение подсматривается, также подсматривается адрес, где хранится само значение CRC32 суммы, размещенной программистом, далее происходит простейший патч: подсмотренное верное значение прописывается в файл по найденному адресу (смещению).

Взлом CRC32

Сам алгоритм CRC32 имеет слабину: существует возможность получить коллизию, изменив всего 4 байта во входной последовательности подписанных байт, то есть подогнать исходные данные так, чтобы получить нужное значение CRC32.

См. также

Техническое описание группы шифров CRC