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

Глава 3. - способ записи программ на БЕЙСИКЕ.


3. СПОСОБ ЗАПИСИ ПРОГРАММ НА БЕЙСИКЕ

Практически каждая программа имеет хотя бы процедуру
загрузчика, написанную на бейсике, если же она такой про-
цедуры не имеет-то от вмешательства извне она не защищена
При считывании простой бейсик-программы с ленты в течение
1-2 секунд идет пилот, затем кратковременно появляются
тонкие мерцающие желто-фиолетовые полоски, свидетельствую-
щие о том, что компьютер считывает в память информацию.
Ее 17 байтов-это так называемый заголовок. Появляется
надпись:

"BYTES: ", "PROGRAMM", "CHARAKTER ARRAY:" или "NUMBER ARRAY:",
после небольшого перерыва начнется второй пилот (более
короткий),а после него считывается собственно сама прог-
рамма. Рассмотрим более подробно заголовки,так как в них
содержатся основные сведения о считываемых программах.

Заголовок содержит 17 байтов- с 0-го по 16-й.
Значения байтов приведены в таблице.

Нулевой байт означает тип блока и равен:

0 - если программа на бейсике;

3 - если это блок машинного кода (записанный с
помощью SAVE ". . . " CODE или SAVE "... " SKREEN$ , которые
означают то же, что и SAVE "..." CODE 16384,6912.
Если же этот заголовок предшествует набору, являющемуся
массивом переменных бейсика ( записанному с помощью
SAVE ". . . " DATA . . . ) , то байт содержит:

1 - для числовых массивов и

2 - для символьных.

Следующие 10 байтов -это имя считываемого блока или текст
появляющийся после загрузки заголовка за надписью
"PROGRAMM: ", "BYTES:" и т. д.

Байты 11 и 12 содержат двухбайтовое число (первый байт -
младший), которое указывает длину блока, к которому
относится заголовок.

В зависимости от считываемого блока байты с 13 по 16 интер-
претируются по разному. В заголовках программ, написанных
на бейсике, байты 13 и 14 содержат номер строки, с которой
запускается программа - если она была записана с помощью
SAVE "..." LINE NR. Если программа была записана без опера-
ции LINE и после считывания не запускается автоматически,
то значение этого числа больше 32767. Одним из способов
нейтрализации самозапускаюшихся программ на бейсике являет-
ся замена этих двух байтов на число большее 32767.
Байты 15 и 16 содержат число, указывающее длину самой про-
граммы на бейсике ( т. к. SAVE " . . . " или SAVE " . . . " LINE
записывает программы со всеми переменными, т. е. содержимое
памяти от байта, указанного системной переменной PROG,
до байта, определяемого системной переменной E_LINE. Если
от всей длины блока (байты 11 и 12) отнимем это число, то
узнаем, сколько байтов в этом блоке занимают переменные
бейсика. Все это сказано о заголовках программ на бейсике.

В заголовках блоков машинного кода ("BYTES") байты
15 и 16 не используются, а байты 13 и 14 составляют двух-
байтовое число, указывающее, по какому адресу надо считать
следующий за заголовком блок.

В заголовках массивов из этих 4-х байтов используется
только 14-й байт, который представляет собой имя считывае-
мого массива, ин записан так же как и имена всех пеоеменных
бейсика ( в области dT VARS до E_LINE ), т.е. три старших
бита означают тип переменной, а пять младших битов-ее имя.

На листинге 1 приведена программа, позволяющая читать
заголовки программ. Наберите программу,внимательно прове-
рив количество пробелов в строках с инструкциями DATA,
запустите ее RUN и подождите, пока на экране не появится
информация об адресах начала и конца процедуры, а также о
ее длине, которая должна составлять 2 84 байта. Если этого
не призошло. проверьте, все ли строки введены без ошибок.
Если все выполнено верно, то на ленту записана процедура

"ЧТЕН", позволяющая прочитать любой заголовок. После
записи на ленту, из ОЗУ ее можно стереть.
Процедура "ЧТЕН" будет работать правильно независиио от
того, по какому адресу она будет загружена. Можно считать
ее: LOAD "CZYTACZ" CODE АДРЕС

а затем запустить с помощью RANDOMIZE USR АДРЕС

После запуска процедура считывает по адресу 23296
(буфер принтера) первый встреченный заголовок. Если из-за
подключенных внешних устройств этот адрес нас не устраива-
ет, можно изменить его, заменив в строке 200 листинга 1
число #005В шестнадцатиричным адресом, по которому мы
хотим считать заголовок (две первые цифры являются младшим
байтом этого адреса ) . Чтобы после этой замены избежать
проверки контрольной суммы в этой строке, в конце текста,
взятого в кавычки, вместо пробела и 4-х цифр контрольной
суммы нужно поместить литеру "S" с четырьмя ведущими
пробелами.

После считывания заголовка процедура считывает заклю-
ченную в нем информацию и возвращается в бейсик,но считан-
ного заголовка не уничтожает,следовательно , если необходимо
просмотреть его дополнительно, то сделать это можно
используя функцию РЕЕК.

Однако чтения заголовка мало для того чтобы прочитать
блоки,записанные на ленте. Необходимо знать, как разместить
эти блоки в памяти, не позволяя им при этом начать работу.

В случае блоков типа "BYTES" обычно достаточно загру-
зить их под принудит ельный адрес выше RAMTOR. Например:

CLEAR 29999 : LOAD ""CODE 30000
Этот метод работает, если блок не очень длинный (не более
40К) . Более длинные блоки могут не разместиться в памяти.
Тогда нужно разделить их на несколько коротких частей.
Позже мы посмотрим как это сделать. Также и в случае масси-
вов - их загрузка не представляет трудностей -достаточно
применить обычную в таких ситуациях инструкцию LOAD ""
DATA ... . Сложнее выглядит считывание программ на бейсике.
Они обычно записываются с помощью SAVE "... "LINE "...",
а в самом начале - строка, с которой должны выполняться
инструкции, закрывающие программу до останова. Простейшим
решением является загрузка программы не с помощью LOAD,
а с помощью MERGE "", но этот метод не всегда дает резуль-
тат. Из этой ситуации есть два выхода: подменить заголовок
программы, или использовать представленную ниже программа
"LOAD/MERGE". Первый способ основан на замене заголовка
записанной на ленте программы на такой же. но не вызывающий
самозапуска программы. С этой целью можно использовать
программу "COPY-COPY" -считать заголовок программы, нажать
BREAK, затем инструкцией LET заменить ее параметр старта
на число больше 32767 (т.е. выполнить например LET I=32768,
если корректируемый таким образом заголовок был считан как
первый набор) . Измененный таким образом заголовок записыва-

ем где-нибудь на ленте. Убираем из памяти программу COPY-
COPY и вводим LOAD. Считываем только что сделанный заголо-
вок, и сразу после его окончания останавливаем ленту.
Теперь вставляем в магнитофон кассету с программой - так,
чтобы считать только текст программы без заголовка.

Другой способ значительно выгоднее первого. Введем
в память (с клавиатуры или ленты) программу LOAD/MERGE,
приведенную на листинге 2. После запуска она начинает
ждать первую программу на бейсике, находящуюся на ленте,
считывает ее совершенно так же как инструкция LOAD, но
после загрузки не позволяет программе запуститься -
выводит сообщение "0 ОК" с информацией, с какой строки
считанная программа должна была стартовать.

ЛИСТИНГ 1

10 CLEAR 5 999 9:LET POZ=60000
20 LET ADR=POZ

3 0 RESTORE: READ A, B, C, D, E, F
40 DATA 10. 11. 12, 13, 14. 15
5 0 LET NR=2 0 0: RESTORE NR

60 LET S=0:READ А$: IF A$="." THEN GOTO 130
70 FOR N=l TO LEN А$-5 STEP 2
80 LET W=16*VAL A$(N)+A$(N+1)
90 POKE ADR,W : LET ADR=ADR+1: LET S=S+W
100 NEXT N

110 IF VAL A$ (N) <>S THEN PRINT " OSN - W STROK" : NR: STOP
120 LET NR=NR+1:GOTO 60

130 PRINT "VSE DANNYE VERNY";"NASHALO:";
POZ;"CONEC_:_";ADR-1;"DLINA_:_";ADR-POZ
140 SAVE " CZYTACZ" CODE POZ,ADR-POZ
150 REM

200 DATA "2192 000 9E5DD21005BDDE51111 1246"
210 DATA "0 0AF3 7CD5 6 05DDE13 0F23E02CD 1531"
220 DATA "011611C0 0 9DD7E0 0CD0A0CDDE5 1265"
230 DATA "D113010A00CD3C202A7B5CD1E5 1231"
240 DATA "D5ED537B5C0109 00CD3C2 0DD46 1346"
250 DATA "0CDD4EDBCD2B2DCDE32DE1DD7E 1872"
260 DATA "00DD460EDP4E0DC5A7202BEB01 1292"
270 DATA "190 0CD3C2 0D5DD4 610DD4E0FCD 1361"
280 DATA "2B2DCDE32DD1C17 8E6C02 0 6EC5 1848"
290 DATA "0113 0 0CD3C2 0C1CD2B2DCDE3 2D 1280 "
300 DATA "185EFE03203601700009EB0111 836"
310 DATA "0018E60D449C75676F9D9B2073 1281"
320 DATA "516D65676F2070726F6772616D 1313"
330 DATA "75200D4175747F737461727420 1161"
340 DATA "2D206C696E69120D2EE1BB0181 1239"
350 DATA "0009EB010900CD3C2 0C13E1FA0 997 "
360 DATA "F660D7DD7E003D28033E2 4D73E 1383"
370 DATA "2 8D7 3E2 9D7E122 7B5C3E0DD7C9 1538"

380 DATA "04081020202010000010181030 268"
390 DATA "10000008103840380478000D41 430"
400 DATA "64726573209061646F77616E69 1357"
410 DATA "61200D5461626069636120 862"
42 0 DATA "."

ЛИСТИНГ 2

1 REM LOAD/MERGE TS&RD 1987

2 FOR N=60000 TO 60025: READ A: POKE N,A: NEXT N

3 RANDOMIZE USR 60000

4 DATA 1, 34, 0, 247, 213, 221, 225, 253, 54, 58, 1, 221,
54, 1, 225, 205, 29, 7, 42, 66, 92, 34, 69, 92, 207, 255

ЛИСТИНГ 3

10; LOAD/MERGE
2 0;

30 ORG 60000

40 LD ВС. 3 4

50 RST 48

60 PUSH DE

70 POP IX

80 LD (IY+58),1

90 LD (IX+1),255

100 0ALL 1821

110 LD HL,(23618)

120 LD (23621),HL

130 RST 8

140 DEFB 255




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

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



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

Похожие статьи:
Party - отчет с Hidden Party Millenium.
Рассказ - Война и мир... не по Л.Н.Толстому.
Реклама - реклама и объявления.
Шведская тройка - Это была их рядовая встреча, встреча двух друзей - Саши и Вити...
Как написать в Oberon - Написать статью в "ОБЕРОН" очень просто!

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