Тайники ZX Spectrum и как установить вечную жизнь 1994 г.

Глава 6 - защита загрузчиков.


б- ЗАЩИТА ЗАГРУЗЧИКОВ

Все игры имеют хорошо защищенную программу, написанную на БЕЙСИКе, т. к.
это важнейший (с точки действенности защиты) элемент-всей программы. Ведь с
БЕЙСИКа начинается считывание всей программы. Если бейсиковский загрузчик
защищен слабо, то взлом всей программы значительно облегчен. Примером этого
являются загрузчики фирмы ULTIMATE, представленные в предыдущем разделе.
Одним из способов снятия защиты загрузчиком является считывание их с помощью
программы "LOAD/MERGE* (смотри раздел 2). Однако, иногда лучше поместить этот
загрузчик не в память, предназначенную для БЕЙСИКа, а выше RAMTOR, чтобы
можно было спокойно рассматривать его не опасаясь возможности случайных изме-
нений в нем.

Для этого имеется очень действенный метод - считывание программы на БЕЙСИКе
как блока машинного кода под удобный для нас адрес. Чтобы этого добиться нужно
знать длину программы, которую мы хотим Считывать (можешь использовать проце-
дуру "CZYTACZ" из раздела 2), хотя можно обойтись и без длины. Кроме того требу-

ется немного свободного места на мапштной ленте. Этот способ основывается на
обмане инструкции LOAD путем подмены заголовков.

На свободной ленте записывается заголовок блока кода с помощью SAVE "BAS"
CODE 30000,750. если мы знаем, что длина программы составляет 750байт. Если мы
ее не знаем - подаем соответственно большее значение даже порядка нескольких
десятков килобайт, хотя программа может иметь всего лишь 100 байт длины. На ленте
записываем только сам заголовок, прерывая запись, после этого нажимаем клавишу
"BREAK". Теперь устанавливаем ленту точно перед записанным заголовком, а ленту
с программой - сразу после заголовка программы, но перед требуемым блоком данных,
вводим:

CLEAR 29999: LOAD,m CODE

или

CLEAR 29999: LOAD— CODE 30000

и считываем заголовок.

