Зарегистрирован: 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
_________________ Мысль - это интеллектуальный эксцесс данного индивидуума.
|