Архив статей
Обновление: 24.05.2014
Всего статей: 17


Ремонт и сервис
Обновление: 01.05.2014
Документов: 8


Программирование
Обновление: 18.04.2014
Разделов: 2


Скачать
Общий объём: 4.3 Mb
Файлов: 12


ICQ: 680172615
rumit-71@mail.ru

Наши новости
24.05.2014 Полность переработано содержимое и обновлён интерфейс сайта
01.05.2014 Добавлены статьи в разделы "Ремонт и сервис", "Железо"
01.05.2014 Добавлены несколько нужных программы для бесплатного пользования
Юзаем ресурсы любимой игрушки

Получить бессмертие и полный боекомплект практически в любой игре - это реально! Потребуется всего лишь hex-редактор и несколько минут свободного времени.

Очень часто ресурсы находятся на поверхности. К примеру, легко можно изменить логотип, лежащий в *.bmp файле. А если логотип имеет расширением *.ttt, или вообще без расширения? Вот тут и возникает растерянность.

Итак, ты установил игрушку. Теперь открывай проводник (тотал), и начинай поиск знакомых файлов (типа *.BMP, *.PCX, *.WAV и т.д). Стратегия проста: нашёл, отредактировал, сохранил. Но эта стратегия работает не всегда. В большинстве случаев ресурсы маскируют, и тут мы переходим к конкретным примерам.

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

Итак, логотипы могут находятся в файлах *.016 и *.256. Первый содержит 16 цветов в палитре, второй 256. Так же могут встречаться расширения *.CRF. ...никакие это не CRF, а простые ZIP-файлы. В большинстве из них лежат PCX-файлы, или звуковые файлы *.WAV.

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

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

Зная точное количество жизней/патронов, мы значительно сужаем круг поиска, исследуя только нужные ячейки. Однако следует помнить, что одни разработчики игр ведут учёт жизней, другие - смертей, причем отсчет может вестись как от единицы, так и от нуля.

С патронами всё обстоит намного лучше и чаще всего они хранятся в памяти "как есть". Допустим, у нас есть 50 патронов и мы ищем 32h в дампе программы (50d=32h). ...да там этих 32h целый мульён!

Ключ к решению лежит в изменениях! Наблюдая за изменениями различных ячеек при определённых условиях игры, легко отделить жизни от патронов. План наших действий выглядит так:

1) Снимаем с программы дамп (сохраняем состояние игры в файле);
2) "Двигаем попой" без потери жизней и патронов, после чего снимаем еще один дамп;
3) Не двигаясь делаем один выстрел и получаем очередной дамп;
4) Повторяем третью операцию несколько раз (3 дампов обычно достаточно);

Сравнение первого и второго дампов показывает кучу отличий, соответствующих изменениям игрового мира. Но патронов/жизней в изменившихся ячейках нет - ведь мы эти параметры заведомо не меняли! Сравниваем второй дамп с третьим...

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

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


Хак в памяти
Сравнивать можно как дампы памяти, снятые с работающей программы, так и "сейвы" - файлы сохранений. Зная адрес нужной ячейки, мы можем повесить резидента, прописывающего сюда максимально возможное значение и обновляющего его каждые несколько секунд.

Начнем со сравнения дампов памяти. Выберем игру и будем над ней издеваться.

Берем любой Hex-редактор (WinHex), находим процесс игры [Alt+F9] и снимаем с работающей игрушки дамп, обзывая его "dump1". Условимся считать, что в этот момент у нас имеется 50 патронов. Возвращаемся в игру, тащим свою задницу куда-нибудь и дампимся еще раз, создавая файл dump2. Затем стреляем и сбрасываем dump3, стреляем еще и получаем dump4.

После всех операций у нас оказываются четыре файла: dump1/dump2 с 50 патронами (32h), и dump3/dump4 с 49(31h) и 48(30h) патронами соответственно. Теперь мы должны сравнить все четыре файла и найти такие ячейки, которые совпадают в dump1 и dump2, но отличаются у всех остальных. Переменные, отвечающие за хранение количества патронов, будут где-то среди них.

Для решения этой задачи запускаем cmd.exe и вводим fc/?:

fc /b dump2 dump3 > log.txt

raw offset dump2 dump3

000A2FF1h: 1Ch   00h
000A2FF6h: 59h   00h
000A2FFAh: 02h   00h
000A2FFCh: FCh   00h
000CFBA0h: FEh   FDh
00152262h: A1h   60h
001523E2h: A1h   60h
00166574h: 32h   31h
001666B4h: 32h   31h
00168F28h: 32h   31h

001772A5h: 65h   64h
00177538h: CCh   4Ah
001775ECh: C7h   26h
00177A10h: 08h   04h
00177AC5h: 49h   48h
001C8724h: 06h   0Fh

Сразу в глаза бросается цепочка 32h, 31h, соответствующая десятичным числам: 50 и 49. Ага! Это и есть количество патронов! Эта переменная встречается в дампе трижды по смещениям 00166574h, 001666B4h, 00168F28h. Одна из них настоящая, остальные - тени.

Герой с бесконечными патрона

© Права защишены 2010-2014г.
rumit-71@mail.ru