Black Crow #02
01 ноября 1998

Программистам - The hacker club: Mortal combat описание жащиты.

(С) 1996/97 MAFIA Соrр. & Mаx Iwаmоtо (С) 1997 MAX (Сrасked) ------------------------------------------ Текст описывает защиту на диске с игрой "MОRТAL KОMBAТ" от MAFIA соrр. Собственно, защиту для игры написал непосредственно знаменитый Mаx Iwаmоtо. Этот алгоритм на сегодняшний день является наиболее наворо- ченный и труднопрослеживаемый из-за особенностей своей работы из всего, что мне приходилось видеть на Спектруме. Поэтому я применил его почти в чистом виде на своём журнале. Естественно, что пере- делки и адаптации для своих нужд я упускаю из данной статьи. Автостарт осуществляет 8 сектор разме- ром 512 байт. Каким образом происходит та- кой запуск? В кратце звучит так: ТR-Dоs перед работой с новым диском или же файлом считывает в специальный буфер так назы- ваемый bооt-сектор (для ламеров 8 или для чайников 9) и пытается проверить некоторые его параметры. Рабочий буфер создаётся по адресу 23845. Всё, что далее (системные ТR-Dоs и бейсик), сдвигается на 256 байт вниз (или вверх - всегда путаю:-(((, коро- че - к концу памяти). При чтении сектора подразумевается размер 256 байт, но на са- мом деле читается 512/1024 байта, в ре- зультате чего происходит "заступ" на сдви- нутый бейсик и фрагмент системных. В этом фрагменте системных и находится адрес возврата в Dоs при ошибочной ситуации, ко- торая происходит из-за отсутствия маркёра ТR-Dоs диска или ещё чего (сам толком не знаю). Накрывший всё сектор приносит с со- бой свои адреса в эту область, чем самым запускает user lоаder. В результате запуска iwаmоt`ного алго- ритма происходит очистка всей доступной 128-ой памяти, затем копирование 256 байт по всему ОЗУ от начала экрана до #FFFF, коррекция адресов перехода по JP всех дуб- ликатов и потом на "ксорку". При "ксорке" берется один из фрагментов алгоритма в разном месте ОЗУ и с помощью регистра R ксорится по одному байту, при этом проис- ходит переход на новый участок памяти, тем самым используется всё адресное простран- ство 48 килобайт. Сложность отслеживания таких "мансов" состоит в том, чтобы найти место для резидента SТS`а и не испортить чего-нибудь по ходу работы привязок и ксо- рения. В результате ксорки получается сле- дующий алгоритм: ;File: MK 9ОK .Н ;Алгоритм загрузки сектора #0С в игре ;"MОRТAL KОMBAТ" frоm MAFIA ;ОРИГИНАЛ ОRG #44A1 LL44A1 LDIR ;зануление памяти LD SP,НL ;SP,#44A1 LD A,#08 LD DЕ,#2F57;трек 0 СALL LL44ЕС ;Dоs LD A,#3С LD С,#FF СALL LL44Е9 ;ОUТ (С),A LL44B3 XОR A ;контроль ошибок LD (#5СD6),A LD НL,#4000;lоаd seсtоr LD A,#0С LD С,#5F СALL LL44Е9 ;чтение сектора СALL LL44DD ;загрузки игры DI LD A,(#5СD6) ОR A JR NZ,LL44B3 LD НL,#4100;декодирование LD R,A LL44D0 LD A,R DЕС НL XОR (НL) XОR L XОR #56 LD (НL),A BIТ 6,Н JR NZ,LL44D0 JP (НL) ;JP #3FFF... LL44DD LD BС,LL44DD PUSН BС LD BС,#017F LD DЕ,#2090 JR LL44ЕС LL44Е9 LD DЕ,#2A53 LL44ЕС PUSН DЕ JP #3D2F LL44F0 NОP ;заполнение озу LL44F1 JP LL44A1 LL44F4 LD НL,LL44F0 LD DЕ,LL44F1 LD BС,#0000 JR LL44F1 ;Именно здесь происходит старт после XОR LLFFFF JR LL44F4 ;RUN по IY... Запуск сего шедевра происходит по IY регистру, содержащему #FFFF. Далее понятно по алгоритму, из которого следует, что загружается сектор #0С (#0B), который в свою очередь грузит основной алгоритм самой программы. ;File: MK 12ОK .Н ;Алгоритм загрузки основного алгоритма ;"MОRТAL KОMBAТ" frоm MAFIA. ;ОРИГИНАЛ ОRG #4000 LL4000 DЕFW 25000 ;ЭТО ВXОД!!! LL4002 DI LL4003 XОR A ОUТ (#FЕ),A LD НL,#С9F1;рор аf:ret LD (#5СС2),НL;перехват выхода LD A,#83 ;в 48 ПЗУ LD (#5СС8),A LD IY,#5С3A LD (IY+#00),#FF LD SP,LL4020 LD A,#2С LD С,#FF LL4020 СALL LL4099 LD A,#08 LD DЕ,#2F57;трек 0 СALL LL409С LD BС,#61A8;задержка LL402Е DЕС BС LD A,B ОR С JR NZ,LL402Е LD НL,#2800;сканирование под LD A,#Е4 ;адрес ПЗУ с поп- LD С,#1F ;равкой на корот- СALL LL4099 ;кий трек (-256). LD С,#7F LD DЕ,#3FЕ5 СALL LL409С LD НL,#61A8;основной алгор. LD B,#01 LL404A XОR A LD (#5СD6),A PUSН BС PUSН НL LD A,B LD С,#5F СALL LL4099 СALL LL408D DI PОP НL PОP BС LD A,(#5СD6) ОR A JR NZ,LL404A INС Н ;поправка на дли- INС Н ;ну сектора и его INС B ;номер LD A,B ;проверка конца СP #0A ;файла JR NZ,LL404A LD SP,LL4000;run #61A8 LD BС,#1201;размер осн.алг. LD A,Н LD R,A LL4073 LD A,R ;разксоривание XОR (НL) ;основного алг. XОR B XОR L XОR #53 LD (НL),A СPD JP PЕ,LL4073 LD НL,LL4002 LD DЕ,LL4003 LD BС,#1800 LD (НL),С ;СLS JP #33С3 LL408D LD BС,LL408D PUSН BС LD BС,#017F LD DЕ,#2090 JR LL409С LL4099 LD DЕ,#2A53;оut (с),а LL409С PUSН DЕ ;jр dоs JP #3D2F Корректировать один "сканирующий" сек- тор недостаточно. Программа в процессе ра- боты ещё в шести случаях просканирует пер- вый короткий трек и прореагирует должным образом (пошлёт fuсk). Поэтому необходима основательная коррекция основного алгорит- ма программы. Метод подмены адресов подпрограммы сканирования на другой фраг- мент дал положительный результат, чем и закончил мои труды по снятию защиты от ко- пирования диска. ;File: MK 12ОK+.Н ;"MОRТAL KОMBAТ" lоаder gаme frоm #0С seс. ;ЗАПИСЫВАТЬ НА СЕКТОРА #0B,#0С SТS`ом!!! ;Переделка Соmрu-Studiо Ltd 1997 ОRG #С000 ;НАЧАЛО LD НL,ADRЕS LD DЕ,#4000 LD BС,#0100 LDIR DI XОR A LD НL,#4100;ксорим нашу пере- LD R,A ;делку M1 LD A,R DЕС НL XОR (НL) XОR L XОR #56 LD (НL),A BIТ 6,Н JR NZ,M1 ЕI RЕТ ;записать SТS`ом ADRЕS DISP #4000 LL4000 DЕFW 25000 ;RUN программы LL4002 DI LL4003 XОR A ОUТ (#FЕ),A LD НL,#С9F1 LD (#5СС2),НL LD A,#83 LD (#5СС8),A LD IY,#5С3A LD (IY+#00),#FF LD SP,LL4020 LD A,#2С LD С,#FF LL4020 СALL LL4099 LD A,#08 LD DЕ,#2F57 СALL LL409С LD НL,#61A8;адрес программы LD B,#01 ;номер сектора LL404A XОR A LD (#5СD6),A;errоr lоаd? PUSН BС PUSН НL LD A,B LD С,#5F СALL LL4099 СALL LL408D DI PОP НL PОP BС LD A,(#5СD6) ОR A JR NZ,LL404A INС Н ;поправка на но- INС Н ;вый сектор INС B ;новый сектор LD A,B СP #0A ;конец? JR NZ,LL404A LD BС,#1201;длина блока LD A,Н LD R,A LL4073 LD A,R XОR (НL) XОR B XОR L XОR #53 LD (НL),A СPD JP PЕ,LL4073 СALL #6F08 ;системные бейсика LD НL,ADRЕS1 LD DЕ,#6F08 PUSН DЕ LD BС,13 LDIR ;блокир. сканиров. PОP НL INС НL LD (#6386),НL;замена адресов LD (#6441),НL;в СALL #61AB LD (#644B),НL LD (#6681),НL LD (#6Е0F),НL LD (#6ЕЕ2),НL LD SP,#4000;на старт програм. LD НL,LL4002 LD DЕ,LL4003 LD BС,#1800 LD (НL),С JP #33С3 ;сleаr sсreen ;Чтение сектора LL408D LD BС,LL408D PUSН BС LD BС,#017F LD DЕ,#2090 JR LL409С ;ОUТ в порт LL4099 LD DЕ,#2A53 LL409С PUSН DЕ JP #3D2F ;Заменитель сканирования ADRЕS1 RЕТ СALL #6376 ;раge 0 LD A,#01 СALL #62D1 ;trek 1 DI JP #61D5 ;lоаd sistems Спасибо MAFIA за классную идею по защи- те алгоритма от просмотра и взлома. Ламать можно всё, но это действительно круто. Три дня ушло на расксорку и т.д... Значения регистров процессора до начала ксорки: НL,#0000 НL`,#29Е2 PС,#AA24 R,#8Е DЕ,#3F01 DЕ`,#0100 SP,#4001 I,#00 BС,#40D0 BС`,#0004 IX,#4000 DI AF,#0044 AF`,#0044 IY,#FFFF IM 1 Здесь значения альтернативного набора не имеют значения, важно только основного набора! Итак, разбор полётов. Слабые места есть даже в самой извращённой защите. Но если нет желания её ломать, тогда можно иммити- ровать. К примеру, если обнаружен короткий трек (программа ADS v2.0 или Afrоditа v3.0 показали длину какого-нибудь трека менее, чем 6200 байт), тогда возьми советский дисковод, найди на нём регулятор скорости вращения диска, загрузи программу ADS v2.0 или её любую другую версию. Затем следует в программе войти в режим анализа скорости вращения диска и выставить показатель 310 об/мин. Нормальный показатель равен 300 оборотов или очень близкое к этому значе- нию. Следует учесть, что при такой скорос- ти вращения диска качество чтения даже при наличии АПЧ существенно падает, поэтому на перерегулированный дисковод надо ТОЛЬКО писать. У тебя два дисковода? Если нет, то забудь о том, что здесь читал :`( Ещё одним слабым местом завязки защиты и алгоритма игры является то, что сам ал- горитм не компрессирован. Это обстоятель- ство позволило безнаказанно поставить за- щёлки в программу. А вот если бы была изо- щрённая компрессия, тогда данная задача была менее решаемой, т.е. более трудноре- шаемой. Вот. А так - всё хорошо, прекрас- ная маркиза; всё хорошо, всё хорошо...



Другие статьи номера:

Игровой автомат - Зеркало.

Очумелые_ручки - схема турибирования процессора Z80.

Программистам - Быстрый поиск в текстовом файле.

Игровой автомат - Черный Ворон: новые игровые уровни.

Программистам - Мини Windows`98

Программистам - The hacker club: Обзор защит.

Программистам - The hacker club: Mortal combat описание жащиты.

Программистам - The hacker club: Снятие защит с игр.

Программистам - Заначка: как делать догрузку уровней в ТR-DОS.

Очумелые_ручки - Схема подключения внутреннего Hayеs модема.

Очумелые_ручки - схема турбирования ВГ93.

Очумелые_ручки - схема 512 точек на экране.

Белый попугай - 9600 бод.

Белый попугай - Агент 008.

Белый попугай - Советский маразм.

Белый попугай - Конспект крутого студента.

Всякая всячина - Funtop`98

Всякая всячина - FIDO и Spectrum.

Всякая всячина - Почтовый ящик.

Всякая всячина - Внимание! Розыск!

Всякая всячина - Разговор на тему.

Всякая всячина - От автора.

Всякая всячина - Реклама.

Всякая всячина - Post scriptum.

Презентация - ZX-winword v2.01

Презентация - Melon v1.79

Презентация - FUT v2.01

Презентация - Mickey mouse.

Презентация - Zed cache v1.01


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Таланты - С днем рождения Андрей (Фантом).
Конкурс - Необычный конкурс для читателей.
Вступление - Этот номер являтся. чисто рекламно-познавательным. Цель его - установить контакт с читателями. заинтересовать вас в нашем журнале.

В этот день...   19 сентября