ГДДДДДДДДДД†ДДДДД†ДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦F600:0000 ¦ ¦ - ¦ ROM-резидентный интерпретатор BASIC (для ори- ¦
¦ ¦ ¦ ¦ гинальных IBM/PC), обработчик ошибок при ¦
¦ ¦ ¦ ¦ загрузке для клонов ¦
ГДДДДДДДДДД†ДДДДД†ДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦FE00:0000 ¦ ¦ - ¦ ROM-BIOS: POST и код загрузки, ¦
¦ ¦ ¦ ¦ обработчики прерываний и прочее ¦
ГДДДДДДДДДД†ДДДДД†ДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦F000:FFF0 ¦ ¦ - ¦ JMP на программу, выполняемую ¦
¦ ¦ ¦ ¦ при включении или сбросе ¦
ГДДДДДДДДДД†ДДДДД†ДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦F000:FFF5 ¦ ¦ - ¦ Дата издания BIOS (в ASCII) ¦
ГДДДДДДДДДД†ДДДДД†ДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦F000:FFFE ¦ ¦ - ¦ Идентификационный код IBM PC. ¦
АДДДДДДДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Примечания:
1. В графе зависимость знак "-" означает, что приведенные в
предыдущих графах значения постоянны, "Ver" - зависят от версии MS DOS,
"Сon" - от содержимого CONFIG.SYS.
2. Приведенные значения соответствуют IO.COM и MSDOS.COM MS DOS
версии 3.3.
BIOS хранит двухбайтовую переменную по адресу 0040:0013, которая
сообщает количество килобайт используемой памяти (обьем системной
памяти). Это значение можно либо посмотреть непосредственно, используя,
скажем утититу LOW или PEPORES (СП 2-8) или получить как часть протокола
некоторых утитит, например SYSMAP. Для большинства машин это 640(280h)
или 512 (200h). Бутовые вирусы обычно уменьшают это значение при своей
инсталляции, "откусывая" необходимое им число килобайт. Таким образом
обьем системной памяти уменьшается и это уменьшение является
свидетельством того, что "что то не так". Прерывание 12h BIOS проверяет
установку переключателей на системной плате и возвращает в регистр AX
обьем установленной системной памяти в килобайтах. Его можно вызвать из
любого отладчика, например DEBUG.
Память свыше 1 мегабайта доступна на компьютерах класса AT через
функцию BIOS INT 15h, и в основном используется DOS для операций
с виртуальными дисками.
ПРЕФИКС ПРОГРАММНОГО СЕГМЕНТА (PSP)
Когда программа начинает выполнение, DS:0000 и ES:0000 указывают на
начало PSP этой программы. Информация PSP позволяет выделить имена
файлов и опции из строки команд, узнать объем доступной памяти,
определить окружение и т.д.
0 1 2 3 4 5 6 7 8 9 A B C D E F
ЪДДДДДДДТДДДДДДДТДДДТДДДВДДДДДДДВДДДДДДДТДДДДДДДВДДДДДДДТДДДДДДД¬
00 ¦INT 20hєMemTop єRsvєCALL смещ. сегментєАд.зaв (int22)єCtrl-
ГДДДБДДДЧДДДБДДДРДДДРДДДТДДДБДДД†ДДДБДДДЧДДДБДДД†ДДДБДДДЧДДДБДДДґ
10 Break. єCritical Error є Резервная область DOS
ГДДД†ДДДРДДД†ДДД†ДДД†ДДДРДДД†ДДД†ДДД†ДДДРДДД†ДДДТДДД†ДДДЧДДД†ДДДґ
20 Резервная область DOS Резервная область DOS єEnvSeg є Резер-
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДРДДДБДДДРДДДБДДДґ
30 вная область DOS Резервная область DOS Резервная область DOS
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
40 Резервная область DOS (продолжение)
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДТДДДБДДД†ДДДБДДДґ
50 Резервная область DOS (окончание) є Форматирован-
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДЧДДДБДДД†ДДДБДДДґ
60 ная область параметра 1 є Форматирован-
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДРДДДБДДД†ДДДБДДД·
70 ная область параметра 2 є
ЦДДДТДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДЅ
80 єlenє неформатированная область параметров (символы из командной
УДДДРДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
90 строки DOS )
ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
ЦДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
100 є начало кода для COM или EXE-файла
УДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
Рис.9. Структура префикса программного сегмента
Первым полем префикса программного сегмента (рис.9) является
команда INT 20h [0;2] - программы могут выполнять на нее переход с
помощью JMP или RET для выхода. Поле MemTop содержит адрес вершины
доступной памяти системы в параграфах[+2;2]; Далее один байт
резервируется - поле Rsv[+4;1]. Следующее поле[5;5] содержит команду
длинного перехода(FAR CALL) к диспетчеру функций DOS. Поле Avail [6;2]
содержит доступные байты в программном сегменте (только для файла
COM). Далее следуют три четырехбайтовых поля имеющие формат <смещ.>
<сегмент> и содержащие соответственно адрес завершения(см. INT
22h)[+0Ah;4], адрес обработки Ctrl-Break(см. INT 23h)[+0h;4] и
обработчик критических ошибок (см. INT 24h)[+12h;4]; За ними идет
резервная область DOS [+16h;16h-2B]. Поле EnvSeg[+2Ch;2] содержит
сегментный адрес окружения DOS. Далее следует еще одна резервная
область DOS [+2Eh;2Eh-5B]; Форматированная область первого параметра
[+5Ch;10h] содержит FCB для 1-го параметра. Аналогично форматированная
область второго параметра [+6Ch;14h] содержит FCB для 2-го параметра.
Поле Len [+80h;1] содержит длину области UPA (с адреса 81h) также
смещение умалчиваемой DTA. За полем Len расположена неформатированная
область параметров содержит символы, полученные из командной строки
DOS[+81h;7Fh]; (кроме директив переназначения).
Начало кода для COM или EXE-файла, загруженных в оперативную память
находится по смещению 100h. Отметим, что при загрузке заголовок
EXE-файла загружается отдельно и в памяти файл типа EXE начинается с
байтов, непосредственно следующих за заголовком.
БЛОК УПРАВЛЕНИЯ ПАМЯТЬЮ (MCB)
Это управляющий блок, используемый DOS при распределении,
модификации и освобождении блоков системной памяти. Анализ цепочки этих
блоков позволяет, в частности, получить сведения об имеющихся
резидентных программах.
0 1 2 3 4 5 6 7 8 9 A B C D E F
ЦДДДТДДДВДДДТДДДВДДДТДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДД¬
10 єТипєВл-лец єРазмер є зарезервировано зарезервировано ¦
ЗДДДРДДД†ДДДРДДД†ДДДРДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
20 є Начало блока памяти (для блока с загруженной программой - PSP)
УДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†
Рис.10. Структура блока управления памятью
Блоки управления памятью всегда выравнены на границу параграфа
("сегмент блока"). Поле тип - может принимать два значения 'M'(4Dh),
если за этим блоком есть еще блоки и 'Z'(5Ah), если данный блок
является последним; поле "Владелец"(соответствующая графа обычно
обозначается Parent, Owner) содержит параграф владельца (для FreeMem).
Если 0, то владельцем является сам данный блок; поле "Размер"(Size)
содержит число параграфов в этом блоке. Блок памяти - начало
информации, расположенной в данном блоке. Общий обьем этой информации
равен (Размер*10h) байт. Сегментный адрес начала блока памяти
возвращает функция 48h AllocMem. Для блока M-типа следующий блок
находится по адресу (сегмент_блока+Размер):0000, а для блока Z-типа
выражение (сегмент_блока+Размер):0000 всегда указывает на конец
оперативной памяти (для систем с 640K это адрес: a000:0000h). После
функции 4Bh Exec, Z-блок начинается с (PSP-1):0000 нового процесса
В списке резидентных резидентных программ могут оказаться и
простые резидентные вирусы, хотя более сложные резидентные вирусы
маскируются таким образом, чтобы обойти данную возможность обнаружения.
Список MCB можно получить с помощью специальных утилит ( например
SYSMAP, MEMANAL, RELEASE и др.). Эти утилиты отличаются удобством и
степенью подробности выдаваемой информации. Ниже приведен протол,
выдаваемые утилитой SYSMAP.
PC SYSTEM MAP V3.00 Video Trends Software 1989
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Segment Size Program Parent Cooked Vectors
0000 001,024 INTERRUPT VECTOR TABLE
0040 000,256 BIOS DATA AREA
0050 000,512 DOS COMMUNICATION AREA 1E
0070 008,928 IO.SYS BOOT RECORD 01 03 04 0F 13 1B 29 EF F3 F7 FA
029E 029,920 MSDOS.SYS IO.SYS 20 26 2A 2B 2C 2D 31 32 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
09ED 012,784 EMMXXXX0 IO.SYS 67 F6
0D0C 000,112 PCKXXXX0 IO.SYS 25
0D13 000,768 1 units IO.SYS 19
0D43 000,928 4DOSSTAK IO.SYS
0D7D 001,072 HANDLE TABLE IO.SYS
0DC0 000,224 FCBs TABLE IO.SYS
0DCE 020,592 DOS BUFFERS IO.SYS EE FF
12D5 000,576 DRIVE TABLES IO.SYS
12F9 003,824 DOS STACKS IO.SYS 02 0E 70 76
13E9 002,992 COMMAND.COM COMMAND.COM 2E
14A5 000,512 COMMAND.COM ENVIRONMENT
14C6 000,080 RELEASE.COM ENVIRONMENT
14CC 003,488 RELEASE.COM COMMAND.COM 21 27
15A7 000,128 MOUSE.COM ENVIRONMENT
15A7 000,128 MOUSE.COM ENVIRONMENT
15B0 010,048 MOUSE.COM COMMAND.COM 0A 33
1825 000,128 CPANEL.COM ENVIRONMENT
182E 032,928 CPANEL.COM COMMAND.COM
2039 000,128 UNIEGA.COM ENVIRONMENT
2042 006,480 UNIEGA.COM COMMAND.COM 10 1F 44
21D8 000,128 UNIKBD.COM ENVIRONMENT
21E1 000,848 UNIKBD.COM COMMAND.COM 16
2217 000,128 NC.EXE ENVIRONMENT
2220 012,896 NC.EXE COMMAND.COM
2547 000,128 COMMAND.COM ENVIRONMENT
2550 000,512 COMMAND.COM ENVIRONMENT
2571 000,144 PCMAP1.EXE ENVIRONMENT
257B 002,736 FREE UNKNOWN
2627 000,128 TXTSCR.COM ENVIRONMENT
2630 000,976 TXTSCR.COM UNKNOWN 08 09 28
266E 002,896 COMMAND.COM COMMAND.COM 00 22 23 24 2F
2724 025,120 PCMAP1.EXE COMMAND.COM
Dos Memory: 655,360 bytes
Block Memory: 655,360 bytes
Free Memory: 469,920 bytes
Как видно из приведенной карты, обычно в MS DOS используется порядка
десятка резидентных программ различного назначения и выявить "лишнюю"
даже если она видна, не так просто. Поэтому желательно иметь распечатку
"эталонной" карты памяти с которой можно сравнить имеющуются.
ФОРМАТ ИСПОЛНЯЕМЫХ ПРОГРАММ В MS DOS
В MS DOS имеются два основных формата исполняемых программ: СOM и
EXE. Файл COM-формата - это двоичный образ кода и данных программы.
Такой файл должен занимать менее 64K. Файл EXE-формата содержит
специальный заголовок, при помощи которого загрузчик выполняет настройку
ссылок на сегменты в загруженном модуле.
Ввиду сегментации адресного пространства процессора 8088/86/286 и
того факта, что переходы (JMP) и вызовы (CALL) используют относительную
адресацию, оба типа программ (EXE и COM) могут выполняться в любом месте
памяти. Программы обычно не пишутся в предположении, что они будут
загружаться с определенного адреса (за исключением некоторых
самозагружающихся, защищенных от копирования игровых программ).
Программы типа EXE могут состоять из нескольких сегментов и могут
выполняться любом месте памяти только потому, что DOS настраивает
сегментные адреса при загрузке.
COM-программы
COM-программы содержат единственный сегмент (или, во всяком случае,
не содержат явных ссылок на другие сегменты). Образ COM-файла
считывается с диска и помещается в память, начиная с PSP:0100.
COM-программы обычно используются для небольших утилит. Они быстрее
загружаются, ибо не требуется настройки сегментов, и занимают меньше
места на диске, поскольку заголовок EXE и сегмент стека отсутствуют в