Добавлено: 23 Ноя 2006 01:04 Заголовок сообщения: Взлом генератора паролей сеговской игры Zero Tolerance.
Вначале общие положения.
Пароль может состоять из 64 символов:
Код:
A B C D E F G H
J K L M N O P Q
R S T U V W X Y
Z a b c d e f g
h i j k m n o p
q r s t u v w x
y z 2 3 4 5 6 7
8 9 ? ) ! / - *
Соответствие символьного и двоичного представления пока неизвестно, но
скорее всего коды представленных символов идут не последовательно от 0
до 63, а как нибудь в перепутанном виде. (Пока не известно точно, но
это нужно учитывать).
Длина пароля составляет 9 6-битных символов, то есть всего 54 бита.
Теперь о условиях генерации пароля.
Всего в игре 5 коммандос: Satoe Ishii, Tony Ramos, Justin Wolf,
Scott Haile и Tomas Gjoerup. Все коды проверяются Tony Ramos-ом, так
как у него нет дополнительной аммуниции, котоорая добавляется к
введенному паролю.
При генерации пароля игра учитывает следующие параметры:
1. Аммуниция в 1-5 клетках инвентаря.
2. Кто из отряда убит (Decased).
3. Номер этапа.
4. Показатель жизненной энергии.
Опытным путем было выяснено, что количество аммуниции сохраняется
не точно, а с некоторым округленим, для экономии места в пароле.
Аммуниция условно делится на два вида - стрелковое оружие и экипировка.
Стрелковое оружие: Пистолет, Шотган, Мина, Лазерная Винтовка,
Граната, Ракетница, Лазерный Пистолет. Максимальное количество зарядов
у любой пушки - 99.
Экипировка: Бронежилет, Огнетушитель, Огнеупорный Костюм, Фонарь,
Био-сканер, Прибор Ночного Видения, Огнемет. Максимальное количество
зарядов у любой аммуниции - 100, но заряды тратятся десятками.
Значения энергии и аммуниции в пароле округляются следующим образом:
Округление энергии E (таблица не закончена):
Ещё одна особенность - как распологается оружие и экипировка в
клетках, после набора пароля. Там просматривается некая упорядоченность
- по старшинству.
Самое старшее распологается в 3 клетке,
2 по старшенству в 4 клетке,
3 по старшенству в 5 клетке,
4 по старшенству в 1 клетке,
5 по старшенству во 2 клетке.
Видимо это связано с порядковым номером оружия/экипировки в пароле.
Пока что ряд у меня такой: Био-Сканер, Бронежилет, Огнетушитель,
Гранаты, Пистолет, Лазерный пистолет, Ракетница, Шотган, Огнемет,
Лазерная винтовка. Не ясен порядковый номер для: Мина, Огнеупорный
Костюм, Фонарь и Прибор Ночного Видения.
Всего в игре 40 этапов, условно обозначенных #0...#39.
Итак, вот обобщение о значениях входящих в пароль:
Пароль состоит из 54 бит.
- (4 (порядковый номер) + 3 (количество зарядов)) * 5 (клеток) = 35 бит занимает аммуниция.
- 5 бит занимает количество живых бойцов (один боец - один бит)
- 6 бит занимает номер этапа (всего 40 уровней)
- 6 или 7 бит занимает энергия
- Ещё сколько-то бит занимает возможная контрольная сумма
Некоторые предположения о генерации пароля: скорее всего в пароле
используется какой-нибудь запутанный алгоритм для защиты от простого
пербора уменьшением какого-нибудь параметра на 1. Также возможно
используется "контрольная сумма" для проверки правильности пароля.
Коды с пустым инвентарем, E=98 и всеми бойцами (меняется только этап):
(Чтобы получить такой пароль достаточно растратить весь боезапас перед получением пароля).
И напоследок пара хак-паролей, которые невозможно получить, честно играя в игру :)
!QLKrQZ6p - пароль с нулевой жизненной энергией
DFg***Kvx - второй уровень с лазерной винтовкой!0 error(s), 0 warning(s)
Последний раз редактировалось: Organic (23 Ноя 2006 04:53), всего редактировалось 1 раз
Тут с: 30.04.2003 Сообщения: 1414 Я из: Moscow, Russia
Добавлено: 23 Ноя 2006 01:43 Заголовок сообщения:
А есть возможность, что в игре есть что-то, что никто еще не видел: другое оружие и уровни?Don`t panic!!!
Status:..До чего же назойливыми бывают Wizzard`ы!!!
Всё может быть.. Там для уровней зарезервировано 64 номера (6 бит), а в игре только 40 уровней. Может и секретный есть ;)
добавлено спустя 1 час 18 минут:
Путем ром-хакинга удалось установить, что реальная таблица символов, на самом деле выглядит так:
Код:
x B ? D E j G H
) J K L M N O P
R S T U V Q W X
Y Z a b e f c d
h i g F k ! m n
o p q r s t u v
w y A z 2 7 4 5
3 9 6 8 C / - *
(Это довольно распространенный прием в генераторах паролей на приставках - называется замена алфавита).
То есть, к примеру пароль !QLKrQZ6p на самом деле будет nWMtWa?r. Если
записать его в 8-ричной системе счисления, то он будет выглядеть так
4525135325317251.
Есть прогресс. Теперь осталось выяснить как изменяются биты при
изменении, например, количества живых коммандос, или после изменения
номера этапа.
добавлено спустя 17 часов 4 минуты:
Простым подбором получить алгоритм не удалось, значит придется
хакать ром с помощью отладчика Gens и его модификации Gens Tracer 2.14.
Начинаем трассировку в Gense, вывалившись в его отладчик.. Там он
крутится на каком-то цикле. Все такие циклы мы пропускаем кнопкой N.
Тут кажется мы ждем окончания VBlank (программный триггер).
И опять заново !!!!!
Следующий шаг - получение битовой карты кнопок и разбор действий по
нажатию. Битовую карту можно получить в трассёре поставив бряк на
запись в [$FF002E].
Ставим бряк hook_wr1 1 ff002e ff0030, в hook_log.txt, потом запускаем эмулятор, заходим в меню набора пароля, нажимаем на клаве , (тем самым включив лог) и начинаем ловить нажатия кнопок в hook.txt.
Битовая карта:
Код:
Значение WORD ($FF002E).
U 0x0190 A 0x4090
D 0x0290 B 0x1090
L 0x0490 C 0x2090
R 0x0890 S 0x8090
Значение пароля которое рисуется на экране хранится в массиве по
адресу $FF000A. Данная процедура устанавливает его значение по
умолчанию: "_________\0".
Переменная -$791A(A6): Количество введенных букв (max. 9)
Массив -$7FF6(A6): Пароль в ASCII-Z.
-$791C(A6) - координата курсора X. (?)
-$791E(A6) - координата курсора Y. (?)
Адрес текущего символа вычисляется как (X * 8 + Y), так как таблица символов организована как матрица 8x8.
По адресу 585A2 находится исходный алфавит.
Беглым просмотром видно что нажатие на DEL CANCEL и DONE
реализовано прикольно. Для определения нажатия на DEL, CANCEL или DONE
используются дополнительные символы в конце алфавита:
Так выглядит таблица символов:
Код:
A B C D E F G H
J K L M N O P Q
R S T U V W X Y
Z a b c d e f g
h i j k m n o p
q r s t u v w x
y z 2 3 4 5 6 7
8 9 ? ) ! / - *
DEL CANCEL DONE
Как видно DEL, CANCEL и DONE при движении курсора тоже имеют
координаты. Соответсвенно, когда алгоритм проверяет нажатие на кнопку,
он вычисляет адрес символа в алфвите как X * 8 + Y, и когда происходит нажатие на DONE, то вместо символа из алфавита берется псевдо-код "0x0D".
Ну допустим мы ввели код "AAABBBCCC", теперь проследим поведение
программы при нажатии на DONE. Gens не поддерживает нажатие кнопок
джойпада в отладчике, поэтому просто обманем переходы, пропустив их
кнопкой N.
Тааак. Это секретные пароли, прописанные жесткой проверкой!
Highrise! Basement! Boxing!!! (У разработчиков всё в порядке с чувством юмора :))0 error(s), 0 warning(s)
Тут с: 12.08.2004 Сообщения: 424 Я из: С-Петербург
Добавлено: 23 Ноя 2006 23:43 Заголовок сообщения:
Здорово.
Что интересно, не только полный комплект оружия, но и сканер и бронежилет имеют 990% (в нормальном режиме 100%)
А почему на первую часть такого пароля нет?
Интересно, а как оно будет на дух игроков, особенно Boxing! ?. Придется завтра срочно паять линк кабель
PS
Огромный респект не только за работу, но и за изложениеДао, выраженное словами, не есть истинное Дао
Из предыдущего эксперимента мы узнали о
секретных паролях. В программном коде для таких паролей специально для
хакеров жестко записали ключевые переменные (смещение условное):
Как оказалось экипировка не ограничивается 100%, и может принимать максимальное значение 990%
Уровни:
Код:
0 Docking Bay Level 1 16 High Rise Roof Top 32 Sub Basement Level 1
1 Docking Bay Level 2 17 High Rise Floor 164 33 Sub Basement Level 2
2 Bridge Level 1 18 High Rise Floor 163 34 Sub Basement Level 3
3 Engineering Level 1 19 High Rise Floor 162 35 Sub Basement Level 4
4 Engineering Level 2 20 High Rise Floor 161 36 Sub Basement Level 5
5 Engineering Level 3 21 High Rise Floor 160 37 Sub Basement Level 6
6 Engineering Level 4 22 High Rise Floor 159 38 Sub Basement Level 7
7 Greenhouse Level 1 23 High Rise Floor 158 39 Sub Basement Level 8
8 Greenhouse Level 2 24 High Rise Floor 157 40 Sub Basement Level 9
9 Greenhouse Level 3 25 High Rise Floor 156 41 Sub Basement Level 10
10 Bridge Level 2 26 High Rise Floor 155 42 Sub Basement Level 11
11 Reactor Level 1 27 High Rise Floor 154 43 Sub Basement Level 12
12 Reactor Level 2 28 High Rise Floor 153 44 ... Пустые уровни
13 Лабиринт 29 High Rise Floor 152
14 Dockbridge Room 2 30 High Rise Floor 151
15 Одиночная камера 31 Бокс!
Ну вот и подошли к самому главному - к проверке и декодированию
пароля. Этим занимается функция по адресу $00058A74. На входе у неё адрес ASCII-Z строки с паролем для проверки. Функция возвращает 0, если код верный и -1, если код неправильный (INCORRECT).0 error(s), 0 warning(s)
Эти циклы обычно делают для выдержки таймингов при выполнении
второстепенных, с точки зрения игровой логики, процедур (прорисовка
спрайтов и т.п.). При взломе их, как и было сказано, следует
пропускать. Лучше даже делать вспомогательные Game Genie-коды (в данном
случае - 001A3C:4E71), чтобы снова не нажимать N, если игре вдруг
"вздумается" опять войти в такой цикл.
Valet2 писал:
Кстати, эти три пароля в свое время GManiac, что ли, открыл.
Nick'O'Dimm, насколько я помню. Однако GManiac нашел кучу других секретов для разных игр, и мне трудно поверить, что это был не он. :)С уважением, Chemist.
Я больше не буду нагружать тут дизасмом, а лучше разберу процесс декодирования на примере. В качестве примера я выбрал пароль AAABBBCCC (он заведомо неправильный).
Шаг 1.
Вначале "AAABBBCCC" переводится в двоичный символьный формат, так
как изначально пароль записан символами ASCII. Для перевода
используется следующая таблица:
Код:
0 1 2 3 4 5 6 7
________________
0 | x B ? D E j G H
1 | ) J K L M N O P
2 | R S T U V Q W X
3 | Y Z a b e f c d
4 | h i g F k ! m n
5 | o p q r s t u v
6 | w y A z 2 7 4 5
7 | 3 9 6 8 C / - *
Следовательно "AAABBBCCC" запишется в виде 062 062 062 001 001 001
074 074 074. Битовая последовательность соответственно выглядит так:
Код:
00110010|00110010|00110010|00000001|00000001|00000001|00111100|00111100|00111100
"A" "A"
"A" "B" "B"
"B" "C" "C"
"C"
Шаг 2.
Далее эта битовая последовательность пакуется странным методом
(такого я ещё не видел). Вместо того, чтобы "вырезать" лишние 2 нуля из
каждого байта и потом всё вместе склеить, алгоритм поступает следующим
образом:
Код:
10.110010|0010.1100|000001.11|01.000001|1100.0000|111100.11|--111100|
<-------- <-------- <-------- <-------- <-------- <-------- <--------
AA AAAAAA AAAA AAAA BBBBBB AA BB BBBBBB CCCC BBBB CCCCCC CC CCCCCC
Сверху я написал во что превращается последовательность, а снизу
дописал откуда взялись и как получились эти биты. Вообщем запаковка
происходит шиворот-навыворот и задом-наперед. Где здесь прячется номер
уровня или энергия пока абсолютно непонятно.
Шаг 3.
XOR-им полученную битовую последовательность ключем
0x69AD286B95D98B (причем ключ генерируется программно). Операция
исключающее-или является элементарным способом шифрования. Не зная
ключ, узнать оригинальную последовательность хрен получится.
Так вот если контрольная сумма Z = (A + B + C + D + E + F) &
0xFF не совпадает, то пароль считается неверным. Естественно для нашего
примера: 0x9E не равно 0x2B6. Придется тогда взять правильный пароль. :)
добавлено спустя 2 часа 54 минуты:
Проверка на рабочем пароле.
MdU*58?mQ
40 уровень, 93 энергии, 90% огнемет, 55 лазерная винтовка, 80 гранат, 6 лазерный пистолет, 68 шотган. Все спецназовцы в строю.
Шаг 1. MdU*58?mQ -> 014 037 023 077 067 073 002 046 025
Шаг 2. 0xCC37FDF72E9815
Шаг 3. 0xCC37FDF72E9815 ^ 0x69AD286B95D98B = 0xA59AD59CBB419E
Шаг 4. Reorder -> 0x1F48377AF2670C
Шаг 5. A + B + C + D + E + F = 0x231, Z = 0x31. 0x231 & 0xFF = 0x31. OK
Биты 5-18 (W1-W14): Содержат маску, каждый бит которой указывает
пристутсвует-ли данное оружие в инвентаре или нет. Например
установленный бит W1 означает что в инвентаре есть Био-сканер. В данном
случае эти биты равны: 111.01001000.000, т.е. в инвентаре есть
следующая экипировка:
W7: Гранаты
W10: Лазерный пистолет
W12: Шотган
W13: Огнемет
W14: Лазерная винтовка
Примечание: должно быть установлено не более 5 битов (типов
оружия), иначе пароль будет считаться неправильным. Кстати такой способ
задания автоматически сортирует инвентарь по номеру оружия :)
Биты 19-21: Ammo0
Биты 22-24: Ammo1
Биты 25-27: Ammo2
Биты 28-30: Ammo3
Биты 31-33: Ammo4
Итоговое количество патрон считается по следующим формулам:
Для стрелкового оружия: ((Ammo * 2 + 1) * 99) >> 4.
Для экипировки: ((Ammo * 2 + 1) * 10) >> 4.
В нашем случае:
Ammo0 = 110, ((6 * 2 + 1) * 99) >> 4 = 80 гранат
Ammo1 = 000, ((0 * 2 + 1) * 99) >> 4 = 6 лазерный пистолет
Ammo2 = 101, ((5 * 2 + 1) * 99) >> 4 = 68 шотган
Ammo3 = 111, ((7 * 2 + 1) * 10) >> 4 = 90% огнемет
Ammo4 = 100, ((4 * 2 + 1) * 99) >> 4 = 55 лазерная винтовка
Как видно честным путем получить для экипировки больше чем 100%
боезапаса нельзя :( Это позволяют сделать только секретные пароли..
Биты 34-39: Energy0
Итоговое значение энергии считается по следующей формуле:
E = ((Energy0 * 2 + 1) * 100) >> 7.
В данном случае: E = ((60 * 2 + 1) * 100) >> 7 = 94.
Биты 40-45: Номер уровня - 1, в данном случае Level = 39 + 1 = 40.
Попасть на 0-й уровень (Docking Bay Level 1) через пароль тоже нельзя :(
Кроме того пароль не пускает на следующие уровни: 13, 13, 15, 31 (бокс) и на 44-63.
Ну вот и всё, осталось написать программку, которая создает и декодирует пароли!0 error(s), 0 warning(s)
На остальные три уровня по идее попасть нельзя, т.е. игра тоже выдает INCORRECT.
На эти уровни можно попасть только хакнув ром.0 error(s), 0 warning(s)
Тут с: 12.08.2004 Сообщения: 424 Я из: С-Петербург
Добавлено: 29 Ноя 2006 15:44 Заголовок сообщения:
Organic, ты заинтриговал общественность до невозомжности :)
13 Лабиринт
14 Dockbridge Room 2
15 Одиночная камера
То есть ты их видел, раз есть названия?Дао, выраженное словами, не есть истинное Дао
Тут с: 06.01.2002 Сообщения: 1290 Я из: I'm from Peter, from cool wild Peter!!!
Добавлено: 29 Ноя 2006 21:01 Заголовок сообщения:
Карты уровней хранятся в роме в несжатом виде.
Их можно даже увидеть и перерисовать в графическом режиме. Можно
переделать игру, создать подобие своего мода.
В файле hook_log.txt описано, как делается лог в файл hook.txt по факту чего-либо, но никак не бряк. Вообще, довольно неудобно всё это.
Насчёт уровней: по адресу 58F18 есть таблица существования уровней,
если байт 00, уровня нет, и игра выдаёт INCORRECT PASSWORD, иначе
пароль верный. Исправив эту таблицу, можно попасть на левые уровни,
однако они имеют карты каких-то других (например, 14-й имеет карту 2-го
или 3-го, не помню, 15-й - тоже какого-то из начальных, но из-за кривых
координат наш герой оказывается на стенке, из-за чего мы находимся в
"камере-одиночке"). Для уровней 13-15 снизу от большой карты на паузе
написано "REACTOR 2" (поищите эту строку в роме - первое вхождение
приводит к таблице надписей под картой, там эта строка повторяется ещё
3 раза), а наверху ничего нет (найдите с этой строкой вторую таблицу
(без слов ENTERING), там после неё 3 пустых строки)
Отмечу, что всего пароль проверяется аж 3 раза (в т.ч. секретные):
1) в меню пароля, когда игра должна сказать, он верный или нет
2) после выбора меню Start перед появлением некоего рисунка. В этот момент, насколько я понял, загружается карта уровня
3) после картинки, перед выбором коммандоса. В это время загружается внешний вид уровня.
Что за уровни с номерами >44 понять не смог, наверно, опять повторы других, но на паузе отображается глюк.Мысль - это интеллектуальный эксцесс данного индивидуума.
> Organic, ты заинтриговал общественность до невозомжности :)
> 13 Лабиринт
> 14 Dockbridge Room 2
> 15 Одиночная камера
> То есть ты их видел, раз есть названия?
>> На эти уровни можно попасть только хакнув ром.
Конечно я видел эти уровни, но через пароль или обычным
прохождением на них попасть нельзя. Эти уровни были добавлены
разработчиками для отладки графического рендерера. Извиняюсь за
повторения, но что-то не доходит..0 error(s), 0 warning(s)