Электронная библиотека » Коллектив Авторов » » онлайн чтение - страница 12


  • Текст добавлен: 9 ноября 2013, 23:45


Автор книги: Коллектив Авторов


Жанр: Зарубежная компьютерная литература, Зарубежная литература


сообщить о неприемлемом содержимом

Текущая страница: 12 (всего у книги 69 страниц) [доступный отрывок для чтения: 22 страниц]

Шрифт:
- 100% +
Тестирование методом «черного ящика»

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

Тестирование методом «черного ящика» может быть сравнено с бинарным аудитом (binary auditing). Любой аудит так или иначе имеет дело с бинарными данными, предусматривающими одну возможность из двух. Известны различные толкования «черного ящика» в зависимости от знаний исследователя о его внутреннем строении (его прозрачности). В книге рассматриваются два типа ящиков: «черный ящик» и «ящик из обсидиана». Конечно, это мысленные, а не реальные физические объекты. Тип ящика отражает уровень знаний исследователя о происходящих в системе внутренних явлениях.

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

Чипы

Предположим, что в руки исследователя попало электронное устройство, про которое хотелось бы знать, как оно работает. В настоящее время большинство электронных устройств построено на микросхемах. Вскрыв устройство, можно обнаружить, что оно состоит из множества немаркированных микросхем. Вытащив таинственную микросхему из слота, как определить, что это за чип?

Неизвестная микросхема – удачный пример встречающегося на практике «черного ящика». Без маркировки определить предназначение чипа очень сложно.

Что можно вынести из визуального осмотра? Только то, что у чипа 16 контактов или что-то подобное этому. Исследовав монтажную плату и токопроводящие слои, довольно легко можно определить контакты питания. Их можно проверить вольтметром. Но если предположение о контактах питания окажется ошибочным, микросхема будет сожжена.

Кроме того, следует попытаться сделать выводы, основываясь на других компонентах устройства. Можно составить список компонентов, подсоединенных к чипу, и выяснить, к каким контактам они подсоединены. Например, может оказаться, что два контакта в конечном счете подключены к светодиоду LED (LED – Light-Emitting Diode – светоизлучающий диод).

Если окажется, что чип – простое устройство TTL-логики (transistor-transistor logic – транзисторно-транзисторные логические схемы), то можно определить реализуемые этим чипом простые логические функции, подавая на различные контакты напряжение, эквивалентное сигналам «истина/ложь» и одновременно измеряя выходное напряжение на других контактах. Если удастся определить, что чип относится, например, к классу схем И-НЕ (NAND (not-and) gate), то по каталогу микросхем можно определить исследуемый чип или его аналог.

С другой стороны, чип может оказаться по своей сложности сравнимым с небольшим микропроцессором или встроенной вычислительной системой. В последнем случае для определения соответствия между входными и выходными сигналами методом проб и ошибок потребуется рассмотреть слишком много комбинаций. Вполне возможно, что во встроенной системе окажутся аналоговые компоненты (например, динамик), которые сведут на нет все попытки установления закономерностей двоичной логики.

С образцами подобных устройств можно познакомиться по адресу www.parallaxinc.com/html_files/products/Basic_Stamps/module_bs2p.asp. Parallax производит семейство чипов со встроенным интерпретатором BASIC, отличающихся различными комбинациями входных и выходных интерфейсов. Главная сложность подобного устройства заключается в том, что число его состояний заведомо больше, чем можно перечислить. Даже крошечный компьютер с небольшим количеством памяти может сгенерировать бесконечно большое число неповторяющихся результатов. В качестве простого примера представьте себе компьютер на одном чипе, который складывает большие целые числа. Все, что он может сделать, – это выполнить простую программу добавления 1 к введенному числу и вывести результат. Вероятно, исследователь быстро определит, что на компьютере выполняется простая программа сложения чисел, но определить другие возможности компьютера практически невозможно. Иными словами, ничего нельзя сказать о том, является ли это устройство компьютером общего назначения или оно выполняет единственную функцию.

