Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Пароль на Immortal (NES)

 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
Griever
RRC2008
RRC2008


Зарегистрирован: 15.07.2005
Сообщения: 112
Откуда: Н.Новгород

СообщениеДобавлено: Сб Июл 08, 2006 2:13 pm    Заголовок сообщения: Пароль на Immortal (NES) Ответить с цитатой

Итак, мне очень надо узнать как хранится инвентарь в паролях для игры на NES Immortal. Конечно, полмесяца не прошли зря,
так что теперь мне есть что предъявить:

информация о вещах в рюкзаке героя хранится только в двух знаках пароля: десятом и одиннадцатом.
(соответственно $07e0 и $07e1 в РАМе на момент, когда игра генерирует пароль или $0088 и $0089 на момент, когда пароль
вводится) Я так же нашел байт, который отвечает за количество вещей($04DB в РАМе)... По крайней мере я был в нем уверен до последнего времени, т.к. теперь я полагаю, что в формировании пароля он или не участвует вообще или участвует не он один. Основная моя проблема в том, что я не могу понять как некоторый байт 'превращается' в два знака пароля. Я надеюсь это понятно. Вот непосредственно сам код, который отнял у меня лучшую половину месяца и в котором я так и не смог разобраться до конца:

Код:
A9 00     LDA #$00
$EA15:8D E0 07  STA $07E0 = #$00; десятый знак
$EA18:A9 00     LDA #$00
$EA1A:8D E1 07  STA $07E1 = #$00; одиннадцатый знак
$EA1D:A2 00     LDX #$00
$EA1F:A9 1F     LDA #$1F
$EA21:20 63 E2  JSR $E263
$EA24:B0 08     BCS $EA2E
$EA26:AD E1 07  LDA $07E1 = #$00
$EA29:09 01     ORA #$01
$EA2B:8D E1 07  STA $07E1 = #$00
$EA2E:A9 1A     LDA #$1A
$EA30:20 63 E2  JSR $E263
$EA33:B0 08     BCS $EA3D
$EA35:AD E1 07  LDA $07E1 = #$00
$EA38:09 02     ORA #$02
$EA3A:8D E1 07  STA $07E1 = #$00
$EA3D:A9 0E     LDA #$0E
$EA3F:20 63 E2  JSR $E263
$EA42:B0 08     BCS $EA4C
$EA44:AD E1 07  LDA $07E1 = #$00
$EA47:09 04     ORA #$04
$EA49:8D E1 07  STA $07E1 = #$00
$EA4C:A9 07     LDA #$07
$EA4E:20 63 E2  JSR $E263
$EA51:B0 08     BCS $EA5B
$EA53:AD E1 07  LDA $07E1 = #$00
$EA56:09 08     ORA #$08
$EA58:8D E1 07  STA $07E1 = #$00
$EA5B:AD DC 07  LDA $07DC = #$01
$EA5E:C9 01     CMP #$01
$EA60:D0 21     BNE $EA83
$EA62:A9 25     LDA #$25
$EA64:20 63 E2  JSR $E263
$EA67:B0 08     BCS $EA71
$EA69:AD E0 07  LDA $07E0 = #$00
$EA6C:09 02     ORA #$02
$EA6E:8D E0 07  STA $07E0 = #$00
$EA71:A9 27     LDA #$27
$EA73:20 63 E2  JSR $E263
$EA76:B0 08     BCS $EA80
$EA78:AD E0 07  LDA $07E0 = #$00
$EA7B:09 04     ORA #$04
$EA7D:8D E0 07  STA $07E0 = #$00
$EA80:4C D1 EA  JMP $EAD1
$EA83:C9 04     CMP #$04
$EA85:D0 12     BNE $EA99
$EA87:A9 01     LDA #$01
$EA89:20 63 E2  JSR $E263
$EA8C:B0 08     BCS $EA96
$EA8E:AD E0 07  LDA $07E0 = #$00
$EA91:09 02     ORA #$02
$EA93:8D E0 07  STA $07E0 = #$00
$EA96:4C D1 EA  JMP $EAD1
$EA99:C9 03     CMP #$03
$EA9B:D0 12     BNE $EAAF
$EA9D:A9 15     LDA #$15
$EA9F:20 63 E2  JSR $E263
$EAA2:B0 08     BCS $EAAC
$EAA4:AD E0 07  LDA $07E0 = #$00
$EAA7:09 01     ORA #$01
$EAA9:8D E0 07  STA $07E0 = #$00
$EAAC:4C D1 EA  JMP $EAD1
$EAAF:C9 07     CMP #$07
$EAB1:D0 1E     BNE $EAD1
$EAB3:A9 05     LDA #$05
$EAB5:20 63 E2  JSR $E263
$EAB8:B0 08     BCS $EAC2
$EABA:AD E0 07  LDA $07E0 = #$00
$EABD:09 01     ORA #$01
$EABF:8D E0 07  STA $07E0 = #$00
$EAC2:A9 04     LDA #$04
$EAC4:20 63 E2  JSR $E263
$EAC7:B0 08     BCS $EAD1
$EAC9:AD E0 07  LDA $07E0 = #$00
$EACC:09 02     ORA #$02
$EACE:8D E0 07  STA $07E0 = #$00

