╔════********************************════╗ ╠═ АДАПТАЦИЯ ПРОГРАММ К СИСТЕМЕ TR-DOS. ═╣ ╠═ ═ ЧАСТЬ 3. ═ ═╣ ╚════********************************════╝ ──────────────────────────────── ГЛАВА 1. = КАК БОРОТЬСЯ С БЕЙСИКОМ. = (Продолжение) ────────────────────────── Не менее распространенным приемом защи- ты бейсик-программ является добавление в строки бейсик-программы различных управ- ляющих кодов:INK, PAPER, AT, TAB и других. Для примера поясню разницу между кон- трольным кодом INK и оператором INK. Если при выводе листинга программы бейсик-сис- тема встречает оператор INK, она честно представляет его на экране, не производя никаких действий. Если же встречается кон- трольный код INK, то следующий за ним байт бейсик-система воспринимает как код цвета тона и продолжает вывод листинга этим цве- том. Все сказанное справедливо для PAPER, FLASH, TAB и др. Необходимо учесть только, что позиция вывода на экран задается двумя байтами, следующими за контрольным кодом AT и TAB, а не одним, как для других кон- трольных кодов. Большинство контрольных кодов можно удалить клавишей Delete, вызвав бейсик- строку на редактирование. Поочередно нажи- майте клавиши <<курсор вправо>> и Delete, и если авторы защиты использовали коррект- ные значения контрольных кодов, то Вы без осложнений рано или поздно получите на эк- ране вполне осмысленную информацию. Но бы- вает и так: когда, например, бейсик-интер- претатор просят вывести листинг программы 121-м цветом в знакоместо с координатами (240,86), тогда он просто-напросто прекра- щает вывод листинга на экран, а при попыт- ке редактирования строки начинает истошно орать. В этом случае нужно сначала "зат- кнуть ему рот" оператором POKE 23608,0 и далее действовать по приведенной схеме. ────────────────────── Еще одна крайне неприятная вещь,которая может помешать справиться с программой при адаптации ее на диск, ─ это нехватка памя- ти. Она может возникнуть из-за того, что, во-первых, TR-DOS резервирует 112 байт для своих системных переменных; во-вторых,опе- раторы загрузки с диска могут занимать в памяти значительно больше места, чем ана- логичные инструкции для ленты(если Вы при- выкли исчислять память мегабайтами, слово "значительно" беру назад); в-третьих, сис- теме TR-DOS необходим буфер не менее 256 байт для записи/чтения файлов, вывода ка- талога и т.п. и еще больше для распечатки каталога дискеты командой LIST. Этого до- полнительного расхода памяти бывает доста- точно, чтобы компьютер выдал сообщение: Out of memory, No room for line или еще что-нибудь в этом роде. Не печальтесь, в этом случае (как,впро- чем, и во всех остальных) компьютер можно обмануть.Наиболее простой и доступный спо- соб ─ это разделение загрузчика на две или более части. Допустим, исходный ленточный загрузчик выглядел так: 10 CLEAR 24250 20 LOAD ""SCREEN$ 30 LOAD ""CODE 40 LOAD ""CODE 23296,256 50 RANDOMIZE USR 23296 60 LOAD ""CODE 70 RANDOMIZE USR 24576 Без толики сомнения Вы написали диско- вый загрузчик для этой программы: 10 CLEAR 24250 20 RANDOMIZE USR 15619: REM : LOAD "bomb sc"CODE 16384 30 RANDOMIZE USR 15619: REM : LOAD "bomb mn"CODE 40 RANDOMIZE USR 15619: REM : LOAD "bomb pb"CODE 23296 50 RANDOMIZE USR 23296 60 RANDOMIZE USR 15619: REM : LOAD "bomb ls"CODE 70 RANDOMIZE USR 24576 и, запустив программу,вместо игры получили сообщение 4 Out of memory, 20:1. Только не вздумайте тянуться к @безьяне (так некото- рые именуют кнопку Magic,поскольку в прос- тонародье символ @, которым TR-DOS помеча- ет названия файлов, "сброшенных" кнопкой Magic, часто называют "обезьяной" или "со- бакой". Однако, в целом звучит неплохо и соответствует истинному положению вещей). Попробуйте разбить загрузчик на две части. Например, в нашем случае первая часть за- грузчика (назовем этот файл "BOMB") будет выглядеть так: 10 CLEAR 24250 20 RANDOMIZE USR 15619: REM: LOAD "bomb sc"CODE 16384 30 RANDOMIZE USR 15619: REM: LOAD "bomb mn"CODE 40 RANDOMIZE USR 15619: REM: LOAD "bomb bs" Вторую часть назовем "bomb bs": 10 RANDOMIZE USR 23296 20 RANDOMIZE USR 15619: REM: LOAD "bomb ls"CODE 30 RANDOMIZE USR 24576 Компьютер загрузит сначала первый за- грузчик "BOMB", которому места в памяти вполне достаточно. Затем, после выполнения заданных операций, первый загрузчик загру- зит второй ("bomb bs"),ему,в свою очередь, места тоже хватает. Второй загрузчик за- кончит эпопею с загрузкой и запустит прог- рамму. Могут возникать ситуации, когда прихо- дится "распиливать" загрузчик на три или более части, однако это бывает крайне ред- ко. Точнее, крайне редко такой прием помо- гает. __________________ -*- ГЛАВА 2. -*- ------------------------ КАК БОРОТЬСЯ С BREAK'ом. В предыдущей главе было подробно описа- но, как обращаться с загрузчиком на Бейси- ке уже после того, как был получен его листинг. Даже в том случае, когда получен- ное "нечто" слабо напоминает листинг.Впол- не законно у Вас мог возникнуть вопрос,как получить это "нечто" (листинг); ведь дале- ко не всегда,нажав клавишу Break после за- грузки первого файла, Вы получите то, что хотели.Результаты вмешательства в нормаль- ный ход загрузки могут быть совершенно не- предсказуемыми, начиная с того, что про- грамма сбросится,и кончая тем, что она по- виснет или обзовет Вас неприличным словом. Подробнее опишу эффекты, возможные при останове программы клавишей Break, а также способы, которыми эти эффекты достигаются. Эта информация может быть полезна скорее не для вскрытия чужих программ, а для за- щиты своих (не забывайте, однако, что вос- пользовавшись данными ниже указаниями, Вы защитите программу только от того, кто не читал этот текст). 1. После нажатия на клавишу Break за- грузчик продолжает исправно работать. Перекреститесь и откажитесь от мысли вскрыть эту программу ─ к этому Вы еще не готовы, так как гарантированно можно за- явить, что загрузчик написан в машинных кодах (это не имеет отношения к профессио- налам, которые читают это произведение только для того, чтобы посмеяться над ав- тором). 2. После нажатия Break компьютер обну- ляется. Если загрузчик написан на Бейсике, то наиболее вероятно, что в нем использована следующая инструкция: POKE (PEEK 23613+256*PEEK 23614),0: POKE (PEEK 23613+256*PEEK 23614)+1,0 или аналогичная. Выполнение подобной операции изменяет адрес "возврата по ошибке" на нулевой (си- стемная переменная ERR_SP). Таким образом, вместо того, чтобы перейти на подпрограмму ПЗУ, которая выводит сообщение об ошибке, программа переходит на нулевой адрес: ма- шина обнуляется (те, кто ни разу не видел, как машина обнуляется, могут попробовать ввести RANDOMIZE USR 0 или нажать кнопку сброса). 3. После нажатия Break экран становится черным и машина ни на что не реагирует (кроме кнопки сброса, надо полагать). Ско- рее всего использован оператор POKE 23659, 0, устанавливающий количество строк в слу- жебном экране равным нулю.К описанному эф- фекту приводит попытка бейсик-интерпрета- тора уложить свое сообщение в ноль строк. 4. После нажатия Break цвет экрана не меняется, нижние две строки экрана имеют цвет бордюра.Цвет экрана также может иметь цвет бордюра(в том числе и черный ─ не пу- тайте с предыдущим случаем).При нажатии на клавиши слышится нежное пощелкивание,но на экране ничего не изменяется. Если Вы еще не успели пощелкать клави- шами, наберите BORDER 7 (или любое другое значение) и, невзирая на то, что на экране ничего не появляется, нажмите Enter. После этого Вы скорее всего увидите надпись 0 ОК, 0:1. Теперь можно работать как обы- чно. (Если Вы уже успели пощелкать,то пре- дварительно пощелкайте клавишей Delete). В этом случае использовался оператор POKE 23624,n, где n ─ число, задающее ат- рибуты служебного экрана, а 23624 ─ адрес системной переменной BORDER. Нажатие клавиши Break ─ довольно не- вкусный способ раскрутки программ. Значи- тельно приятней лишить загрузчик автостар- та: тогда Вы получаете полную свободу дей- ствий. Самое простое, что можно сделать ─ это загрузить копировщик COPY86/M или Out Copy (что, в общем-то, одно и то же) и скопиро- вать загрузчик, не забыв перед записью на- жать клавишу R. Таким образом, Вы получите программу без автостарта. Подобные вещи позволяют проделывать и другие копировщики, например, написанные Tadeusz'em Wilczek'om (COPY NEW,NEW FORMAT COPY, COPY COPY и т.п.). Но допустим,у Вас не нашлось копировщи- ка, позволяющего лишать программы авто- старта. Попробую помочь. Наберите следую- щую программу: 10 FOR A=23296 TO 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 A,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 совпадает с коли- чеством файлов, то можете быть спокойны, загрузчик почти наверняка на Бейсике. Продолжение следует... ────────────────────────── В следующем номере "Micro" ждите главу 3 "ЕЩЕ О БЕЙСИКЕ". ------------------------------ 03.09.98 Gloom Demons Inc. & Computer Eye. Special for "Micro 8".