logo
ZX-Review-1992-01-12

FORUM

В11 12 номере "ZX РЕВЮ" (стр. 254) за прошлый год мы писали о существовании "циклических" защит программ от копирования и упоминали защиты класса ALKATRAZ LOADER.

Вответ на эту заметку пришло несколько писем. Победы, одержанные нашими читателями над этим загрузчиком с помощью аппаратных средств мы рассматривать не будем, считая этот путь не относящимся к теме, а вот частный случай, с которым разобрался Д.Коронцвит из Г. Жуковского, Моск. обл., мы рассмотрим.

Почему нас не интересуют аппаратные пути взлома и копирования программ? Дело в том, что с программистской точки зрения взлом ради взлома, копирование ради копирования не интересны. Нас интересуют программистские приемы, новые методы, короче интересует все то, на чем можно учиться и набирать опыт. И, если быть до конца честными, то надо признаться, что любые статьи, посвященные вскрытию программ и снятию защит в основном служат не тем, кто их снимает, а тем, кто их ставит и тем, кто учится программировать.

Итак, по порядку. Просматривая загрузчики, написанные Сергеем Скоробогатовым для дискофицированных им программ Winter Edition, Chase H.Q., Agent X и др., наш читатель столкнулся с листингом, который выглядел примерно так (см. листинг 1, комментарий к листингу наш, "ИНФОРКОМ"):

Декодирование вручную, с помощью MONS3 показало, что то, что было АБРАКАДАБРОЙ, содержит блок, очень похожий на то, что Вы видите на листинге. Изменился только "ключ" и конечно изменился адрес, загружаемый в регистровую пару HL. Дальнейшее декодирование открыло еще один аналогичный блок и т.д. Длина и структура всех трех просмотренных блоков были одинаковыми.

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

Пример декодирующей процедуры приведен в листинге 2.

 

 

 

ЛИСТИНГ 1

 

LD HL,nn

загрузили адрес, с которого начинается декодируемый блок.

 

LD ВС,nn

длина этого блока (организовали счетчик).

LOOP

LD A,(HL)

приняли байт для декодирования.

 

XOR "ключ"

само декодирование.

 

LD (HL),A

заслали декодированное значение на место АБРАКАДАБРЫ.

 

INC HL

перешли к очередному байту.

 

DEC BC

уменьшили счетчик байтов на единицу.

 

LD A,B

подготовка к проверке счетчика на ноль.

 

OR C

проверка счетчика на ноль.

 

JR NZ,LOOP

 

 

 

..................

 

АБРАКАДАБРА

 

 

 

...................

 

 

 

ЛИСТИНГ 2

AGAIN

LD IX (аа)

аа адрес ячейки, в которой организовано хранение адреса начала

 

 

 

"взламываемого" блока.

 

LD L,(IX+1)

второй и третий байты исследуемого блока

 

LD H,(IX+2)

 

содержат адрес декодируемого куска

 

LD C,(IX+4)

пятый и шестой байты исследуемого блока

 

LD D,(IX+5)

 

содержат длину декодируемого куска.

LOOP

LD A,(HL)

 

приняли байт для декодирования.

 

XOR (IX+8)

 

само декодирование.

 

LD (HL),A

заслали декодированное значение на место.

 

INC HL

 

перешли к очередному байту.