#############################################
$E263:8C 66 07  STY $0766 = #$01
$E266:8E 6E 07  STX $076E = #$00
$E269:8D 6F 07  STA $076F = #$2D
$E26C:20 89 DE  JSR $DE89
$E26F:AA        TAX
$E270:8D 65 07  STA $0765 = #$10
$E273:20 28 C3  JSR $C328
$E276:A8        TAY
$E277:4C 89 E2  JMP $E289
$E27A:AE 65 07  LDX $0765 = #$10
$E27D:20 06 C3  JSR $C306
$E280:AA        TAX
$E281:20 AA BD  JSR $BDAA
$E284:CD 6F 07  CMP $076F = #$2D; число из операндов первого цикла
>$E287:F0 0B     BEQ $E294; основное разветвление, которое решает OR'ить с разными числами или нет
$E289:88        DEY
$E28A:10 EE     BPL $E27A
$E28C:38        SEC
$E28D:AE 6E 07  LDX $076E = #$00
$E290:AC 66 07  LDY $0766 = #$01
$E293:60        RTS
$E294:18        CLC
$E295:8A        TXA
$E296:AE 6E 07  LDX $076E = #$00
$E299:AC 66 07  LDY $0766 = #$01
$E29C:60        RTS

##############################################
$BDAA:BD F5 03  LDA $03F5,X @ $03F5 = #$22; непонятно что это за данные
$BDAD:60        RTS

#############################################
$C306:98        TYA
$C307:DD CB 04  CMP $04CB,X @ $04CB = #$00
$C30A:B0 1A     BCS $C326
$C30C:A9 87     LDA #$87
$C30E:85 34     STA $0034 = #$10
$C310:A9 04     LDA #$04
$C312:85 35     STA $0035 = #$04
$C314:BD A8 04  LDA $04A8,X @ $04A8 = #$09
$C317:18        CLC
$C318:65 34     ADC $0034 = #$10
$C31A:85 34     STA $0034 = #$10
$C31C:A9 00     LDA #$00
$C31E:65 35     ADC $0035 = #$04
$C320:85 35     STA $0035 = #$04
$C322:B1 34     LDA ($34),Y @ $0417 = #$00; поинтер непонятно откуда берущийся =)
$C324:18        CLC
$C325:60        RTS
###############################################


Код, как мы видим, сам по себе довольно простой. Вроде все понятно,
однако я так и не понял откуда он берет данные для преобразований знаков в пароле.
Очень надеюсь, что у старожилов будет настроение и время, чтобы разобраться в этом =)
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
CaH4e3



Зарегистрирован: 21.01.2004
Сообщения: 195

СообщениеДобавлено: Вс Июл 09, 2006 3:28 pm    Заголовок сообщения: Ответить с цитатой

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

Например -----------90 в пароле - это шестнадцатиричное 09 (младшие 4 бита идут первыми), а следовательно у героя 90 монет.
То же самое с инвентарем. Байт содержимого инвентаря генерируется по определенным состояниям оного и по сути не содержит непосредственно перечисления предметов.

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


