Сообщения без ответов | Активные темы Текущее время: 10 ноя 2024, 23:46



Ответить на тему  [ 1 сообщение ] 
 Поиск зашифрованных паролей Nintendo часть 2 
Автор Сообщение
Сообщение 27 июл 2007, 00:56
Профиль
Аватара пользователя

Зарегистрирован:
22 июл 2007, 02:10
Сообщения: 313
Откуда: ниоткуда
Originally posted by Яковлев Виктор at forum.romov.net 23.04.2005 22:16
На примере игры Игра Choujin_Sentai_-_Jetman_(J) было разобрано один из способов шифрования паролей. Смысл его шифрования очень прост: в пароле, например, 4 6 6 0 каждые 2 числа пароля объединялись в пары, т.е 46 60 в 16-м виде и эти пары сравнивались со всеми парами паролей загруженные из ПЗУ в ОЗУ, т.е 46 60 проверялось с парами 57 05 соответствующие паролю 5 7 0 5 и т.д.. Поиск того места где осуществляется нахождением адреса любого из числа отображаемого в момент набора пароля. Скажем ввели 4660, но Старт не жмем, а ищем байт в ОЗУ скажем числа 0 путем встроенного в эмулятор взломщика. Найдя его ставим брейкпоинт на чтение из этой ячейки и жмем Старт и в отладчике мы попадаем в то место где осуществляется считывание этого числа из ОЗУ, а затем и проверка его с правильным паролем. К чему я это пересказал, а вот к чему. Есть игры где каждый символ отображаемого при вводе пароля опрашивается все время и ставить брейкпоинт на ячейку в ОЗУ на любой символ бесполезно – все время будет срабатывать брейкпоит. Что же делать? А вот что:
Прибегнем к хитрости и смекалке: попробуем сделать так чтобы игра считывала не из этой ячейки ОЗУ где хранится символ отображаемого пароля а какой- нибудь другой и тем самым уберем это ложное срабатывание брейкпоинта! Цель ясна, приступим!
Для примера возьмем 9 -игровку NinjaCat.
Найдите байт в ОЗУ например 1-го символа пароля который отображается во время ввода пароля с помощью встроенного в эмулятор взломщика. Я предпочитаю VirtualNes. Как это делать уже писали сто раз. Нашли, у меня адрес 03A3. Загружаем игру в эмуляторе fceultra 0.98, идем в меню ввода пароля, вводим пароль, но СТАРТ не жмем и ставим брейкпоинт на чтение из 03А3 и тут же срабатывает брейкпоинт:
fd0a: B9 A0 03 LDA 03A0,Y @ 03A3 = 84 ;здесь постоянно считывает игра символ
;пароля
fd0d: 8D 07 20 STA $2007
fd10: C8 INY
fd11: CA DEX
fd12: D0 F6 BNE $FD0A
fd14: F0 D1 BEQ $FCE7
fd16: 85 1F STA $1F
fd18: 85 21 STA $21
fd1a. AD 02 20 LDA 2002 @ 2002 = CC

Вот тут игра постоянно опрашивает символ пароля. Нужно заменить команду LDA 03A0,Y так чтобы ячейка 03A3 не опрашивалась. Я заменил ее на LDA 03A3,Y код В9 А3 03. Ищем в ПЗУ рома строку B9 A0 03 8D 07 20 C8 CA D0 F6 F0 D1 и меняем B9 A0 03 на В9 А3 03. Сохраняем. Грузим обновленный ром в fceultra 0.98. Идем опять в опцию пароля и видим что она корявая. Предупреждаю сразу что придется пароль вводить вслепую, т.к. числа теперь отображаются неправильно, но указатель ввода пароля виден. Можно упростить и не вводить ни чего, т.к. по умолчанию введено 000000. Но мы введем пароль 390228. Ставим брейкпоинт опять на 03A3 и вуаля ложное срабатывание изчезло. Теперь жмем СТАРТ и срабатывает брейкпоинт:

