l_inc Извиняюсь. Ссылка действительно не по теме вопроса. P.S. Лучше не получилось А тема была - защита секторов ЖД. Из ПЗУ
l_inc Я вроде как немного разобрался, поправьте, если что не так. 1) Сперва копируем себя в отрезанный у кусок памяти. С and al, 0FCh я так и не разобрался. 2) Далее ИМНО прочитанный второй сектор с дискеты читается для того, чтоб проверить, находится наш код в обработчике 13-го прерывания, а НЕ для копирования 2-го сектора в MBR. Код (Text): seg000:002E mov ax, 201h seg000:0031 mov cl, 2 seg000:0033 cdq seg000:0035 mov bh, 2 seg000:0037 int 13h seg000:0039 jb short loc_50 seg000:003B cli seg000:003C mov eax, dword ptr ds:unk_4C seg000:0040 mov es:77h, eax seg000:0045 mov word ptr ds:unk_4C, 6Ah seg000:0050 loc_50: ; CODE XREF: seg000:0039j seg000:0050 push es seg000:0051 push 55h seg000:0054 retf И если нашего кода в обработчике нет, по смещению 003C устанавливаем вектор 13-го прерывания на наш обработчик. 3) Далее переходим по смещению 55h, который и копирует первый сектор с винта (cx = 1!) по адресу 0:7с00h, и передает управление MBR командой jmp far ptr 0:7C00h 4) Наш код в обработчике 13-го прерывания проверяет(смещение seg000:006A, которое было выставлено по смещению seg000:0045), произошло ли чтение с диска, если да, проверяем что мы читаем, и если нужно, подменяем информацию. Начало 13-го обработчика: Код (Text): loc_6A: ; DATA XREF: seg000:5A045o seg000:006A pushf seg000:006B cmp ah, 42h ; 'B' seg000:006E jz short loc_7B seg000:0070 cmp ah, 2 seg000:0073 jz short loc_7B seg000:0075 popf seg000:0076 seg000:0076 loc_76: ; DATA XREF: seg000:0082r seg000:0076 ; seg000:5A040w seg000:0076 jmp far ptr loc_0 Вот еще цитата со статьи:
lukash Большое спасибо. Разобрался. Вы правы. Только в приведенном коде у Вас 5 байтов пропущены: как раз там, где сегментная часть смещения на место указателя на обработчик пишется и разрешаются прерывания.