Сложно найти закономерность при исследовании систем методом «черного ящика». Но некоторые извлекают пользу из этого. Закономерности могут быть найдены случайно или в результате активных исследований. Прежде чем попытаться скрыть какую-либо закономерность, следует удостовериться в том, что число вариантов ее проявления достаточно велико. Конкретный пример приведен в статье по адресу www.casinoguru.com/features/0899/f_080399_tocatch.htm. В статье говорится o жуликоватом технике игорных автоматов, который заменил чип в некоторых автоматах. В результате каждый раз при вбрасывании определенной последовательности монет в автомат и дерганья за ручку автомат выплачивал джек-пот. Речь идет об основных приемах «зашивки» в программы «секретных» недокументированных сообщений!

Если из результатов исследования и доступной информации непонятно, что это за чип, то вскройте его! Вскрыть чип? Именно так. Исследователям защитного корпуса таких устройств, как смарт-карты (smart card – кредитная карточка с микропроцессором), известно много способов их изучения, включая выжигание корпуса чипа кислотой и исследование его структуры под микроскопом. Подробнее эти вопросы освещены в главе 14.

Итак, если исследователь с помощью метода «черного ящика» не может разобраться с устройством чипа, то он должен вскрыть его. Опыт посещения автором копий обсидиана (вулканического стекла) в Аризоне наглядно демонстрирует это. Если держать обсидиан на расстоянии вытянутой руки, то он выглядит как черный камень. Но при ярком свете обсидиан становится немного прозрачнее. Таким образом, он не вполне «черный ящик», а скорее в той или иной степени прозрачный «ящик из обсидиана». Другими словами, у исследователя всегда есть возможность получить информацию о решаемой задаче.

Резюме

Методологии поиска уязвимости часто используют принципы аудита безопасности систем. Изучение исходного текста программ начинается с выявления потенциально небезопасных функций, например strcpy и sprintf. Другой способ заключается в тщательной построчной экспертизе исходного текста программы в соответствии с логикой ее работы. Анализ различий – еще один способ поиска уязвимостей, при котором широко применяется утилита diff. Утилита diff, сравнивая две версии программы, позволяет найти внесенные в программу исправления. При исследовании выполнимого кода программы применяются различные средства: программы трассировки, отладчики, анализаторы, а также аудит документации.

Аудит исходного текста программы предполагает поиск потенциально опасных функций и применение методологии построчного аудита. В этой главе были рассмотрены примеры, демонстрирующие переполнение буфера при использовании функций strcpy, sprintf, strcat и gets. Были рассмотрены такие ошибки проверки входных данных, как уязвимость форматирующей строки функции printf и функции open в программе, написанной на языке Perl. Также был рассмотрен пример конкуренции программ за ресурсы и сопутствующая ей ошибка условия гонок на примере функции mktemp.

Реинжиниринг – один из наиболее часто используемых методов поиска уязвимостей в программе, исходный текст которой недоступен. Этот тип исследования проводится по методике «сверху вниз». Средства аудита в Windows можно найти на сайте sysinternals.com, а список Rosetta Stone поможет выбрать средства трассировки на различных платформах. В этой главе был рассмотрен пример трассировки команды cat сначала в среде Red Hat Linux и в Solaris 7.

Дизассемблер и отладчики позволяют исследовать выполнимый код. Дизассемблер (также известный как декомпилятор) – это программа, которая преобразует двоичный код в исходный текст программы на языке высокого уровня, но чаще всего на языке ассемблера. Отладчик – программа, которая может управлять выполнением другой программы. В этой главе был приведен пример дизассемблирования программы на платформе Windows с использованием отладчика IDA Pro, а также пример сессии отладки под управлением отладчика GDB в Linux. Также были обсуждены возможности программ objdump и nm. Программа objdump позволяет управлять объектными файлами программ, а nm — отображает содержащуюся в них символьную информацию.