Последний раз редактировалось: CaH4e3 (Вс Июл 09, 2006 6:00 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
CaH4e3



Зарегистрирован: 21.01.2004
Сообщения: 195

СообщениеДобавлено: Вс Июл 09, 2006 5:58 pm    Заголовок сообщения: Ответить с цитатой

Код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
<script type="text/javascript">
 var inventory, power, gold, pass = Array(13);
 function get_inventory(){
   var i, tmp = 0;
   for(i=0; i<8; i++) if(document.passform.cb[7-i].checked) tmp+=(1<<(i));
   return tmp;
 }
 function get_password()
 {
   var tmp = ''; hex = '0123456789rstvxy';
   for(i=0; i<13; i++) tmp += hex.charAt(pass[i]);
   return tmp;
 }
 function calculate_checksum()
 {
   var i, tmp0 = 0x0D, tmp1 = 0xA5;
   for(i=4; i<13; i++)
   {
      tmp0 = (tmp0 + pass[i]) ^ tmp1;
      tmp1 = (pass[i] << 1) + tmp1;
   }
   pass[0] = tmp0 & 0x0F;
   pass[1] = (tmp0 >> 4) & 0x0F;
   pass[2] = tmp1 & 0x0F;
   pass[3] = (tmp1 >> 4) & 0x0F;
 }
 function generate()
 {
   pass[4] = document.passform.hitpoints.value & 0x0F;
   pass[5] = document.passform.level.value & 0x0F;
   power = document.passform.power.value;
   pass[6] = power & 0x0F;
   pass[7] = (power >> 4) & 0x0F;
   gold = (document.passform.gold.value / 10) & 0xFF;
   pass[11] = gold & 0x0F;
   pass[12] = (gold >> 4) & 0x0F;
   pass[8] = pass[12];
   inventory = get_inventory();
   pass[9] = inventory & 0x0F;
   pass[10] = (inventory >> 4) & 0x0F;
   calculate_checksum();
   document.passform.password.value = get_password();
 }
</script>
</head>
<body>
<form name="passform">
<table style="border:1px solid #000; font: 12px/1.2 verdana;">
 <tr><td>Hitpoints:<td><input onchange="generate()" type="text" maxlength="12" size="1" value="0" name="hitpoints" />
 <tr><td>Level:<td><input onchange="generate()" type="text" maxlength="1" size="1" value="0" name="level" />
 <tr><td>Power:<td><input onchange="generate()" type="text" maxlength="2" size="1" value="0" name="power" />
 <tr><td>Inventory
 <tr><td>&nbsp;Usual:<td><input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
 <tr><td>&nbsp;Special:<td><input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
   <input onclick="generate()" type="checkbox" name="cb" />
 <tr><td>Gold:<td><input onchange="generate()" type="text" maxlength="4" size="1" value="0" name="gold" />
 <tr><td>
 <tr><td>Password:<td><input type="text" name="password" size="13" readonly />
</table>
</form>
</body>
</html>


Генератор паролей для "Immortal, The"...
Число хитпойнтов в диапазоне от 0 до 15. Номер уровня в диапазоне от 1 до 7. При генерации пароля в игре пятый уровень всегда заменяется на шестой. Сила - несовсем понятный параметр, похоже это что-то вроде уровня персонажа, со временем он становится 1, 3 и 7. Остается большое поле для экспериментов. Деньги в диапазоне от 2550 до 0 кратные 10, остаток от деления на 10 всегда отбрасывается.
Наконец инвентарь: обычные предметы - те, которе могут быть в инвентаре независимо от уровня; специальные предметы - зависят от уровня, одни и те же биты в разных уровнях имеют разное значение. Для уровня 1 не выставляются 2ой и 3ий боксы, для уровня 3 - 1ый, для уровня 4 - 2ой, для уровня 7 - 1ый, 2ой.

После заполнения данных с 5 по 13 символ, вычисляется контрольная сумма.
a(n) = (a(n-1) + pass[4+n])^b(n-1)
b(n) = (pass[4+n]<<1)+b(n-1)
где
n = 0..8,
a(0) = 0x0D,
b(0) = 0xA5.

enjoy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Griever
RRC2008
RRC2008


Зарегистрирован: 15.07.2005
Сообщения: 112
Откуда: Н.Новгород

СообщениеДобавлено: Вс Июл 09, 2006 7:55 pm    Заголовок сообщения: Ответить с цитатой

Shocked Сказать, что я в шоке, значит не сказать ничего. САМ CAH4E3(!). Аж слёзы в глазах!

Эх-х-х, Crying or Very sad Писал генератор больше двух месяцев и 95% из того что ты написал я узнавал сам, генератор был готов и нормально все генерил, если оставить 00 для предметов Wink Я не знал только эти два числа! Но огромное спасибо, что не проигнорировал мой 'глас вопиющего в пустыне.'

Теперь насчет 'силы', как ты выразился. Ээээ, я так полагаю ты имел ввиду ячейку $07C8. Зная специфику моей любимой игры я могу сказать, что она отвечает только за наличие заклинания 'Invisible Spirit', если я не ошибаюсь, которое можно получить от разработчиков. Оно позволяет убивать троллей не вступая с ними в сражение. Заклинание есть, если значение в ячейке $07C8: Х AND $04 <>0. Исходя из этого, значимым является только параметр 7. Если, конечно, я тебя правильно понял.

Цитата:
тебе не ясны элементарные вещи в асме... Для начала, я думаю, стоит почитать документацию...


Мне, как твоему самому большому фанату, горько слышать такие вещи. Но, я думаю, с Богом не поспоришь.
Что же касается документации, то я изучил практически все существующие документы по 6502 асму и архитектуре NES(по крайней мере все, что смог найти на nesdev.parodius.com и romhacking.net).
Да, это не опечатка =). Другое дело, что документация дала мне возможность осознать текст кода, но не понять его!
Вот например:
Цитата:
следовательно два символа пароля представляют один байт данных.
Младшая часть байта располагается всегда перед старшей в записи пароля при чтении слева-направо...

