(С) 1996/97 MAFIA Corp. & Мах Iwamoto
(С) 1997 MAX (Cracked)
------------------------------------------
Текст описывает защиту на диске с игрой
"MORTAL KOMBAT" от MAFIA corp. Собственно,
защиту для игры написал непосредственно
знаменитый Мах 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 9ОК .Н
;Алгоритм загрузки сектора #0С в игре
;"MORTAL KOMBAT" from MAFIA
;ОРИГИНАЛ
ORG #44A1
LLЧЧA1 LDIR ;зануление памяти
LD SP,HL ;SP,#44A1
LD A,#08
LD DE,#2F57;трек 0
CALL LL44EC ;Dos
LD A,#3С
LD С,#FF
CALL LL44E9 ;OUT (С),A
LLЧЧBЗ XOR A ;контроль ошибок
LD (#5CD6),A
LD HL,#4000;load sector
LD A,#0С
LD С,#5F
CALL LL44E9 ;чтение сектора
CALL LLЧЧDD ;загрузки игры
DI
LD A,(#5CD6)
OR A
JR NZ,LLЧЧBЗ
LD HL,#4100;декодирование
LD R,A
LLЧЧDO LD A,R
DEC HL
XOR (HL)
XOR L
XOR #56
LD (HL),A
BIT 6,Н
JR NZ,LLЧЧDO
JP (HL) ;JP #ЗFFF...
LLЧЧDD LD ВС,LLЧЧDD
PUSH ВС
LD ВС,#017F
LD DE,#2090
JR LL44EC
LL44E9 LD DE,#2A53
LL44EC PUSH DE
JP #3D2F
LLЧЧFO NOP ;заполнение озу
LLЧЧF1 JP LLЧЧA1
LLЧЧFЧ LD HL,LLЧЧFO
LD DE,LLЧЧF1
LD ВС,#0000
JR LLЧЧF1
;Именно здесь происходит старт после XOR
LLFFFF JR LLЧЧFЧ ;RUN по IY...
Запуск сего шедевра происходит по IY
регистру, содержащему #FFFF. Далее понятно
по алгоритму, из которого следует, что
загружается сектор #0С (#0B), который в
свою очередь грузит основной алгоритм
самой программы.
;File: MK 12ОК .Н
;Алгоритм загрузки основного алгоритма
;"MORTAL KOMBAT" from MAFIA.
;ОРИГИНАЛ
ORG #4000
LLЧO00 DEFW 25000 ;ЭТО ВХОД!!!
LLЧO02 DI
LLЧO03 XOR A
OUT (#FE),A
LD HL,#С9F1;рор af:ret
LD (#SCC2),HL;перехват выхода
LD A,#83 ;в 48 ПЗУ
LD (#SCC8),A
LD IY,#5C3A
LD (IY+#00),#FF
LD SP,LLЧO20
LD A,#2С
LD С,#FF
LLЧO20 CALL LLЧO99
LD A,#08
LD DE,#2F57;трек 0
CALL LLЧO9С
LD ВС,#61A8;задержка
LLЧO2Е DEC ВС
LD A,B
OR С
JR NZ,LLЧO2Е
LD HL,#2800;сканирование под
LD A,#Е4 ;адрес ПЗУ с поп-
LD С,#1F ;равкой на корот-
CALL LLЧO99 ;кий трек (-256).
LD С,#7F
LD DE,#3FE5
CALL LLЧO9С
LD HL,#61A8;основной алгор.
LD B,#01
LLЧO4A XOR A
LD (#5CD6),A
PUSH ВС
PUSH HL
LD A,B
LD С,#5F
CALL LLЧO99
CALL LLЧO8D
DI
POP HL
POP ВС
LD A,(#5CD6)
OR A
JR NZ,LLЧO4A
INC Н ;поправка на дли-
INC Н ;ну сектора и его
INC B ;номер
LD A,B ;проверка конца
СР #0A ;файла
JR NZ,LLЧO4A
LD SP,LLЧO00;run #61A8
LD ВС,#1201;размер осн.алг.
LD A,Н
LD R,A
LLЧO73 LD A,R ;разксоривание
XOR (HL) ;основного алг.
XOR B
XOR L
XOR #53
LD (HL),A
CPD
JP РЕ,LLЧO73
LD HL,LLЧO02
LD DE,LLЧO03
LD ВС,#1800
LD (HL),С ;CLS
JP #33С3
LLЧO8D LD ВС,LLЧO8D
PUSH ВС
LD ВС,#017F
LD DE,#2090
JR LLЧO9С
LLЧO99 LD DE,#2A53;out (с),а
LLЧO9С PUSH DE ;jp dos
JP #3D2F
Корректировать один "сканирующий" сек-
тор недостаточно. Программа в процессе ра-
боты ещё в шести случаях просканирует пер-
вый короткий трек и прореагирует должным
образом (пошлёт fuck). Поэтому необходима
основательная коррекция основного алгорит-
ма программы. Метод подмены адресов
подпрограммы сканирования на другой фраг-
мент дал положительный результат, чем и
закончил мои труды по снятию защиты от ко-
пирования диска.
;File: MK 12ОК+.Н
;"MORTAL KOMBAT" loader game from #0С sec.
;ЗАПИСЫВАТЬ НА СЕКТОРА #0B,#0С STS`ом!!!
;Переделка Compu-Studio Ltd 1997
ORG #С000 ;НАЧАЛО
LD HL,ADRES
LD DE,#4000
LD ВС,#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,Н
JR NZ,M1
EI
RET ;записать STS`ом
ADRES DISP #4000
LLЧO00 DEFW 25000 ;RUN программы
LLЧO02 DI
LLЧO03 XOR A
OUT (#FE),A
LD HL,#С9F1
LD (#SCC2),HL
LD A,#83
LD (#SCC8),A
LD IY,#5C3A
LD (IY+#00),#FF
LD SP,LLЧO20
LD A,#2С
LD С,#FF
LLЧO20 CALL LLЧO99
LD A,#08
LD DE,#2F57
CALL LLЧO9С
LD HL,#61A8;адрес программы
LD B,#01 ;номер сектора
LLЧO4A XOR A
LD (#5CD6),A;еггог load?
PUSH ВС
PUSH HL
LD A,B
LD С,#5F
CALL LLЧO99
CALL LLЧO8D
DI
POP HL
POP ВС
LD A,(#5CD6)
OR A
JR NZ,LLЧO4A
INC Н ;поправка на но-
INC Н ;вый сектор
INC B ;новый сектор
LD A,B
СР #0A ;конец?
JR NZ,LLЧO4A
LD ВС,#1201;длина блока
LD A,Н
LD R,A
LLЧO73 LD A,R
XOR (HL)
XOR B
XOR L
XOR #53
LD (HL),A
CPD
JP РЕ,LLЧO73
CALL #6F08 ;системные бейсика
LD HL,ADRES1
LD DE,#6F08
PUSH DE
LD ВС,13
LDIR ;блокир. сканиров.
POP HL
INC HL
LD (#6386),HL;замена адресов
LD (#6441),HL;в CALL #61AB
LD (#644B),HL
LD (#6681),HL
LD (#6E0F),HL
LD (#бЕЕ2),HL
LD SP,#4000;на старт програм.
LD HL,LLЧO02
LD DE,LLЧO03
LD ВС,#1800
LD (HL),С
JP #33С3 ;clear screen
;Чтение сектора
LLЧO8D LD ВС,LLЧO8D
PUSH ВС
LD ВС,#017F
LD DE,#2090
JR LLЧO9С
;OUT в порт
LLЧO99 LD DE,#2A53
LLЧO9С 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`,#29Е2 РС,#AA24 R,#8Е
DE,#3F01 DE`,#0100 SP,#4001 I,#00
ВС,#40D0 ВС`,#0004 IX,#4000 DI
AF,#0044 AF`,#0044 IY,#FFFF IM 1
Здесь значения альтернативного набора
не имеют значения, важно только основного
набора!
Итак, разбор полётов. Слабые места есть
даже в самой извращённой защите. Но если
нет желания её ломать, тогда можно иммити-
ровать. К примеру, если обнаружен короткий
трек (программа ADS v2.0 или Afrodita v3.0
показали длину какого-нибудь трека менее,
чем 6200 байт), тогда возьми советский
дисковод, найди на нём регулятор скорости
вращения диска, загрузи программу ADS v2.0
или её любую другую версию. Затем следует
в программе войти в режим анализа скорости
вращения диска и выставить показатель 310
об/мин. Нормальный показатель равен 300
оборотов или очень близкое к этому значе-
нию. Следует учесть, что при такой скорос-
ти вращения диска качество чтения даже при
наличии АПЧ существенно падает, поэтому на
перерегулированный дисковод надо ТОЛЬКО
писать. У тебя два дисковода? Если нет, то
забудь о том, что здесь читал :`(
Ещё одним слабым местом завязки защиты
и алгоритма игры является то, что сам ал-
горитм не компрессирован. Это обстоятель-
ство позволило безнаказанно поставить за-
щёлки в программу. А вот если бы была изо-
щрённая компрессия, тогда данная задача
была менее решаемой, т.е. более трудноре-
шаемой. Вот. А так - всё хорошо, прекрас-
ная маркиза; всё хорошо, всё хорошо...
Other articles: