зависимости от этого. Здесь ветвление служит лишь для индикации работы
под отладчиком, но вы можете применить его по своему усмотрению.
На рис. 4.4 использование конвейера шины данных в иной
интерпретации и в более завуалированном виде. По существу, это
вариация на ту же тему и демонстрирует лишь разнообразие способов
работы с конвейером.
Аномальные явления, с которыми приходится сталкиваться при
программировании МП Intel 80x86, не менее интересная тема при
рассмотрении построения защитных механизмов. Информацию о них
программист чаще всего получает экспериментальным путем (что
становится его "ноу-хау"). Отступлений от стандарта обычно немного
(исключение составляют машины фирмы Compaq с длинным перечнем
особенностей). Об одном упоминалось в печати [2] - это потеря
трассировочного прерывания после команд, связанных с пересылкой
сегментных регистров типа MOV SEG.REG,R/M и POP SEG.REG. К сожалению,
в статье результаты исследований описаны неполно. Во-первых, для МП
8086/8088 (а точнее, японского аналога V20) существует еще один тип
команд, заставляющий пропускать трассировочное прерывание: MOV
R/M,SEG.REG. Во-вторых, для МП с более высоким номером также идет
потеря трассировки, но только для стекового сегментного регистра. Это
свойство с успехом можно применить для определения трассировки и типа
машин.
Известно, что отладчики при обработке 1-го прерывания анализируют
текущую команду на PUSHF (код 9Ch) и сбрасывают Т-бит. Поэтому
последовательность команд PUSHF, POP AX под отладчиком не позволит
получить установленный 8-й бит в регистре AX. На рис. 4.5 представлен
текст короткой программы, использующей эту особенность. Команда POP SS
заставляет отладчик пропустить следующую за ней команду PUSHF из-за
потери трассировки, и, благодаря этому, выявляется факт работы под
отладчиком.
Образцом знания особенностей работы МП и наиболее лаконичным
вариантом распознавания его типа мы считаем подпрограмму, текст
которой приведен в статье "Intel insight on specific instructions"
[3]. Вот два примера из нее:
1) Для определения типа МП, начиная с 80186 и выше, используется
тот факт, что для них в счетчиках сдвигов (линейных и циклических)
маскируются все биты, кроме 5-и младших, ограничивая тем самым
величину сдвига 31 битом.
2) Начиная с МП 80286, характерна следующая особенность: команда
PUSH SP заносит в стек значение SP с учетом его декремента, а более
низшие типы МП - без.
Для пытливого ума выявление особенностей микропроцессоров сослужит
хорошую службу как при составлении защитных алгоритмов, так и для
идентификации ПЭВМ, а именно на таких программистов и рассчитана эта
статья.
В качестве примера, реализующего некоторые приемы, была разработана
утилита DLOCK. Правила пользования ею приведены в приложении 2.
Л и т е р а т у р а
1. Дмитриевский Н.Н., Расторгуев С.П. " Искусство защиты
и "раздевания" программ", "СОВМАРКЕТ", 1991.
2. статья "Особенности работы МП 8086/8088 в пошаговом
режиме", "Журнал д-ра Добба", N 2, 1991.
3. "Intel insight on specific instructions", "Personal
Computer World", April, 1990.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ СОКРЫТИЕ АДРЕСОВ ¦
¦а) безусловного перехода ¦
¦ jmp m mov ax,offset m ; занести в стек ¦
¦ . . . push ax ; адрес метки. ¦
¦ ret ; перейти на метку. ¦
¦ . . . ¦
¦ m:. . . m: . . . ¦
¦ . . . . . . ¦
¦б) вызов подпрограммы ¦
¦ call subr mov ax,offset m ; занести в стек ¦
¦ . . . push ax ; адрес возврата. ¦
¦ . . . jmp subr ; перейти на под- ¦
¦ . . . m: . . . ; программу. ¦
¦ subr: subr: . . . ¦
¦в) прерывание ¦
¦ int 21h pushf ; занести в стек флаги. ¦
¦ . . . xor si,si ¦
¦ mov es,si ¦
¦ call dword ptr es:[21h*4] ¦
¦ . . . ¦
¦г) возврат из подпрограммы ¦
¦ . . . . . . ; взять из стека ¦
¦ ret pop bx ; адрес возврата и¦
¦ jmp bx ; перейти на него.¦
¦ . . . . . . ¦
¦д) выход из прерывания ¦
¦ iret mov bp,sp ; переход на точку¦
¦ jmp dword ptr [bp] ; возврата из пре-¦
¦ . . . . . . ; рывания. ¦
¦ add sp,4 ; точка возврата. ¦
¦ popf ¦
¦ . . . ¦
¦ МОДИФИКАЦИЯ ¦
¦е) перехода ¦
¦ mov word ptr cs:m+1,1234h ; адрес 1234h вписать вместо¦
¦ . . . ; 0000 у оператора безуслов-¦
¦ m: jmp 0000h ; ного перехода ¦
¦ . . . ¦
¦ж) вызываемой подпрограммы ¦
¦ mov word ptr cs:m+1,es ; изменить сегмент п/п ¦
¦ mov word ptr cs:m+3,5678h ; и адрес 0000 на 5678h ¦
¦ . . . ¦
¦ m: call far 0000h ¦
¦ . . . ¦
¦з) косвенного перехода ¦
¦ mov bx,1234h ¦
¦ jmp dword ptr cs:[bx] ¦
¦ . . . ¦
¦и) косвенного вызова подпрограммы ¦
¦ les si,dword ptr cs:subr ¦
¦ call word ptr es:[si] ¦
¦ . . . ¦
¦к) команды ¦
¦ and byte ptr cs:m,0EFh ; обнулить 4-й бит по адресу m¦
¦ . . . ¦
¦ m: push ax ; команда преобразуется в INC AX ¦
¦ . . . ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис. 4.1
Фрагмент пакета COPYLOCK
(использование конвейера шины данных микропроцессора)
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ . . . . . ¦
¦cs:07FF mov cx,40Eh ¦
¦cs:0802 mov di,08A6h ¦
¦cs:0805 call subr ¦
¦ . . . . . ¦
¦;===================================== ¦
¦; Затирание участка памяти. ¦
¦ subr proc near ¦
¦cs:0D63 pushf ¦
¦cs:0D64 cld ¦
¦cs:0D65 mov ax,ds ¦
¦cs:0D67 mov es,ax ¦
¦cs:0D69 rep stosw ¦
¦cs:0D6B popf ¦
¦cs:0D6C retn ¦
¦ subr endp ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис. 4.2
ОПРЕДЕЛЕНИЕ РЕЖИМА ТРАССИРОВКИ
(1 вариант)
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ 1 0000 code segment para public ¦
¦ 2 assume cs:code,ds:code ¦
¦ 3 ¦
¦ 4 0000 sample1 proc ¦
¦ 5 ¦
¦ 6 0000 0E push cs ¦
¦ 7 0001 1F pop ds ¦
¦ 8 0002 C6 06 0008r 00 mov byte ptr m+1,0 ; изменение ¦
¦ ; смещения в команде JMP ¦
¦ 9 0007 EB 06 m: jmp short norm_ex ¦
¦10 0009 BA 001Br mov dx,offset trace ; выполнение с¦
¦ ; трассировкой¦
¦11 000C EB 04 90 jmp exit ¦
¦12 000F norm_ex: ; выполнение без¦
¦ ; трассировки ¦
¦13 000F BA 0026r mov dx,offset norm ¦
¦14 0012 exit: ¦
¦15 0012 B4 09 mov ah,9 ¦
¦16 0014 CD 21 int 21h ¦
¦17 0016 B8 4C00 mov ax,4C00h ¦
¦18 0019 CD 21 int 21h ¦
¦19 ¦
¦20 001B trace db 'Tracing!',0Ah,0Dh,'$' ¦
¦21 ¦
¦22 0026 norm db 'Normal exit.',0Ah,0Dh,'$' ¦
¦23 ¦
¦24 ¦
¦25 0035 sample1 endp ¦
¦26 0035 code ends ¦
¦27 end sample ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис. 4.3
ОПРЕДЕЛЕНИЕ РЕЖИМА ТРАССИРОВКИ
(2 вариант)
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ 1 0000 code segment para public ¦
¦ 2 assume cs:code,ds:code ¦
¦ 3 ¦
¦ 4 0000 sample2 proc ¦
¦ 5 ¦
¦ 6 0000 0E push cs ¦