Сразу после его считывания мы нажимаем СТОП в магнитофоне, заменяем кассету
и вновь нажимаем ПУСК (все это время компьютер ждал блок данных). Теперь
считывается программа на БЕЙСИКе, но под адрес 30000 - выше RAMTOR. Если мы
задали в заголовке завышенную длину программы, то считывание кончается сообще-
нием Таре loading error", но это не мешает - теперь уже любым способом можно
смотреть считанную программу на БЕЙСИКе. Кроме этого метода существует и
второй, но для того чтобы им пользоваться, обязательно знание АССЕМБЛЕРа (а
пользоваться стоит, т. к. он дает большие взможности в раскрытии программ, а знание
ее позволяет расшифровывать работу загрузчика.

Очень часто (особенно в новейших программах) встречаются блоки программ,
записанные и считываемые в память компьютера без заголовка. Это достаточно ори-
гинальная мера защиты обычно отпугивает начинающих, но раскрытие такой про-
граммы не является вовсе трудным. Вся тайна основана на хранящихся в ROM проце-
дур, используемых с помощью инструкций LOAD, SAVE, VERIFY, MERGE.

Под адресом #0556 (1366) находится процедура LOAD-BYTES, считывающая с
магнитофона блок данных, или пилота и следующую за ним информацию. При этом
не важно будет ли это заголовок, или требуемый блок данных, которые следует
поместить где-то в памяти.

Начнем же сначала. Каждая защищенная программа начинается с загрузчика
написанного на БЕЙСИКе. Программа, применяющая загрузку без заголовков (с
помощью процедуры 1366 или другой), должна быть написана на машинном коде,
как каждая процедура, обслуживающая магнитофон. Чаще всего это пограмма поме-
щается в одной из строк БЕЙСИКа. Например, после инструкции REM, или в области
переменных БЕЙСИКа. После считывания, загрузчик на БЕЙСКе запускается и
выполняет инструкцию RANDOMIZE USR..., инициируя тем самым работу машин-
ной программы. Процедура LOAD-BYTES требует соответствующих входных пара-
метров. Они передаются в соответствующих регистрах микропроцессора. Так в реги-
стре IX задаем адрес, под который хотим прочесть блок данных, а в паре DE - длину
этого блока. В буфер помещаем 0, если хотим считать заголовок и 255 если это блок
данных. Кроме того, указатель переноса устанавливаем (CARRY) в 1, т. к. иначе
процедура 1366 вместо LOAD выполнила бы функцию VERIFY. Ниже дан пример
процедуры, задеужающейся с ленты без заголовка:

LD IX,16384 ;Адрес считывания

LD DE.6912 ;Длина блока

LD А,255 ;Блок данных

SCF ;Установка CARRY

CALL 1366 ;Вызов LOAD-BYTES

RET ;Выход из подпрограммы

Процедура 1366 в случае ошибки считывания не выводит сообщение Type loading
error". Но сущесвует еще одна процедура загрузки, которая это делает. Она находится
под адресом 2050-и выглядит так:

2050 CALL 1366 Считывание блока данНых

2053 RET С ;Возврат, если не было ошибки

2054 RST 8 ;Иначе RST 8 с сообщением

2055 DEFB 26 ;TYPE LOADING ERROR"
После возврата из процедуры 1366 указатель переноса содержит информацию о

правильности считывания блока. Если он удален, то это означает, что наступила
ошибка. Некоторые загрузчики используют процедуру 2050, а не 1366.

Иногда загрузчики не пользуются ни той ни другой процедурами, а заменяют их
собственными, но они, однако, обычно очень похожи на процедуру 1366 или даже
являются ее переделкой, благодаря которой, например» блоки данных загружаются в
нижнюю часть памяти - с больших адресов к нижним или загрузка идет с другой
скоростью. Такую программу следует анализировать с помоью дизассемблера (напри-
мер, MONS), сравнивая некоторые ее фрагменты с тем, что находится в ROM.

Сейчас мы объясним как использовать процедуру из ROM для считывания БЕЙ-
СИКа по любому адресу, а не в область, предназначенную для него: сначала с по-
мощью "SZYTACZ" прочитаем заголовок программы, которую мы хотим вскрыть, и
запоминаем ее длину (т. е. длину всего блока - программу вместе с переменными).
Затем вводим соответствующую программу, которая прочтет БЕЙСИК под адрес,
который мы установим (выше RAMTOR):

LD 1ХДЦРЕС
LD DE,ДЛИНА
LD A,255
SCF

JP 2050

Также, как и при подмене заголовка, если мы незнаем длину программы, то можем
задать завышенное значение, но тоща чтение завершиться сообщением Type loading
error". Но считывание ассемблера каждый раз, чтобы ввести программу, приведенную
выше, может вызвать раздражение. Следовательно, лучше создавать эту программу с
уровня БЕЙСИКа с помощью РОКЕ:

10 INPUT " АДРЕС ЧТЕНИЯ BASIC ?";А

20 RANDOMIZE A: CLEAR А-1

30 LET А-РЕЕК 23670: LET В-РЕЕК 23671

40 LET ADR-256*B+A

50 INPUT "ДЛИНА BASIC ?";С

60 RANDOMIZE С: LET С-РЕЕК 23670

70 LET D-PEEK 23671

80 FOR N-ADR TO ADR+11

90 READ X: POKE N,X

100 NEXTN

110 DATE 221 ,33,A,B, 17,С,D,62,255,195,2,8

120 RANDOMIZE USR ADR

Устанавливаем лету С обрабатываемой программой за ее заголовком. Затем запу-
скаем программу, приведенную выше, вводим данные и включаем магнитофон. Ре-
зультат аналогичен тому, который получаем при подмене заголовков, но первым же
видимым достоинством этого способа является то, что мы не создаем беспорядок на
кассетах.

В завершение стоит вспомнить еще об одной процедуре, размещенной в ROM под
адресом 1218. Это процедура SAVE-BYTES обратная LOAD-BYTES, т. е. записыва-
ющая на ленту блок с заданными параметрами: перед ее выполнением в регистре IX
размещаем адрес с которого начинается здесь запись, DE содержит длину записыва-
емого блока. В буфере помечаем должен ли это быть заголовок (0) или блок программы
(255). Состояние указателя CARRY значения не имеет.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Про автомобили - мало кто nрeдставляeт сeбe, что автомобиль мог бы быть совсeм другим, eсли бы нe...
Пати в Украине - Мечты или реальность?
B.B.S. Новости - О работе B.B.S.'ок.

В этот день...   29 января