846a: B9 A0 03 LDA $03A0,Y @ $03A3 = $83 ; грузится наш символ. В данном случае 83
846d: 0A ASL ;сдвиг числа влева равно 06
846e: 0A ASL ;тоже , 0С
846f: 0A ASL ;тоже, 18
8470: 0A ASL ;тоже, 30
8471: 85 0D STA $0D ;неинтересно
8473: B9 A2 03 LDA $03A2,Y @ $03A5 = $89 ;грузится следующее число пароля, т.е 89
8476: 29 7F AND #$7F ;отбрасывается правая часть 89,т.е теперь 09
8478: 05 0D ORA $0D @ $000D = $30 ;объединяют число 30 и 09, т.е теперь 39
847a: 95 0A STA $0A,X @ $000A ;2 символа пароля помещаются в ячейку А
847c: 88 DEY
847d: 88 DEY
847e: 88 DEY
847f: 88 DEY
8480: CA DEX ;установка признаков
8481: 10 E7 BPL $846A
8483: A2 12 LDX #$12 ;загрузка смещения для ячейки в ОЗУ где
;находится часть проверочного пароля
8485: A5 0A LDA $0A @ $000A = $39 ;загрузка части введенного в игре пароля
8487: DD 56 86 CMP $8656,X @ $8668 = $39 ;сравнение нашей части пароля с часть из
;ОЗУ + смещение из Х, т.е + 12
848a: F0 05 BEQ $8491
848c: CA DEX ;уменьшение смешения на проверочную
;часть пароля
848d: 10 F6 BPL $8485 ;переход если не равны пары паролей
;введненного и проверочного
848f: 30 2F BMI $84C0
8491: A5 0B LDA $0B @ $000B = $02 ;загрузка второй пары введенного в игре
;пароля
8493: DD 69 86 CMP $8669,X @ $867B = $02 ;проверка нашей 2-й пары с парой из ОЗУ
8496: D0 28 BNE $84C0 ;если не равны то уходим отсюда
8498: A5 0C LDA $0C @ $000C = $28 ;загрузка 3-й пары введенного пароля
849a: DD 7C 86 CMP $867C,X @ $868E = $27;сравнение с парой из ОЗУ
849d: D0 21 BNE $84C0 ;если равны то уходим отсюда
849f: 86 08 STX $08

Из выше описанного видно, что введенный пароль разделяется на пары, т.е пароль 390228 будет 39 02 28 по HEX-су и эта часть сравнивается с загруженной в ОЗУ верными паролями. Каждая пара реальных паролей удалены друг от друга на 19 позиций, т.е как из выше описанного кода видно что пароль 390227 находится по адресу 39 в 8668, 02 в 867B, а 27 в 868E. Получается что проверка начинается с последнего в игре пароля, а не с первого. Попробуем ввести пароль 10 уровня 641114, но введем только 641113 и поставим брейкпоинт на 03А3.Жмем СТАРТ и срабатывает брейкпоинт.

846a: B9 A0 03 LDA $03A0,Y @ $03A3 = $86
846d: 0A ASL
846e: 0A ASL
846f: 0A ASL
8470: 0A ASL
8471: 85 0D STA $0D
8473: B9 A2 03 LDA $03A2,Y @ $03A5 = $84
8476: 29 7F AND #$7F
8478: 05 0D ORA $0D @ $000D = $60
847a: 95 0A STA $0A,X @ $000A
847c: 88 DEY
847d: 88 DEY
847e: 88 DEY
847f: 88 DEY
8480: CA DEX
8481: 10 E7 BPL $846A
8483: A2 12 LDX #$12
8485: A5 0A LDA $0A @ $000A = $64
8487: DD 56 86 CMP $8656,X @ $8668 = $39
848a: F0 05 BEQ $8491
848c: CA DEX
848d: 10 F6 BPL $8485 ;часть пароля не совпала, то переходим по
;адресу $8485
Перешли сюда:
8485: A5 0A LDA $0A @ $000A = $64 ;снова грузится 1-я пара введенного пароля
8487: DD 56 86 CMP $8656,X @ $8667 = $64 ;сравнивается с парой из ОЗУ, адрес
;которого на 1 меньше чем адрес пары 39
848a: F0 05 BEQ $8491
848c: CA DEX
848d: 10 F6 BPL $8485 ;переход если не равны
848f. 30 2F BMI 84C0
8491: A5 0B LDA $0B @ $000B = $11 ;загрузка второй пары введенного пароля
8493: DD 69 86 CMP $8669,X @ $867A = $11 ;проверка с парой из ОЗУ
8496: D0 28 BNE $84C0 ;если не равны то уходим отсюда
8498: A5 0C LDA $0C @ $000C = $13 ;загрузка третьей пары введенного пароля
849a: DD 7C 86 CMP $867C,X @ $868D = $14;проверка с парой из ОЗУ
849d. D0 21 BNE 84C0 ;если не равны то уходим отсюда

Из выше написанного видно что смещение Х уменьшено на 1 и пары пароля 641114 загружаются по адресам на 1 меньше чем пары для пароля 390227, хотя разнос в 19 сохраняется. Т.е теперь пары пароля 641114 грузятся по адресам: 64 по 8667, 11 по $867A, а 14 по $868D. Поэтому всего паролей 19:
390227 641114 924748 128256 816328 680580 192397 713159 479126 912210 600445 520771 886574 260388 539203 321019 140901 427123 000000

Из них новые:
816328 680580 713159 479126 520771 886574 539203 321019

_________________
Мысль - это интеллектуальный эксцесс данного индивидуума.


Показать сообщения за:  Поле сортировки  
Ответить на тему   [ 1 сообщение ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware for PTF (mod by Zeru-j).
Русская поддержка phpBB