Пример 2. ASSUME CS:CODE, DS:CODECODE SEGMENT ASSUME CS: CODE, DS: CODE ORG 10OH BEG: /открыть файл MOV AX, 3D02H LEA DX, PATH INT 21H JC _END PUSHAX /байт в таблице дескрипторов файлов равен ; номеру блока описания файла MOVSI, AX MOV DL, ES: [SI+18H] - • • XORDH, DH; номер блока в DX /адрес списка списков ~ MOV АН, 52Н: INT 21H /указатель на системную таблицу файлов LES SI, ES: [BX+4]; в ES: SI /ищем блок описания файла CMPDX, ES: [SI+4] JB YES SUB DX, ES: [SI+4] LESSI, ES: [SI] /второй блок ; номер кластера YES: MOVAX, 59 /размерблока MULDL ADDSI, AX MOVAX, ES: [SI+6+OBH] /номеркластера MOVCLAST, AX /записываем номер по смещению OFSET, вначале сдвиг, POPВХ MOVAX, 4200H XORCX, CX может быть помечен как неперемещаемый (READONLY). Однако атрибут файла может быть случайно изменен, что приведет к тому, что пакет не будет работать. В качестве примера, однако, я приведу программу, определяющую начальный кластер заданного файла. Для определения начального кластера файла используется функция 52Н. Конечно, начальный кластер файла можно найти, поработав с FAT, но это гораздо сложнее. Данная программа определяет номер начального кластера файла с именем NONAME.COM и записывает его в него же по смещению OFSET. CODE SEGMENT ASSUME CS: CODE, DS: CODE ORG 10OH BEG: /открытьфайл MOV AX, 3D02H LEA DX, PATH INT 21H JC _END PUSHAX /байт в таблице дескрипторов файлов равен ; номеру блока описания файла MOVSI, AX MOV DL, ES: [SI+18H] - • • XORDH, DH; номер блока в DX /адрес списка списков ~ MOV АН, 52Н: INT 21H /указатель на системную таблицу файлов LES SI, ES: [BX+4]; в ES: SI /ищем блок описания файла CMPDX, ES: [SI+4] JB YES SUB DX, ES: [SI+4] LESSI, ES: [SI] /второй блок ; номер кластера YES: MOVAX, 59 /размерблока MULDL ADDSI, AX MOVAX, ES: [SI+6+OBH] /номеркластера MOVCLAST, AX /записываем номер по смещению OFSET, вначале сдвиг, POPВХ MOVAX, 4200H XORCX, CX ERR D: WR: MOV DH, 2 MOV CL, 4 MOV CH, 3 MOV DL, 80H MOV BX, OFFSET BUF INT 13H JC ERR_D MOV DX, OFFSET MES1 JMP SHORT WR MOV DX, OFFSET MES2 MOV AH, 9 INT 21H ' RET MES1 DB 'Метка установлена на жесткий диск.', 13, 10, ' $ ' MES2 DB 'При установке метки на жесткий диск произошла' DB 'ошибка.', 13, 10, '$ ' BUFDB 512 DUP(?) DB 4234' CODEENDS ENDBEGIN (а) Установка метки на жестком диске. CODE SEGMENT ASSUME CS-.CODE ORG 100H BEGIN: /читаем: головка 2, дорожка 3, сектор 4 MOV AH, OAH MOV AL, 1 MOV DL, 80H MOV DH, 2 MOV CH, 3 MOV CL, 4 MOV BX, OFFSET BUFFER INT 13H JCNO_M ; проверка последних 4 байт CMP BYTE PTR ES: [BX]+512, '! ' JNZ NO_M CMP BYTE PTR ES: [BX]+513, '2 ' JNZ NO M CMP BYTE PTR ES: [BX]+514, '3' JNZ NO_M CMP BYTE PTR ES: [BX]+515, '4 ' JNZ NO_M MOV DX, OFFSET MES2 JMP SHORT WR NO_M: MOV DX, OFFSET MES1 WR: MOV AH, 9 INT 21H RET BUFFER DB 512 DUP(?) METDB 4 DUP(?) MES1 DB 'Метка на жестком диске не обнаружена.' DB 13, 10, '$' MES2 DB 'Метка на жестком диске обнаружена.', 13, 10, '$' CODEENDS ENDBEGIN (б) Проверка метки на жестком диске. Информация, необходимая при идентификации пакета, может быть помещена в ВООТ-сектор или PARTITIONTABLE. Однако это ненадежный способ, и прибегать к нему следует лишь в простых ситуациях. Дело в том, что содержимое этих секторов может измениться при переустановке системы. Некоторые же антивирусные программы могут принять постороннюю информацию в секторе за наличие вируса. Пакет может быть привязан к BAD-кластерам, которые проставляются во время установки. Привязка к винчестеру может сочетаться с проверкой некоторых индивидуальных параметров компьютера. К таковым относятся: - серийный номер микропроцессора, микросхемы ПЗУ и дата изготовления; - аппаратная конфигурация данного компьютера; - содержание ПЗУ (контрольная сумма); - частотные и временные характеристики отдельных узлов.
|