Black Crow
#02
01 ноября 1998 |
|
Программистам - The hacker club: Mortal combat описание жащиты.
(С) 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 оборотов или очень близкое к этому значе- нию. Следует учесть, что при такой скорос- ти вращения диска качество чтения даже при наличии АПЧ существенно падает, поэтому на перерегулированный дисковод надо ТОЛЬКО писать. У тебя два дисковода? Если нет, то забудь о том, что здесь читал :`( Ещё одним слабым местом завязки защиты и алгоритма игры является то, что сам ал- горитм не компрессирован. Это обстоятель- ство позволило безнаказанно поставить за- щёлки в программу. А вот если бы была изо- щрённая компрессия, тогда данная задача была менее решаемой, т.е. более трудноре- шаемой. Вот. А так - всё хорошо, прекрас- ная маркиза; всё хорошо, всё хорошо...
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября