Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #87, МАРТ 2006 г.

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

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

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


1. снимаем с программы дамп (сохраняем состояние игры в файле)

2. двигаемся без потери жизней и патронов, после чего снимаем еще один дамп

3. делаем один выстрел (теряем несколько процентов жизни) и получаем очередной дамп

4. повторяем предыдущую операцию несколько раз (3-х дампов обычно достаточно)

Сравнение первого и второго дампов (сэйвов) показывает кучу отличий, соответствующих передвижениям монстров и прочим изменениям игрового мира. Но ни патронов, ни жизней в изменившихся ячейках не оказывается — ведь эти параметры заведомо не менялись! ОК, вычеркиваем изменившиеся ячейки из списка «подозреваемых» лиц и сравниваем второй дам с третьим, игнорируя ранее изменявшиеся ячейки. На этот раз отличий будет не так уж и много. Ищем ячейки, дельта изменения которых соответствует количеству выстрелов или потерянных жизней/здоровья. Если таких ячеек больше одной, повторяем операцию 3 до тех пор, пока не останется только одна изменившаяся ячейка или, как вариант, последовательно хачим все подходящие ячейки в надежде, что рано или поздно нам повезет. В некоторых играх количество патронов хранится в нескольких переменных, дублирующих друг друга, но только одна из них значима, а остальные на хакерском жаргоне называются «тенями», отвечающими, например, за вывод текущего значения на экран. При модификации «теневой» переменной количество патронов/жизней чаще всего остается неизменным, и даже если оно возрастает, оружие перестает стрелять задолго до исчерпания своего боезапаса, а нас все равно убивают. Сравнивать можно как дампы памяти, снятые с работающей программы, так и «сэйвы» — файлы сохранений. Зная адрес нужной ячейки, мы можем повесить резидента, прописывающего сюда максимально возможное значение и при необходимости обновляющего его каждые несколько секунд (или чаще). Еще можно запустить soft-ice и, установив точку останова, перехватить тот код, который уменьшает количество патронов с каждым выстрелом — тогда мы сможем его хакнуть. Но это потребует дополнительных телодвижений, что не всегда удобно, поэтому многие хакеры ограничиваются правкой сэйвов, выдавая игроку полный боезапас и максимум здоровья, однако подлинное бессмертие в этом случае уже не достигается — патроны и жизни продолжают убывать, и, чтобы не умереть, их приходится постоянно пополнять. Кроме того, некоторые монстры убивают наповал одной ракетой!

хак в памяти

Начнем со сравнения дампов памяти. Выберем игру и будем над ней издеваться. Пусть это будет, например, DOOM Legacy – лучший порт классического DOOM'а, бесплатно распространяемый вместе с исходными текстами и замечательно работающий как под LINUX, так и под win32 (смотри рис. 2). На момент написания этих строк последней стабильной версий была версия 1.42. Вот прямой линк для скачки: www.prdownloads.sourceforge.net/doomlegacy/legacy142.exe?download. Для согласования наших действий рекомендуется использовать именно эту версию, иначе все смещения уползут неизвестно куда, но если ты себя чувствуешь достаточно подготовленным — попробуй потерзать более свежие беты, доступные с основной страницы проекта. Кроме DOOM Legacy, нам также потребуются wad-файлы из оригинального DOOM/DOOM2 или HERITC'а. Ну DOOM-то наверняка у каждого найдется! Берем любой приличный дампер, например PE Tools или LordPE, находим процесс legacy.exe и снимаем с работающей игрушки full dump, обзывая файл, к примеру, dump_1.exe. Условимся считать, что в этот момент у нас имеется 50 патронов.

Назад на стр. 087-064-1  Содержание  Вперед на стр. 087-064-3