Вечно жить не запретишь

крис касперски ака мыщъх

Хакер, номер #087, стр. 087-064-1

Взлом компьютерных игр своими руками

Получить бессмертие и полный боекомплект практически в любой игре — это совсем несложно! Потребуется всего лишь hex-редактор и несколько минут свободного времени. Сегодня пробил час: Крис Касперски поделится с тобой древними алхимическими рецептами, дошедшими до нас со временен ZX-SPECTRUM и накопившими огромный потенциал.

вечная жизнь

Что хорошего в вечной жизни? Да ничего в ней хорошего нет, если разобраться! Это же сплошные напряги и тоска смертная. Никакого тебе суицида, только бесконечные патроны. И сердце не екнет при случке с монстром, появляющимся как раз тогда, когда боезапас на исходе и здоровья нет ни хрена. Взломанная игра теряет свое очарование. Но все-таки без взлома никакое хорошее дело не обходится. Игра может содержать баг, делающий ее непроходимой (если в UFO 2 замучить живого таоста, то Cydonia/L'Tech в ресерче не появится никогда), или просто хочется погонять монстров, снять напряжение после тяжелого дня и не думать ни о здоровье, ни о патронах. Наконец взлом интересен сам по себе, с технической точки зрения.

рецепт бессмертия

Рецепт бессмертия обычно представляет манускрипт со смещением ячейки, которую необходимо хакнуть, прописав сюда максимальное количество жизней или заменив инструкцию DEC на NOP. Как найти эту магическую позицию во многомегабайтной мешанине кода и данных? Некоторые скажут: "Взять дизассемблер и проанализировать программу", но… современные игры так велики, что этот проект даже не обсуждается. Пошлем таких советчиков подальше, а сами пойдем более разумным путем.

общая тактика и стратегия

Как несложно догадаться, патроны, жизни, артефакты и прочее барахло — все это переменные, хранящиеся в определенных ячейках и всегда выражаемые числами. С точки зрения компьютера, эти ячейки ничем не отличаются от огромного множества остальных, содержащих в себе координаты монстров, текстуры и прочие объекты игрового мира. Как установить, за что отвечает та или иная ячейка? Самое простое, что приходит в голову — просто методично изменять одну ячейку за другой, наблюдая за реакцией игры, которой в этом случае, скорее всего, будет срыв крыши или повисание. Зная точное количество жизней/патронов, можно значительно сузить круг поиска, исследуя только те ячейки, которые содержат нужное значение. Однако следует помнить, что соответствие может быть как прямым, так и обратным. Одни программисты ведут учет жизней, другие — смертей, причем отсчет может вестись как от единицы, так и от нуля, а в некоторых случаях и -1. Допустим, у нас есть три нерастраченных жизни. Означает ли это, что переменная live_count обязательно будет равна трем? Разумеется, нет! В ней вполне может быть 2 (и тогда игра заканчивается, когда live_count < 0) или ноль (игра заканчивается при live_count > 2). Возможны и другие значения. С патронами в этом плане все обстоит намного лучше и чаще всего они хранятся в памяти «как есть», однако количество ложных срабатываний все равно будет очень велико! Допустим, у нас есть 50 патронов, и мы ищем 32h в дампе программы. Да там этих 32h целый миллион! До конца сезона все не переберешь! Ключ к решению лежит в изменениях! Наблюдая за характером изменения различных ячеек, мы легко отделим зерна от плевел. План наших действий выглядит так:

Содержание  Вперед на стр. 087-064-2
ttfb: 3.8549900054932 ms