Этого точно нет ни в одном из указанных мной документов по асму 6502.
Цитата:
обычные предметы - те, которе могут быть в инвентаре независимо от уровня; специальные предметы - зависят от уровня, одни и те же биты в разных уровнях имеют разное значение.


Это ведь можно определить из кода, который я написал? Ведь в нём видно, что загружается поинтер из одной ячейки, загружается значение другой и сравнивается с заранее загруженным значением операнда команды. Я так понимаю ты трассировал дальше: ставил бряк на эти ячейки и т.д.?

Цитата:
думаю, стоит почитать документацию...

Кумир, дай мне надежду: посоветуй, пожалуйста, какую именно. Crying or Very sad
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
CaH4e3



Зарегистрирован: 21.01.2004
Сообщения: 195

СообщениеДобавлено: Вс Июл 09, 2006 8:22 pm    Заголовок сообщения: Ответить с цитатой

Читай дизассембленые листинги... Там все написано...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Griever
RRC2008
RRC2008


Зарегистрирован: 15.07.2005
Сообщения: 112
Откуда: Н.Новгород

СообщениеДобавлено: Вс Июл 09, 2006 8:45 pm    Заголовок сообщения: Ответить с цитатой

Эх, еще бы адресок вообще замечательно было бы!
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
CaH4e3



Зарегистрирован: 21.01.2004
Сообщения: 195

СообщениеДобавлено: Вс Июл 09, 2006 8:51 pm    Заголовок сообщения: Ответить с цитатой

$EA15
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вс Июл 09, 2006 10:45 pm    Заголовок сообщения: Ответить с цитатой

Фанаты атакуют!! :shock:

:D
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Griever
RRC2008
RRC2008


Зарегистрирован: 15.07.2005
Сообщения: 112
Откуда: Н.Новгород

СообщениеДобавлено: Пн Июл 10, 2006 12:04 pm    Заголовок сообщения: Ответить с цитатой

ОК, спасибо Wink
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group