Создаем вирус и антивирус (Гульев) - страница 49

Имея программу, основанную на одном из ранее описанных способов определения реального адреса обработчика DOS, загрузочные дискеты с разными версиями DOS и немного терпения, можно получить примерно вот такую информацию.

Оригинальный обработчик DOS версии 3.30 всегда имеет вид:

;Точка 0

2E CS:

891EB800 MOV [00B8],BX

2E CS:

8C06BA00 MOV [00BA],ES

CB RETF

...

;Точка 1

2E CS:

3A26FF0D CMP AH,[0DFF]

77DC JA 1443

80FC51 CMP AH,51

74A1 JZ 140D

...

80FC64 CMP AH,64

74BA JZ 143A

;Точка 2

Оригинальные обработчики DOS версий 5.0–7.0 очень похожи. В общем случае они состоят из следующих фрагментов: Фрагмент 1 (если он присутствует) всегда располагается в нижних адресах памяти. Большинство алгоритмов трассировки заканчивают работу, достигнув этой точки. Для DOS версий 5.0–6.22 этот фрагмент присутствует, если в CONFIG.SYS есть строка DOS=HIGH (вне зависимости от того, осуществляется ли запуск поддерживающего эту опцию драйвера HIMEM.SYS). Если драйвера нет, то JMP FAR просто указывает на фрагмент 2, размещающийся в нижних областях памяти. Если строки DOS=HIGH нет, то фрагмент 1 вырожден (состоит из одной команды внутрисегментного перехода), и обработчик состоит из фрагмента 2.

;Точка 0

90 NOP

90 NOP

E8CC00 CALL CheckA20

2E CS:

FF2E6A10 J MP FAR NEXTDOS

Фрагмент 2 может располагаться как в верхних, так и в нижних адресах памяти.

;Точка 1

NEXTDOS:

FA CLI

80FC6C CMP AH,6C

77D2 JA 40D0

...

80FC50 CMP AH,50

748E JZ 40A9

;Точка 2

Для DOS 7.0 структура обработчика, в общем, такая же. Исключение – фрагмент 1 присутствует всегда, вне зависимости от содержимого файла CONFIG.SYS. Теперь приведем конкретные значения адресов, полученные для разных случаев:

DOS 7.0 (русская версия)

Точка 0 00C9:0FB2 9090

Точка 1 FF03:41E7 80FA

Точка 2 FF03:420A 1E06

Точка 2А FF03:5333 2ACD

DOS 6.20

device=himem.sys

dos=high

Точка 0 0123:109E 9090

Точка 1 FDC8:40F8 80FA

Точка 2 FDC8:411B 1E06

Точка 2A FDC8:41D1 2ACD

DOS 6.20

dos=high

Точка 0 0123:109E 03EB

Точка 1 03AC:40F8 80FA

Точка 2 03AC:411B 1E06

Точка 2A 03AC:41D1 2ACD

DOS 6.20

Точка 1 002A:40F8 80FA

Точка 2 002A:411B 1E06

Точка 2A 002A:41D1 2ACD

DOS 5.0

device=himem.sys

dos=high

Точка 0 0123:109E 9090

Точка 1 FDC8:40EB 80FA

Точка 2 FDC8:410E 1E06

Точка 2A FDC8:41C4 2ACD

DOS 5.0

dos=high

Точка 0 0123:109E 03EB

Точка 1 03AC:40F8 80FA

Точка 2 03AC:411B 1E06

Точка 2A 03AC:41D1 2ACD

DOS 5.0

Точка 1 002A:40EB 80FA

Точка 2 002A:410E 1E06

Точка 2A 002A:41D1 2ACD

DOS 3.30

Точка 0 0070:05DC 892E

Точка 1 0294:1460 3A2E

Точка 2 0294:1480

Точка 2A 0294:151B 2ACD

DOS 3.10 Точка 0 0070:0D43

DOS 3.20 Точка 0 0070:17D0

Точка 2 является оптимальной, то есть в нее целесообразнее всего передавать управление, чтобы обойти резидентные антивирусные мониторы. Точка 2A – это позиция инструкции INT 2Ah, которую DOS обязательно выполняет в процессе обработки 21-го прерывания.