процессоров, вызывает определенные трудности на 16-разрядных: и
характер операций у "буквенных" кодов другой, и однобайтовых команд
мало (с двух - трехбайтовыми разбираться еще сложнее). Тем не менее,
после некоторой тренировки можно и этот способ взять на вооружение.
ЗАМЕНА БЛОКОВ
Традиционный подход при использовании ветвления заключается в
построении 2-х участков с разным набором команд. При выполнении
запрограммированного условия - выполняется первый, в противном случае
- управление передается на второй. В самомодифицирующихся модулях
лучше отойти от общепринятой схемы, и применить переброску того или
иного блока на один и тот же участок программы. Сработало условие - на
следующие за ним адреса записывается первый набор команд, не сработало
- другой, затирая предыдущие (тем более, что у МП 286 и выше - блочные
пересылки выполняются легко и быстро).
Определить в распечатке такой "оверлейный" блок - очень сложно,
особенно, если его куски хранятся в других сегментах.
БЛОК ДЕКОДИРОВАНИЯ
(присланный Ерко В.Д., автор неизвестен):
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ; 1 модуль программы ¦
¦n: mov HL, nn ; адрес начала блока ¦
¦ mov BC, ll ; длина блока ¦
¦ mov AX, kk ; ввод ключа декодера ¦
¦ xor (HL) ; декодирование ¦
¦ mov (HL), AX ; замена закодирован. значения на раскодир.¦
¦ inc HL ; переход к очередному байту ¦
¦ dec BC ; уменьшение счетчика ¦
¦ jnz n ; повтор декодирования, если BC > 0 ¦
¦ .......... ; продолжение модуля ¦
¦ ; 2 модуль программы ¦
¦nn: db ....................... ¦
¦ ; (Закодированный блок.) ¦
¦ db ........ ; конец блока, адрес = nn + ll ¦
¦мм: db ........ ; 3 модуль (и так далее) ¦
¦ ¦
¦ После декодирования 1 блока и исполнения остальных¦
¦команд управление передается на декодированный блок, который¦
¦начинается с такой же процедуры, декодирующей следующий¦
¦участок. И таких вложений - 156. ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис. 5.1
ИСПОЛЬЗОВАНИЕ ТЕКСТА КАК КОДА ПРОГРАММЫ
(для микропроцессора Z80)
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦6E1E C3 6C 71 jmp 716Ch ; завершение предыдущего ¦
¦ ; участка ¦
¦6E21 47 mov B,A ; начало подпрограммы ¦
¦6E22 31 55 D0 mov SP,0D055h ;1UP - текст первого ¦
¦ ; сообщения ¦
¦6E25 47 mov B,A ; ¦
¦6E26 32 55 D0 mov (0D055h),A ;2UP - текст второго ¦
¦ ; сообщения ¦
¦6E29 45 mov B,L ; ¦
¦6E2A 48 mov C,B ;H - третье сообщение ¦
¦6E2B C9 ret ;I (оно же завершает ¦
¦6E2C 21 00 00 mov HL,0000 ; подпрограмму) ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис. 5.2
Таблица 5.1
ВЗАИМОЗАМЕНЯЕМЫЕ КОМАНДЫ
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ Первичный код ¦ Альтернативный код ¦
ГДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ Команды пересылки: ¦
ГДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ mov op1,op2 ¦ push op2 ¦
¦ ¦ pop op1 ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ xchg op1,op2 ¦ push op1 ¦
¦ ¦ push op2 ¦
¦ ¦ pop op1 ¦
¦ ¦ pop op2 ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ lds r,dword ptr op ¦ mov r,word ptr op ¦
¦ ¦ mov ds,word ptr op+2¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ les r,dword ptr op ¦ mov r,word ptr op ¦
¦ ¦ mov es,word ptr op+2¦
ГДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ Арифметические команды: ¦
ГДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ add op1,op2 ¦ xchg op2,ax ¦
¦ ¦ add op1,ax ¦
¦ ¦ xchg op2,ax ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ adc,sub,sbb и др. ¦ аналогично add ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ inc op ¦ add op,1 ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ dec op ¦ sub op,1 ¦
ГДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ Логические команды: ¦
ГДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ and,or,xor и др. ¦ аналогично add ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ not op ¦ xor op,0ff(ff)h ¦
ГДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ Цепочечные команды: ¦
ГДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ rep movsb ¦ push ax ¦
¦ ¦ m: mov al,[si] ¦
¦ ¦ mov es:[di],al ¦
¦ ¦ inc si ¦
¦ ¦ inc di ¦
¦ ¦ loop m ¦
¦ ¦ pop ax ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ repe(repne) cmpsb ¦ push ax ¦
¦ ¦ m: mov al,[si] ¦
¦ ¦ cmp al,es:[di] ¦
¦ ¦ jne(je) m1 ¦
¦ ¦ inc si ¦
¦ ¦ inc di ¦
¦ ¦ loop m ¦
¦ ¦ m1: pop ax ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ lodsb ¦ mov al,[si] ¦
¦ ¦ inc si ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ stosb ¦ mov es:[di],al ¦
¦ ¦ inc di ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ shift op,cnt ¦ push cx ¦
¦ ¦ mov cx,cnt ¦
¦ ¦ m: shift op,1 ¦
¦ ¦ loop m ¦
¦ ¦ pop cx ¦
ГДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ Команды передачи управления: ¦
ГДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ j(условие) loc ¦ jn(условие) loc1 ¦
¦ ¦ jmp loc ¦
¦ ¦ loc1: . . . ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ loop loc ¦ dec cx ¦
¦ ¦ jne loc ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ jmp addr ¦ push addr ¦
¦ ¦ ret ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ jmp dword ptr addr ¦ push addr+2 ¦
¦ ¦ push addr ¦
¦ ¦ retf ¦
ГДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ call addr ¦ push m ¦
¦ ¦ jmp addr ¦
¦ ¦ m: . . . ¦
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ
Cокращения: op, op1, op2 - операнды команд; r - операнд-регистр;
shift - код команды сдвига; cnt - счетчик в командах сдвига; loc -
метка в командах перехода и цикла; addr - адрес в командах перехода и
вызова подпрограмм.
6. ИСПОЛНЯЕМЫЙ МОДУЛЬ - ЧТО МОЖНО СДЕЛАТЬ
БЕЗ ИСХОДНЫХ ТЕКСТОВ?
Одной из самых сложных работ в программировании является
модификация исполняемых модулей при отсутствии исходных текстов. Надо
признать, что программисту не часто приходится заниматься подобными
работами, но, однако, никто не застрахован от потери собственных
исходных текстов программ. В частности, мы обратились к решению
названной задачи для того, чтобы исправить найденную в нашем пакете
ошибку. "Исходники" к тому времени были случайно уничтожены при борьбе
с вирусом. Бесполезно вспоминать и переписывать весь пакет - за тот
срок, в течении которого гарантировалось устранение любых замечаний,
мы в любом случае не успевали этого сделать. Поэтому стали искать
другие пути. В результате разработали соответствующий метод и даже
набор инструментальных средств, который с успехом применяем по сей
день.
Разумеется, приемы корректировки исполняемых модулей
предназначены профессиональным разработчикам ПО для IBM PC в среде
DOS. Поэтому опустим некоторые детали, которые профессионал должен
знать, а в качестве примера возьмем лишь EXE-файлы - более сложные для
модификации, поскольку все сказанное может быть отнесено и к
COM-файлам.
Напомним, что EXE-файл состоит из заголовка, таблицы перемещения
и собственно исполняемого кода. Информация заголовка используется
операционной системой для загрузки модуля в оперативную память.
Устанавливаются значения основных регистров, обрабатывается таблица
перемещения, а затем управление передается задаче. В ходе работы все
основные функции ввода/вывода, захвата или освобождения ОЗУ и т.п.
обрабатываются операционной системой через прерывание 21h, а значит,
всегда могут быть изменены с помощью специального драйвера, который