«Черный ящик» – концептуальный компонент, чьи внутренние функции скрыты от пользователя. Тестирование «черного ящика» похоже на бинарный аудит. На практике к методам тестирования «черного ящика» прибегают при реинжиниринге интегральных схем. Определить предназначение чипа можно, изучив выходные сигналы чипа, а если это не поможет – вскрыв его корпус. «Черные ящики» могут различаться по степени своей прозрачности для исследователя, в зависимости от его знаний об устройстве анализируемой системы.

Конспект
Суть методологии исследования уязвимости

· Анализ и экспертиза исходного текста программы – идеальная методология поиска ее уязвимостей.

· Исследование исходного текста программ предполагает поиск подверженных ошибкам директив, построчную экспертизу исходного текста программы и изучение различий в нем.

· Изучение выполнимого кода программы осуществляется при помощи программ трассировки, отладчиков, модулей проверки текущего состояния программы (анализаторов) и аудита документации проектирования программы.

Значение экспертизы исходного текста программы

· Экспертиза исходного текста программы – необходимая часть обеспечения ее безопасности.

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

· Утилита grep может использоваться для повышения эффективности поиска подверженным ошибкам директив.

Технологии реинжиниринга

· На сайте www.sysinternals.com можно найти свободно распространяемые инструментальные средства аудита для Windows.

