При чтении файла программа читает данные вместе с их контрольными суммами / кэш-величинами. Если вновь вычисленные величины совпали со старыми, то программа предполагает, что файл корректен. В противном случае программа, скорее всего, сообщит об ошибке, выдав приблизительно следующее диагностическое сообщение: «Файл некорректен».
В некоторых случаях этот же самый механизм может быть применен разработчиком программного обеспечения для защиты своих данных. Во-первых, для обнаружения случайных повреждений файла данных. Некоторые приложения не смогут правильно обработать поврежденные данные. Во-вторых, как попытка предотвратить некоторые запрещенные действия со стороны пользователей приложения, начиная от попыток обмануть игру до изменения файлов паролей.
Конечно, этот метод защиты не отвечает всем требованиям безопасности. Все, что нужно сделать злоумышленнику, – это определить используемый алгоритм подсчета контрольной суммы, или алгоритм кэширования, и выполнить те же самые действия, что и программа. Местонахождение кэш-величины в файле не является тайной, поскольку, наблюдая за изменениями в файле при определении местонахождения изменяемых величин, всегда найдется одна или несколько последовательностей постоянно изменяющихся байт. Одна из них и является контрольной суммой.
Если исследователю неизвестен алгоритм вычисления контрольной суммы, то некоторые способы помогут ему определить его. Но, даже зная алгоритм вычисления контрольной суммы, потребуется дополнить выяснить, какая часть файла используется при подсчете контрольной суммы. Это можно узнать экспериментально. Если нет уверенности, какая именно часть файла используется для подсчета контрольной суммы, то измените в какой-либо части файла данные и попробуйте поработать с ним. Если в ответ получите сообщение о разрушении файла, то, вероятнее всего, эта часть файла используется для подсчета контрольной суммы.
Даже не проводя анализа машинного кода или некоторых внешних признаков (например, сообщений программы о CRC32 ошибке), первые предположения об используемом алгоритме можно сделать, основываясь на количестве байт кэш-величины. Наиболее известный алгоритм подсчета контрольной суммы CRC32 вычисляет 32-битовую (четырехбайтовую) величину. Этот алгоритм подсчета контрольной суммы используется в ряде сетевых технологий. Примеры его программной реализации могут быть найдены повсеместно, только запустите поиск в Интернете. Например, подходящий пример может быть найден по адресу www.faqs.org/faqs/compression-faq/part1/section-26.html.
Алгоритмы MD4 и MD5 (MD – сокращения от Message Digest – профиль сообщения. Профиль сообщения – это короткая цифровая строка фиксированной длины, формируемая из более длинного сообщения с использованием специального алгоритма) генерируют 128-битовую (16-байтовую) величину, а алгоритм SHA (SHA – Secure Hash Algorithm – алгоритм аутентификации и проверки целостности информации) – 160-битовую (20-байтовую) величину.
Примечание
Возможны любые изменения описанных в этой секции методов, если разработчик захочет усложнить жизнь хакеру. В худшем для хакера случае он сможет определить алгоритм, просмотрев выполнение программы в отладчике. Пример использования отладчика может быть найден в главах 4 и 8 книги.
Проблемы сжатия и шифрования
Эта тема схожа с предыдущей, но с небольшим дополнением. Если файл сжат или зашифрован, то нельзя определить, где именно надо модифицировать файл, пока не будет выяснен механизм шифрования или сжатия.
Если проанализировать различия между исходным и сжатым или зашифрованным файлом (если используется качественный алгоритм преобразования файлов), то можно обнаружить изменение большого количества данных в файле. В начале главы автор приводил пример применения метода поиска различий для игры Heroes of Might and Magic II, хотя в то время уже продавалась игра Heroes of Might and Magic III. Дело в том, что, как кажется автору, в последней игре файлы сжимаются. Автор делает подобное предположение по следующим причинам. Во-первых, файл неразборчив (при просмотре файла не видно английских слов). Во-вторых, при сохранении игры каждый раз изменяется почти весь файл целиком, даже если между сохранением игры ничего не делается. В-третьих, с течением времени размер файла слегка изменяется. Поскольку размер сжатого файла зависит от его содержания, а размер зашифрованного файла имеет тенденцию оставаться постоянным при шифровании одинакового числа байт, то автор предполагает, что в данном случае используется сжатие вместо шифрования.