Глава
2
КАК БОРОТЬСЯ С BREAK'OM
В
предыдущей главе было подробно описано, как обращаться с загрузчиком на Бейсике
уже после того, как был получен его листинг. Даже в том случае, когда
полученное «нечто» слабо напоминает листинг. Вполне законно у Вас мог
возникнуть вопрос, как получить это «нечто» (листинг); ведь далеко не всегда,
нажав клавишу Break после загрузки первого файла, Вы получите то, что хотели.
Результаты вмешательства в нормальный ход загрузки могут быть совершенно непредсказуемыми,
начиная с того, что программа сбросится, и кончая тем, что она повиснет или
обзовет Вас неприличным словом.
Подробнее опишу эффекты, возможные при останове программы клавишей
Break, а также способы, которыми эти эффекты достигаются. Эта информация
может быть полезна скорее не для вскрытия чужих программ, а для защиты своих
(не забывайте, однако, что воспользовавшись данными ниже указаниями, Вы
защитите программу только от того, кто не читал эту брошюру).
1. После
нажатия на клавишу Break загрузчик продолжает исправно работать.
Перекреститесь
и откажитесь от мысли вскрыть эту программу — к этому Вы еще не готовы, так как
гарантированно можно заявить, что загрузчик написан в машинных кодах (это не
имеет отношения к профессионалам, которые читают это произведение только для
того, чтобы посмеяться над автором).
2. После
нажатия Break компьютер обнуляется.
Если загрузчик
написан на Бейсике, то наиболее вероятно, что в нем использована следующая
инструкция:
РОКЕ (РЕЕК 23613+256,РЕЕК 23614),0:
РОКЕ (РЕЕК 23613+256*РЕЕК 23614)+1,0
или аналогичная.
Выполнение
подобной операции изменяет адрес «возврата по ошибке» на нулевой (системная
переменная ERR_SP). Таким образом, вместо того, чтобы перейти на подпрограмму
ПЗУ, которая выводит сообщение об ошибке, программа переходит на нулевой адрес:
машина обнуляется (те, кто ни разу не видел, как машина обнуляется, могут
попробовать ввести RANDOMIZE USR 0 или нажать кнопку сброса).
3. После
нажатия Break экран становится черным и машина ни на что не реагирует
(кроме кнопки сброса, надо полагать). Скорее всего использован оператор РОКЕ
23659,0, устанавливающий количество строк в служебном экране равным нулю.
К описанному эффекту приводит попытка бейсик-интерпретатора уложить свое сообщение
в ноль строк.
4. После
нажатия Break цвет экрана не меняется, нижние две строки экрана имеют
цвет бордюра. Цвет экрана также может иметь цвет бордюра (в том числе и черный
— не путайте с предыдущим случаем). При нажатии на клавиши слышится нежное пощелкивание,
но на экране ничего не изменяется.
Если Вы еще не
успели пощелкать клавишами, наберите BORDER 7 (или любое другое
значение) и, невзирая на то, что на экране ничего не появляется, нажмите Enter.
После этого Вы скорее всего увидите надпись 0 ОК, 0:1. Теперь можно
работать как обычно. (Если Вы уже успели пощелкать, то предварительно
пощелкайте клавишей Delete).
В
этом случае использовался оператор РОКЕ 23624,n, где n — число,
задающее атрибуты служебного экрана, а 23624 — адрес системной переменной BORDСR.
Нажатие
клавиши Break — довольно невкусный способ раскрутки программ.
Значительно приятней лишить загрузчик автостарта: тогда Вы получаете полную
свободу действий.
Самое
простое, что можно сделать — это загрузить копировщик COPY86/M или Out Copy
(что, в общем-то, одно и то же) и скопировать загрузчик, не забыв перед записью
нажать клавишу R. Таким образом, Вы получите программу без автостарта.
Подобные
вещи позволяют проделывать и другие копировщики, например, написанные
Tadeusz'eM Wilczek'oM(COPY NEW, NEW FORMAT COPY, COPY COPY, COPY COPY COPY и т. п.).
Но
допустим, у Вас не нашлось копировщика, позволяющего лишать программы
автостарта. Попробую помочь. Наберите следующую программу:
10 FOR А=23296 ТО 23334
20 READ S:POKE A,S
30 NEXT A
40 RANDOMIZE USR 23296
50 STOP
60 DATA 221,33,0,128,17,17,0,62,0,55,205,86,5,
33,0,200,34,11,128,62,127,219,254,203,71,32,-8,
221,33,0,128,17,17,0,62,0,195,194,4
Когда
Вы ее запустите, машина войдет в режим загрузки, но загрузит только заголовок.
Затем, при нажатии на клавишу Space, программа запишет на ленту новый заголовок
— без автостарта.
Для
тех, кто слышал слово «ассемблер» и на вопрос: «Который час?» вместо «Восемь
тридцать» отвечает: «Два эф девятого», привожу исходный текст с комментариями:
ORG 23296 ; 5B00h
LD IX,32768 ; 8000h адрес загрузки заголовка
LD DE,17 ; 11h длина заголовка
LD А,0 ; флажок "заголовок"
SCF ; флажок "загрузка"
CALL 1366 ; 0556h загрузка файла
LD HL,33024 ; 8100h задание строки автостарта
LD (32779),HL
WAIT LD A,127 ; 7Fh ожидание нажатия Space
IN A,(254)
RRA
JR C,WAIT
LD IX,32768 ; см. выше
LD DE,17
LD A,0
CALL 1218 ; 04C2h запись на ленту
RET
Получив
живой загрузчик, попытайтесь его идентифицировать в рамках того, что Вам уже
известно.
Как
говорилось в начале первой главы, загрузчики бывают на Бейсике, в машинных
кодах и смешанные. Предварительную идентификацию загрузчика можно произвести,
изучив файлы программы. Бейсик позволяет загружать только файлы с заголовком.
Загрузчик в машинных кодах может загружать что угодно и как угодно, но, как правило,
загружает файлы без заголовков (в оригинальных версиях игровых программ загружается
такое, перед чем пасует любой нормальный копировщик: файлы этих программ не
копируются). Таким образом, если загружаются файлы без заголовка, то
определенно можно сказать, что загрузчик, с которым Вы имеете дело, написан в машинных
кодах. Если все файлы имеют заголовок, то можно предполагать, что загрузчик
написан на Бейсике, но определенно сказать этого пока нельзя. Если файлы попадаются
как с заголовком, так и без него, то можно предполагать что угодно, кроме того,
что загрузчик на Бейсике.
Нередки
случаи, когда загрузчик, написанный на Бейсике, загружает и запускает загрузчик
в кодах.
Для
окончательной идентификации необходимо изучить содержимое загрузчика. Если все
файлы программы имеют заголовок, и количество операторов LOAD
совпадает с количеством файлов, то можете быть спокойны, загрузчик почти
наверняка на Бейсике.