Как работать с защищёнными программами (тайники спектрума) 1990 г.

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


7 . ЗАЩИТА ЗАГРУЗЧИКОВ

Все игры имеют хорошо защищенную программу, написанную
на бейсике. Это важнейший с точки зрения действенности
зашиты элемент всей программы, т.к. с бейсика начинается
считывание всей программы. Если бейсиковский загрузчик
защищен слабо, то легко прочитать и программу , как
это было показано на примере загрузчиков фирмы ULTINAME.
Одним из способов снятия зашиты загрузчиков является
считывание их с помощью программ "LOAD-MERGE", описанных
выше. Однако иногда бывает лучше поместить этст загрузчик
не в память, предназначенную для бейсика, а выше RAMTOR,
чтобы можно было рассматривать его не опасаясь возможности
случайных изменений в нем. Для этого есть очень действенный

метод-считать программу на бейсике как блок машинного кода
под удобный для нас адрес. Для этого надо знать длину
программы,которую необходимо считать (можно воспользоваться
процедурой CZYTACZ, описанной выше). Кроме того нужно иметь
немного свободного места на магнитной ленте. Этот способ
основан на обмане инструкции LOAD путем подмены заголовков.
На ленте нужно записать заголовок блока кода с помощью
SAVE "BAS" CODE 30000,750 - если известно что длина програм-
мы, например, 7 90 байт. Если длина неизвестна - задается
значительно большая длина блска по сравнению с возможной
реально. На ленте записывается только сам заголовок и запись
прерывается. После этого нажимаем клавишу BREAK, установим
ленту точно перед записанным заголовком, а ленту с
программой -сразу после заголовка программы,но перед
требуемым блоком данных. Вводим:

CLEAR 2 99 99: LOAD""CODE или

CLEAR 2 99 99: LOAD""CODE 3 00 00
и считываем заголовок. Сразу после его считывания нажать в
магнитофоне СТОП, заменить кассету и нажать ПУСК (все это
время компьютер ждет блок данных). Теперь считыеается про-
грамма на бейсике, но под адрес 3 000 0 - выше RAMTOR.
Если в заголовке мы задали большую длину программы,чем тре-
бовалось, то считывание закончится сообщением "TARE LOADING
ERROR",^ это не имеет значения.Теперь можно любым способом
смотреть считанную программу, хотя бы набирая для этого
программу на бейсике.

Кроме этого метода есть и другой, но для пользования им
необходимо знание ассемблера.

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

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

регистрах микропроцессора. Так в регистре IX задается адрес,
по которому хотим записать блок данных, в паре DE -длина
этого блока. В буфер помешаем 0 -если хотим записать
заголовок, и 255 -если это блок данных. Указатель переноса
0ARRY устанавливаем в 1, иначе процедура 1366 вместо LOAD
выполнит VERIFY.

Ниже приведен пример загрузки с ленты без заголовка.

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

LD DE,6912; длина блока

LD А,2 55; блок данных

S0F; установка 0ARRY

CALL 13 66; вызов LOAD-BYTES

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

Процедура 1366 в случае ошибки считывания не выводит
сообщение "ТАРЕ LOADING ERROR", но существует еще одна
процедура загрузки, которая это делает. Она находится под
адресом 2050 и выглядит так:

2050 0ALL 1366; считывание блока данных

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

2054 RST 8; иначе RST 8 с сообщением
2 055 DEFB 26: "ТАРЕ LOADING ERROR"

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

Иногда загрузчики не используют ни ту ни другую проце-
дуру, а заменяют их собственными,правда обычно похожими на
процедуру 1366 или являющимися ее переделкой, благодаря
которой, например, блоки данных загружаются в нижнюю часть
памяти. с больших адресов к меньшим, или загрузка идет с
другой скоростью. Такую программу следует анализировать с
помощью дизассемблера, сравнивая ее фрагменты с тем. что
находится в ПЗУ.

Поясним порядок использования процедуры из ПЗУ для счи-
тывания беисика по любому адресу, а не в предназначенную
для него область. С помощью 0ZITA0Z прочитаем заголовок
программы, которую мы хотим прочитать, и запомним ее длину
вместе с переменными. Затем ВЕедем программу на ассемблере,
которая считает бейсик под установленный адрес (выше
RAMTOR):

LD IX, АДРЕС

LD DE, ДЛИНА
LD A,255
S0F

JP 2050

Так же как й при подмене заголовка, если неизвестна
длина прграмны - задаем ее завышенное значение, но при этом
чтение завершится сообщением ТАРЕ LOADING ERROR. Каждый раз
считывать ассемблер, чтобы ввести программу, приведенную
выше, достаточно хлопотно, поэтому лучше создать ее на
бейсике с помощью РОКЕ:

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

20 RANDOMIZE A: CLEAR A-1

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

40 LET ADR=256*B+A

50 INPUT "ДЛИНА BASIK?";C

60 RANDOMIZE C: LET C=PEEK 23670

70 LET D=PEEK 23671

80 FOR N=ADR TO ADR+11

90 READ X: POKE N,X

100 NEXT N

110 DATA 221,33,A, B, 17,C,D,62,255,195,2, 8

12 0 RANDOMIZE USR ADR

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

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




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

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



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

Похожие статьи:
Сaтaнинcкaя Библия - Книгa Люцифeрa II. Нacтyплeния Сaтaнинcкoй Эры.
Реклама - реклама и объявления.
news - новости.
Enlight'97 - Как мы провожали Maxwella'a на Инлайт. День первый... День второй... Комментарии главного организатора Enlight'a.
Печатается с продолж. - Как ломаются полуоси (часть 1).

В этот день...   25 апреля