|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Griever 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
###############################################
|
Код, как мы видим, сам по себе довольно простой. Вроде все понятно,
однако я так и не понял откуда он берет данные для преобразований знаков в пароле.
Очень надеюсь, что у старожилов будет настроение и время, чтобы разобраться в этом =) _________________
|
|
Вернуться к началу |
|
|
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> 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> 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
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Вс Июл 09, 2006 7:55 pm Заголовок сообщения: |
|
|
Сказать, что я в шоке, значит не сказать ничего. САМ CAH4E3(!). Аж слёзы в глазах!
Эх-х-х, Писал генератор больше двух месяцев и 95% из того что ты написал я узнавал сам, генератор был готов и нормально все генерил, если оставить 00 для предметов Я не знал только эти два числа! Но огромное спасибо, что не проигнорировал мой 'глас вопиющего в пустыне.'
Теперь насчет 'силы', как ты выразился. Ээээ, я так полагаю ты имел ввиду ячейку $07C8. Зная специфику моей любимой игры я могу сказать, что она отвечает только за наличие заклинания 'Invisible Spirit', если я не ошибаюсь, которое можно получить от разработчиков. Оно позволяет убивать троллей не вступая с ними в сражение. Заклинание есть, если значение в ячейке $07C8: Х AND $04 <>0. Исходя из этого, значимым является только параметр 7. Если, конечно, я тебя правильно понял.
Цитата: | тебе не ясны элементарные вещи в асме... Для начала, я думаю, стоит почитать документацию... |
Мне, как твоему самому большому фанату, горько слышать такие вещи. Но, я думаю, с Богом не поспоришь.
Что же касается документации, то я изучил практически все существующие документы по 6502 асму и архитектуре NES(по крайней мере все, что смог найти на nesdev.parodius.com и romhacking.net).
Да, это не опечатка =). Другое дело, что документация дала мне возможность осознать текст кода, но не понять его!
Вот например:
Цитата: | следовательно два символа пароля представляют один байт данных.
Младшая часть байта располагается всегда перед старшей в записи пароля при чтении слева-направо... |
Этого точно нет ни в одном из указанных мной документов по асму 6502.
Цитата: | обычные предметы - те, которе могут быть в инвентаре независимо от уровня; специальные предметы - зависят от уровня, одни и те же биты в разных уровнях имеют разное значение. |
Это ведь можно определить из кода, который я написал? Ведь в нём видно, что загружается поинтер из одной ячейки, загружается значение другой и сравнивается с заранее загруженным значением операнда команды. Я так понимаю ты трассировал дальше: ставил бряк на эти ячейки и т.д.?
Цитата: | думаю, стоит почитать документацию... |
Кумир, дай мне надежду: посоветуй, пожалуйста, какую именно. _________________
|
|
Вернуться к началу |
|
|
CaH4e3
Зарегистрирован: 21.01.2004 Сообщения: 195
|
Добавлено: Вс Июл 09, 2006 8:22 pm Заголовок сообщения: |
|
|
Читай дизассембленые листинги... Там все написано... |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Вс Июл 09, 2006 8:45 pm Заголовок сообщения: |
|
|
Эх, еще бы адресок вообще замечательно было бы! _________________
|
|
Вернуться к началу |
|
|
CaH4e3
Зарегистрирован: 21.01.2004 Сообщения: 195
|
Добавлено: Вс Июл 09, 2006 8:51 pm Заголовок сообщения: |
|
|
$EA15 |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вс Июл 09, 2006 10:45 pm Заголовок сообщения: |
|
|
Фанаты атакуют!! :shock:
:D |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Пн Июл 10, 2006 12:04 pm Заголовок сообщения: |
|
|
ОК, спасибо _________________
|
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|