Из журнала 'Чёрная Ворона 2' Украина, Донецкая область, г.Дмитров-1, 08.1998 MORTAL KOMBAT PROTECT (C) 1996/97 MAFIA Corp. & Max Iwamoto (C) 1997 MAX (Cracked) ------------------------------------------ Текст описывает защиту на диске с игрой "MORTAL KOMBAT" от MAFIA corp. Собственно, защиту для игры написал непосредственно знаменитый Max Iwamoto. Этот алгоритм на сегодняшний день является наиболее наворо- ченный и труднопрослеживаемый из-за особенностей своей работы из всего, что мне приходилось видеть на Спектруме. Поэтому я применил его почти в чистом виде на своём журнале. Естественно, что пере- делки и адаптации для своих нужд я упускаю из данной статьи. Автостарт осуществляет 8 сектор разме- ром 512 байт. Каким образом происходит та- кой запуск? В кратце звучит так: TR-Dos перед работой с новым диском или же файлом считывает в специальный буфер так назы- ваемый boot-сектор (для ламеров 8 или для чайников 9) и пытается проверить некоторые его параметры. Рабочий буфер создаётся по адресу 23845. Всё, что далее (системные TR-Dos и бейсик), сдвигается на 256 байт вниз (или вверх - всегда путаю:-(((, коро- че - к концу памяти). При чтении сектора подразумевается размер 256 байт, но на са- мом деле читается 512/1024 байта, в ре- зультате чего происходит "заступ" на сдви- нутый бейсик и фрагмент системных. В этом фрагменте системных и находится адрес возврата в Dos при ошибочной ситуации, ко- торая происходит из-за отсутствия маркёра TR-Dos диска или ещё чего (сам толком не знаю). Накрывший всё сектор приносит с со- бой свои адреса в эту область, чем самым запускает user loader. В результате запуска iwamot'ного алго- ритма происходит очистка всей доступной 128-ой памяти, затем копирование 256 байт по всему ОЗУ от начала экрана до #FFFF, коррекция адресов перехода по JP всех дуб- ликатов и потом на "ксорку". При "ксорке" берется один из фрагментов алгоритма в разном месте ОЗУ и с помощью регистра R ксорится по одному байту, при этом проис- ходит переход на новый участок памяти, тем самым используется всё адресное простран- ство 48 килобайт. Сложность отслеживания таких "мансов" состоит в том, чтобы найти место для резидента STS'а и не испортить чего-нибудь по ходу работы привязок и ксо- рения. В результате ксорки получается сле- дующий алгоритм: ;File: MK 9OK .H ;Алгоритм загрузки сектора #0C в игре ;"MORTAL KOMBAT" from MAFIA ;ОРИГИНАЛ ORG #44A1 LL44A1 LDIR ;зануление памяти LD SP,HL ;SP,#44A1 LD A,#08 LD DE,#2F57;трек 0 CALL LL44EC ;Dos LD A,#3C LD C,#FF CALL LL44E9 ;OUT (C),A LL44B3 XOR A ;контроль ошибок LD (#5CD6),A LD HL,#4000;load sector LD A,#0C LD C,#5F CALL LL44E9 ;чтение сектора CALL LL44DD ;загрузки игры DI LD A,(#5CD6) OR A JR NZ,LL44B3 LD HL,#4100;декодирование LD R,A LL44D0 LD A,R DEC HL XOR (HL) XOR L XOR #56 LD (HL),A BIT 6,H JR NZ,LL44D0 JP (HL) ;JP #3FFF... LL44DD LD BC,LL44DD PUSH BC LD BC,#017F LD DE,#2090 JR LL44EC LL44E9 LD DE,#2A53 LL44EC PUSH DE JP #3D2F LL44F0 NOP ;заполнение озу LL44F1 JP LL44A1 LL44F4 LD HL,LL44F0 LD DE,LL44F1 LD BC,#0000 JR LL44F1 ;Именно здесь происходит старт после XOR LLFFFF JR LL44F4 ;RUN по IY... Запуск сего шедевра происходит по IY регистру, содержащему #FFFF. Далее понятно по алгоритму, из которого следует, что загружается сектор #0C (#0B), который в свою очередь грузит основной алгоритм самой программы. ;File: MK 12OK .H ;Алгоритм загрузки основного алгоритма ;"MORTAL KOMBAT" from MAFIA. ;ОРИГИНАЛ ORG #4000 LL4000 DEFW 25000 ;ЭТО ВХОД!!! LL4002 DI LL4003 XOR A OUT (#FE),A LD HL,#C9F1;pop af:ret LD (#5CC2),HL;перехват выхода LD A,#83 ;в 48 ПЗУ LD (#5CC8),A LD IY,#5C3A LD (IY+#00),#FF LD SP,LL4020 LD A,#2C LD C,#FF LL4020 CALL LL4099 LD A,#08 LD DE,#2F57;трек 0 CALL LL409C LD BC,#61A8;задержка LL402E DEC BC LD A,B OR C JR NZ,LL402E LD HL,#2800;сканирование под LD A,#E4 ;адрес ПЗУ с поп- LD C,#1F ;равкой на корот- CALL LL4099 ;кий трек (-256). LD C,#7F LD DE,#3FE5 CALL LL409C LD HL,#61A8;основной алгор. LD B,#01 LL404A XOR A LD (#5CD6),A PUSH BC PUSH HL LD A,B LD C,#5F CALL LL4099 CALL LL408D DI POP HL POP BC LD A,(#5CD6) OR A JR NZ,LL404A INC H ;поправка на дли- INC H ;ну сектора и его INC B ;номер LD A,B ;проверка конца CP #0A ;файла JR NZ,LL404A LD SP,LL4000;run #61A8 LD BC,#1201;размер осн.алг. LD A,H LD R,A LL4073 LD A,R ;разксоривание XOR (HL) ;основного алг. XOR B XOR L XOR #53 LD (HL),A CPD JP PE,LL4073 LD HL,LL4002 LD DE,LL4003 LD BC,#1800 LD (HL),C ;CLS JP #33C3 LL408D LD BC,LL408D PUSH BC LD BC,#017F LD DE,#2090 JR LL409C LL4099 LD DE,#2A53;out (c),a LL409C PUSH DE ;jp dos JP #3D2F Корректировать один "сканирующий" сек- тор недостаточно. Программа в процессе ра- боты ещё в шести случаях просканирует пер- вый короткий трек и прореагирует должным образом (пошлёт fuck). Поэтому необходима основательная коррекция основного алгорит- ма программы. Метод подмены адресов подпрограммы сканирования на другой фраг- мент дал положительный результат, чем и закончил мои труды по снятию защиты от ко- пирования диска. ;File: MK 12OK+.H ;"MORTAL KOMBAT" loader game from #0C sec. ;ЗАПИСЫВАТЬ НА СЕКТОРА #0B,#0C STS'ом!!! ;Переделка Compu-Studio Ltd 1997 ORG #C000 ;НАЧАЛО LD HL,ADRES LD DE,#4000 LD BC,#0100 LDIR DI XOR A LD HL,#4100;ксорим нашу пере- LD R,A ;делку M1 LD A,R DEC HL XOR (HL) XOR L XOR #56 LD (HL),A BIT 6,H JR NZ,M1 EI RET ;записать STS'ом ADRES DISP #4000 LL4000 DEFW 25000 ;RUN программы LL4002 DI LL4003 XOR A OUT (#FE),A LD HL,#C9F1 LD (#5CC2),HL LD A,#83 LD (#5CC8),A LD IY,#5C3A LD (IY+#00),#FF LD SP,LL4020 LD A,#2C LD C,#FF LL4020 CALL LL4099 LD A,#08 LD DE,#2F57 CALL LL409C LD HL,#61A8;адрес программы LD B,#01 ;номер сектора LL404A XOR A LD (#5CD6),A;error load? PUSH BC PUSH HL LD A,B LD C,#5F CALL LL4099 CALL LL408D DI POP HL POP BC LD A,(#5CD6) OR A JR NZ,LL404A INC H ;поправка на но- INC H ;вый сектор INC B ;новый сектор LD A,B CP #0A ;конец? JR NZ,LL404A LD BC,#1201;длина блока LD A,H LD R,A LL4073 LD A,R XOR (HL) XOR B XOR L XOR #53 LD (HL),A CPD JP PE,LL4073 CALL #6F08 ;системные бейсика LD HL,ADRES1 LD DE,#6F08 PUSH DE LD BC,13 LDIR ;блокир. сканиров. POP HL INC HL LD (#6386),HL;замена адресов LD (#6441),HL;в CALL #61AB LD (#644B),HL LD (#6681),HL LD (#6E0F),HL LD (#6EE2),HL LD SP,#4000;на старт програм. LD HL,LL4002 LD DE,LL4003 LD BC,#1800 LD (HL),C JP #33C3 ;clear screen ;Чтение сектора LL408D LD BC,LL408D PUSH BC LD BC,#017F LD DE,#2090 JR LL409C ;OUT в порт LL4099 LD DE,#2A53 LL409C PUSH DE JP #3D2F ;Заменитель сканирования ADRES1 RET CALL #6376 ;page 0 LD A,#01 CALL #62D1 ;trek 1 DI JP #61D5 ;load sistems Спасибо MAFIA за классную идею по защи- те алгоритма от просмотра и взлома. Ламать можно всё, но это действительно круто. Три дня ушло на расксорку и т.д... Значения регистров процессора до начала ксорки: HL,#0000 HL',#29E2 PC,#AA24 R,#8E DE,#3F01 DE',#0100 SP,#4001 I,#00 BC,#40D0 BC',#0004 IX,#4000 DI AF,#0044 AF',#0044 IY,#FFFF IM 1 Здесь значения альтернативного набора не имеют значения, важно только основного набора! Итак, разбор полётов. Слабые места есть даже в самой извращённой защите. Но если нет желания её ломать, тогда можно иммити- ровать. К примеру, если обнаружен короткий трек (программа ADS v2.0 или Afrodita v3.0 показали длину какого-нибудь трека менее, чем 6200 байт), тогда возьми советский дисковод, найди на нём регулятор скорости вращения диска, загрузи программу ADS v2.0 или её любую другую версию. Затем следует в программе войти в режим анализа скорости вращения диска и выставить показатель 310 об/мин. Нормальный показатель равен 300 оборотов или очень близкое к этому значе- нию. Следует учесть, что при такой скорос- ти вращения диска качество чтения даже при наличии АПЧ существенно падает, поэтому на перерегулированный дисковод надо ТОЛЬКО писать. У тебя два дисковода? Если нет, то забудь о том, что здесь читал :'( Ещё одним слабым местом завязки защиты и алгоритма игры является то, что сам ал- горитм не компрессирован. Это обстоятель- ство позволило безнаказанно поставить за- щёлки в программу. А вот если бы была изо- щрённая компрессия, тогда данная задача была менее решаемой, т.е. более трудноре- шаемой. Вот. А так - всё хорошо, прекрас- ная маркиза; всё хорошо, всё хорошо... ------------------------------------------