· Список Rosetta Stone (по адресу http://bhami.com/rosetta.html) позволяет найти программы трассировки для заданной платформы.

· Отладчики используются для управления выполнением исследуемой программы и поиска ошибок в ней или исследования логики ее работы.

Тестирование методом «черного ящика»

· Тестирование методом «черного ящика» позволяет обнаружить внутренние компоненты, скрытые от невооруженного взгляда исследователя.

· Вскрытие корпуса «черногоящика» – самый легкий способ для определения его внутреннего строения.

· Абсолютно «черныхящиков» нет. Одни из них – более «черные», а другие – менее.

Часто задаваемые вопросы

Приведенные вопросы и ответы авторов позволяют оценить степень уяснения читателем изложенного в главе материала и получить представление о возможности применения полученных знаний на практике. Если читатель захочет задать автору вопрос, то ему следует посетить сайт www.syngress.com/solutions, заполнить и отослать форму «Вопрос автору» («Ask the author»).


Вопрос: Какой наилучший метод исследования уязвимостей?

Ответ: На этот вопрос можно дать только субъективный ответ. Наилучший метод исследования уязвимостей – это тот, который исследователю наиболее знаком, наиболее удобен и позволит быстрее провести исследование. Рекомендуется поэкспериментировать с различными методами и схемами их применения.


Вопрос: Законны ли с юридической точки зрения декомпиляция и другие методы реинжиниринга?

Ответ: В Соединенных Штатах реинжиниринг скоро может стать противозаконным. В Акте авторского права цифрового тысячелетия (Dig^l Millennium Copyright Act) содержатся меры по предотвращению обхода обманным путем технологических мер управления доступом к работам, защищенным авторским правом. Исходный текст программы может быть защищен авторским правом, поэтому в этом случае реинжиниринг текста, защищенного авторским правом, противозаконен.


Вопрос: Какие инструментальные средства могут быть полезны при экспертизе сложных исходных текстов программ?

Ответ: Такие инструментальные средства, как SCCS и CVS, могут облегчить экспертизу исходного текста программы. Кроме того, применение интегрированных сред разработки (IDEs – Integrated Development Environmen) может облегчить экспертизу исходного текста.


Вопрос: Где можно узнать правила разработки защищенного программного обеспечения?

Ответ: Для этой цели подойдут ресурс Интернета «Часто задаваемые вопросы по разработке защищенного программного обеспечения в среде UNIX (Secure UNIX Programming FAQ)» по адресу www.whitefang.com/sup/secure-faq.html или список адресатов secprog, поддерживаемый Оливером Фридричсом (OliverFriedrichs).


Вопрос: Где можно достать утилиту strace для моей платформы?

Ответ: Утилита strace – инструментальное средство Linux. Наилучший выбор для платформы Windows, обладающий аналогичными функциональными возможностями, – IDO Pro. Truss реализует ту же самую функцию на платформе Solaris. Дополнительную информацию можно найти в документации производителя.


Вопрос: Откуда можно загрузить исходные тексты приведенных в главе примеров?

Ответ: Исходные тексты доступны по адресу www.syngress.com/solutions.

Глава 5
Поиск различий

В этой главе обсуждаются следующие темы:

Суть поиска различий

Исследование инсрументария поиска различий

Поиск неисправностей

· Резюме

· Конспект

· Часто задаваемые вопросы

Введение

Одно из самых простых средств, состоящих на вооружении хакера, – поиск различий (диффинг). Поиск различий заключается в сравнении программ, библиотек или любых других файлов до и после некоторых действий. Зачастую поиск различий, как одно из самых простых средств обнаружения уязвимостей, используется совместно с другими средствами и методами. Сравнивать можно файлы, базы данных, накопители информации. Сравнивая диски, определяют несовпадающие файлы. Сравнивая файлы – отличающиеся байты, а сравнивая базы данных – различающиеся записи. Поступая таким образом, можно найти способ целенаправленного изменения данных исследуемого приложения.

Суть поиска различий

Команда diff присутствует во многих современных операционных системах семейства UNIX и им подобных. Впервые она появилась в дистрибутиве UNIX компании AT&T, и в настоящее время эксплуатируются различные ее версии. Слово diff – сокращение от английского слова difference (различие) – означает составление списка различий двух файлов.

Таким образом, слово диффинг может быть определено как применение команды diff (или подобной программы) для сравнения двух файлов. Сравнивая файлы, можно выявить внесенные изменения в новую версию программы по сравнению с предыдущей, определить различия двоичных файлов, претендующих на эквивалентность, или отследить влияние изменений файла данных на работу программы.

Изучите исходный текст программы, приведенный на рис. 5.1.

Рис. 5.1. Исходный текст scpybufo.c


Уже говорилось о сопутствующей этой программе ошибке переполнения буфера. (Эта программа была рассмотрена в главе 4 в секции, посвященной переполнению буфера.) Просмотрите исходный текст программы, представленный на рис. 5.2.

Рис. 5.2. Исходный текст sncpyfix.c


Применяя команду diff операционной системы UNIX, можно точно определить место и суть различий между двумя программами (см. рис. 5.3).

Рис. 5.3. Результаты сравнения файлов scpybufo.c и sncpyfix.c командой diff


Из протокола работы команды видно, что относящиеся к файлу scpybufo.c данные отмечены символом <, а к файлу sncpyfix.c – символом >. Команда нашла первое отличие в заголовке этих файлов.

Со строки номер 25a24 начинаются различия в исходных текстах программ. Переменная Size_t есть в файле sncpyfix.c, но отсутствует в scpybufo.c. А в строке под номером 27c26 видна замена функции strcpy на strncpy. Хотя сравнить столь небольшие файлы можно и вручную, целесообразность применения команды diff для cравнения больших файлов более очевидна. Далее будут обсуждены причины поиска различий.

Почему нужно знать о различиях файлов?

Какая необходимость искать различия в файле или памяти до и после каких-либо действий? Причин может быть несколько. Например, потребуется найти местонахождение представляющих интерес данных. Если в распоряжении хакера окажется двоичный файл паролей приложения в неизвестном ему формате, то, скорее всего, ему будет интересно узнать, где именно в файле они хранятся.

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

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

Другая причина поиска различий кроется в исследовании безопасности программ. Во времена всеобщей открытости обычной практикой производителей остается выпуск обновлений программ без раскрытия их сути. Виновники этой практики – некоторые ведущие производители программного обеспечения, как, например, Microsoft, Hewlett-Packard и Caldera. С другой стороны, производители Linux (за исключением Caldera) – исключение из этого правила. А ряд компаний занимают промежуточную точку зрения по этому вопросу, как, например, Cisco.

Метод поиска различий позволяет изучить заявленную производителем уязвимость, но до конца им не раскрытую. В результате выявления различий в исходных текстах двух программ становятся ясны недостатки программы, и можно оценить их влияние на безопасность. Кроме того, выявленные различия позволят найти ошибки, которые производитель устранил без лишнего шума в старших версиях программы.

Просмотр исходного текста программы

Вернемся к обсуждению различий в исходных текстах программ. На рисунках 5.1 и 5.2 приведен исходный текст двух версий одной и той же программы. В первой версии программы выполнение функции strcpy могло привести к переполнению буфера, поэтому во второй версии ошибка была исправлена заменой функции strcpy на strncpy.

Благодаря отчету команды diff, приведенному на рис. 5.3, можно найти два исправления в исходном тексте программы. Первое состоит в добавлении переменной size_t в программу sncpyfix.c. Второе – в замене функции strcpy в программе scpybufo.c на функцию strncpy в программе sncpyfix.c.

Найти ошибки в открытых программных средствах относительно легко. (open source software – открытые программные средства – лицензионные программы вместе с их исходными текстами, не связанные ограничениями на дальнейшую модификацию и распространение с сохранением информации о первичном авторстве и внесенных изменениях). Зачастую это объясняется возможностью инсталляции файлов, устраняющих ошибки. Это можно наблюдать на примере патчей (заплаток), выпущенных производителями операционных систем семейства UNIX, например Linux и BSD. Проанализируйте патч на рис. 5.4 выявленной уязвимости FreeBSD-SA-02:02 (FreeBSD Security Advisory FreeBSD-SA-02:02).

Рис. 5.4. Исходный текст патча pw.patch FreeBSD


Этот патч представлен в унифицированном формате различий. Хотя предоставленная службой компьютерной безопасности FreeBSD информация о патче содержит все необходимые сведения, включая детальное описание уязвимости, анализ отчета результата сравнения двух файлов позволяет понять ее суть. Из первой строки протокола патча ясно, что он применяется к программе pwupd.c из директории usr.sbin/pw/.

Утилита pw операционной системы FreeBSD предназначена для добавления, удаления или модификации пользователей системы либо их групп. Выявленная уязвимость состояла в том, что при работе утилиты pw создавался временный файл с разрешениями, которые позволяли всем пользователям читать его. Разрешения временного файла в отчете выделены знаком минус (-). В результате пользователь мог получить доступ к зашифрованным паролям системы.

Автор самостоятельно проанализировал исходный текст утилиты pw. После получения двух версий исходных текстов (файл pwupd.c) утилиты (до и после внесения изменений) и их сравнения при помощи команды diff можно найти различия в исходных текстах данной программы, как это показано на рис. 5.5.

Рис. 5.5. Протокол различий программы pwupd.c версий 1.12.2.3.2.1 и 1.17


Из сравнения двух версий программы видны различия, аналогичные изменениям, показанным на рис. 5.4.

Приоткрывая завесу

Рекурсивный просмотр директорий

Что делать, если неизвестен файл, в который были внесены изменения? Что делать, если вместо подробной информации об уязвимости доступна только новая версия программы, содержащая многочисленные директории исходных текстов программ? Это именно тот случай, когда наиболее удобно воспользоваться командой diff для сравнения директорий.

Используя флаг рекурсии – г, содержимое директории может быть исследовано при помощи команды diff. При сравнении директорий в этом режиме сравниваются все файлы директории и все поддиректории заданной директории. Возможность рекурсивного сравнения присутствует в команде GNU diff и отсутствует в версиях других операционных систем.

Например, возможность рекурсивного сравнения отсутствует в команде diff операционной системы Solaris 8 и более ранних. Хотя, используя некоторые изощренные приемы работы с командной строкой, это можно выполнить. В соответствии с IAOQ (IAOQ – Ryan Tennant's (Argoth) Solaris Infrequently Asked Obscure Questions – список наиболее часто задаваемых вопросов повышенной сложности по системе Solaris Райана Теннанта (Argoth)) рекурсивный просмотр директорий может быть выполнен при помощи следующей команды:


/usr/bin/find. | /usr/bin/xargs /usr/bin/grep PATTERN


Список IAOQ находится по адресу http://shells.devunix.org/~argoth/iaoq.

В поисках золота. Игровой пример

В тринадцать лет автор загорелся идеей оказания воздействия на приложение путем непосредственной работы с файлами. В то время у него был компьютер Apple][+ и он в меру увлекался компьютерными играми. С точки зрения игр он вполне был на уровне мастерства, достигаемого за один-два года практики. Его любимой игрой была Ultima 2. Ultima 2 – это ролевая фантастическая игра, где вам предлагается сыграть роль героя, который в поисках золота может выбирать оружие для истребления монстров. Как в типичных играх этого жанра, цель состоит в повышении уровня мастерства и опыта в деле поиска золота. А попутно при этом решается еще ряд вопросов. Чем опытнее игрок, тем эффективнее он истребляет монстров, тем больше у него золота, тем лучшее оружие и амуницию он может купить.

Однажды автор захотел обмануть игру. Он устал честно убивать монстров. Уже в этом возрасте у него появились мысли, как подправить игру, обманув ее. Первое, что пришло ему в голову, – это изменить количество золотого запаса. Он знал, что при сохранении игры на диск записывается какая-то информация об игре. Нужно было только найти, где именно на диск сохраняются сведения о золотом запасе, и изменить их.

Использованная автором техника немного отличается от изложенной в этой главе, главным образом потому, что тогда в распоряжении автора были программные средства более примитивные, чем сегодня. Запомнив количество золота, автор сохранял игру, а затем завершал ее. В его распоряжении был редактор секторов – программа, позволяющая непосредственно редактировать сектора диска, обычно в шестнадцатеричном формате. Используя функцию поиска редактора, можно было по имени своего героя найти приблизительное место хранения информации, интересующей автора. Короче говоря, автор нашел несколько чисел, соответствующих золотому запасу героя на момент сохранения игры. Увеличив эти числа и сохранив изменения на диске, после загрузки игры автор убедился, что золотой запас героя возрос. Эврика! Это был первый хакинг автора. Таким образом, автор наткнулся на прием, который будет служить ему в течение многих лет.

Автор смог расширить свое маленькое исследование и написал редактор героев Ultima 2, который позволил ему изменять такие свойства героев, как их сила, ум, количество и тип оружия, амуниция и т. д. Конечно, сегодня, по прошествии многих лет, он раскаивается по поводу содеянного. (К сведению читателя автор сообщает, что недавно вышла Ultima IX. В среднем производитель выпускает новую версию игры каждые 2 года.) В настоящее время автор играет в разные фантастические ролевые игры, например Heroes of Might and Magic II, где игрок играет роль героя, пытающегося добыть золото, совершенствующего свое мастерство в деле убийства монстров… Ну, вы поняли идею. На рисунке 5.6 показан старт типичной игры.

Рис. 5.6. Начало игры Heroes of Might and Magic II


В частности, обратите внимание на золотой запас героя: 7500 порций. Первое, что делает автор, – он сохраняет игру под именем hackl. Затем он изменяет золотой запас на минимально возможную сумму. Вскоре автор объяснит причину своих поступков. Самое простое – это купить что-нибудь недорогое. Автор обычно отправляется в замок и покупает скелет – одну из самых дешевых вещей. После покупки скелета у автора становится 7425 порций золота. Автор сохраняет игру под именем hack2 и затем в режиме командной строки запускает команду сравнения файлов, как показано на рис. 5.7.

Рис. 5.7. Протокол сравнений двух файлов командой DOS fc


Команда fc сравнивает два файла. Если задать опцию /b, то выполняется побайтное сравнение. В результате печатается отчет найденных различий в шестнадцатеричном виде. Поэтому следующее, на чем следует остановиться, – это калькулятор Windows (программа calc.exe), который позволяет перевести числа 7500 и 7425 из десятичной системы счисления в шестнадцатеричную. Если выбрать подменю Scientific меню View калькулятора, то станут доступными дополнительные возможности преобразования чисел, включая преобразование из десятичного формата в шестнадцатеричное, что нам и требуется. При выбранном режиме Dec следует набрать 7500 и затем щелкнуть на кнопке Hex. В результате получим представление числа 7500 в шестнадцатеричной системе счисления 1D4C. Повторив то же самое для числа 7425, получаем 1D01.

Просмотрев результаты выполнения команды fc, обнаруживаем многообещающее различие по адресу 368 (в шестнадцатеричном представлении). Ранее там было 4C, а стало 01, что точно совпадает с проведенными вычислениями. Также можно предположить значения других чисел. Ранее в замке было восемь скелетов. После покупки одного осталось семь. На это, кажется, указывает байт по адресу 3AE4. Байт по адресу 3AD3 может означать один скелет в гарнизоне замка, где прежде не было ни одного.

Но поскольку автора интересует золотой запас, то он запускает шестнадцатеричный редактор и загружает файл hack2.gm1. Шестнадцатеричный редактор схож с редактором секторов, но ориентирован на работу с файлами, а не с дисковой памятью. Перейдя по смещению 368, видим, что там находятся данные 1D 01. Отметим, что цифры в числе расположены в обратном порядке, что непривычно для людей, которые используют язык, имеющий одинаковые корни с латинским языком. Объясняется это порядком запоминания чисел в процессорах Intel: наименее значащий байт числа запоминается по младшему адресу. Есть единственный способ удостовериться в правильности предположения о хранении найденной величины – изменить найденный байт. Автор изменил самый правый байт числа 1D (поскольку в этом случае результаты изменения проявятся сильнее всего) на величину FF (максимальная величина в шестнадцатеричной системе счисления). На рисунке 5.8 показан результат загрузки hack2.gm1 при старте игры.

Рис. 5.8. Та же игра после редактирования ее сохраненных данных


Обратите внимание на золотой запас, который теперь составляет 65 281 порцию. Быстрая проверка на компьютере подтверждает, что это десятичное представление шестнадцатеричного числа FF01. Теперь у игрока появилось серьезное преимущество: он может с легкостью крушить своих воображаемых врагов. Если бы игрок захотел увеличить свой золотой запас до максимально возможной в игре величины, то ему следовало бы также увеличить следующий байт справа от 1D, который в момент исследования был равен 0. В худшем случае несколько попыток изменения смежных байт в файле с помощью шестнадцатеричного редактора подскажут, какой байт следует изменить для увеличения золотого запаса игрока.

Конечно, цель этой книги не в том, чтобы научить читателя обманывать игры. Есть более достойное применение изложенного материала. В частности, для подобных игр написан редактор сохранения игр, возможно, на основе использования изложенной техники. Также можно включить в игру несколько фрагментов кода, страхующих игрока от проигрыша. Читателю, заинтересовавшемуся подобными вопросами, можно посоветовать найти эту информацию в Интернете.

Если читатель знаком с игрой, то он может быть удивлен, почему изложенное не проиллюстрировано на примере современной версий игры Heroes of Might и Magic III. Причина будет раскрыта далее.


Страницы книги >> Предыдущая | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Следующая
  • 4.6 Оценок: 5

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации