Подскажите какими способами возможно отследить изменения в загрузочном секторе и на ЖД в целом. Хватит ли для этого информации, получаемой при перехвате прерываний (13h,19h) во входных регистрах прерывания? Например: в процедуре обработки 13 прерывания проверяем ah. Если ah=3, то кто-то записывает сектор. ah=0, ch=0, cl=1 -загрузочный сектор, и т.д. Как сделать такую проверку на уровне портов ЖД, и нужен ли такой метод? Какие еще способы используют boot–вирусы для записи на ЖД?
ИМХО, никаким. Перехватчики прерываний могут помочь только при работе под DOS или WIn9x, и то только с теми прогами, которые их использую. Если же прога работает через порты, то ИМХО тут уже ничем не поможешь. В WinXP(2000) вся работа ведётся через порты. Тока у обычных программ нет доступа к портам. Поэтому обычно все пишут через API-функции. Так что достаточно перехватить какой-нибудь CreateFile, и большинство обращений к диску ты перехватишь. Тока от вирусов это не спасёт, так как любой нормальный вирус умеет скрывать свои действия на компе. И при доступе к диску либо сам перехватывает тот же CreateFile, либо открывает себе доступ к портам (переползая на нулевой уровень привилегий или исменяя карту портов в/в).
Я так понял что речь здесь идет про работу в среде DOS и причем здесь CreateFile? В краце скажу что "boot-вирусы" под DOS изменяют сектор начальной зыгрузки который находится на нулевом секторе первой дорожки, при этом копируя свое тело в другие сектора на этой дорожке их там вроде не больше 16 - но точно непомню после чего вставляют команду безусловного перехода на тело вируса, при загрузке Bios определяет жесткий диск и загружает ядро MS-DOS которое находит загружочный сектор и грузит его в память по определенному адрессу(адресс не пишу так как точно его не помню),так как вирус вставил в загрузчик команду(jmp ...) то сначало работает вирус при этом происходит переход на тело вируса который находится в другом секторе на той же дорожке, при этом первым срабатывает вирус и грузится в память резидентно послесрабатывания вирус возвращает загрузчику управление и ОСЬ загружается когда ось загрузилась если было обращение к файлу пользователя, вирус заражает этот файл или ишет файлы по маске (*.exe or *.com). Вот основной принцип boot-вирусов, хотя вирусы тоже бывают разные об этом нужно помнить, и желательно учитывать.
brat315 Меня интересует как раз действия вируса в момент доступа к ЖД и способы определения записи. Можно ли сделать что-то наподобие образа этого сектора, и сравнивать его с сектором? Или проверять по контрольной сумме. Ведь программа проверки будет загружаться до активации вируса, и сможет сделать “рабочий” образ. Может у кого-то есть хорошее описание портов ЖД. Искал, но чего-то стоящего не нашел, или попадаются битые ссылки.
Вы б человека ещё дальше послали И чё людей на undoc так тянет. Если в учебных целях - то перехват int 13 будет отслеживать обращения ~90% программ (думаю пойдёт). А если 100% надо - можно использовать отладочные регистры DRx для перехвата доступа к портам. Но это будет гораздо сложней т.к. придётся переходить либо в PM либо в V86. Хотя может и из-под RM можно - я не проверял (но есть сомнения). В отличии от SMM V86 и PM документированы.
100% не нужно. Мне кажется, что нет необходимости в SMM (код придется писать аппаратно-привязным, и еще разобраться во всем этом нужно…). Но соответствующие топики были найдены, и изучение идет полным ходом Но пока что идея использование отладочных регистров и перехват int 13 мне больше нравится, но еще не разобрался до конца. Теоретически нужно с помощью DR7 создать точку останова на запись в порт. Объясните, пожалуйста, как это правильно сделать. Желательно на примере.
теоретически можно его обломать на доступе к DRx , особенно если этот код не проверяет результат сброса дебага.
Пожалуйста пример того, как обломать такой код: Код (Text): mov eax, cr4 and eax, FFFFFFF7h mov cr4, eax xor eax, eax mov dr7, eax mov dr0, eax mov dr1, eax mov dr2, eax mov dr3, eax mov al, FEh out 64h, al
Запустить его в V86 - он сам обломается на доступе к CRx Ты попробуй таким кодом обламать SoftIce for DOS. Поставь бряк на какой-нить порт и потом попробуй его сбросить таким макаром - гарантирую что ничего не получится.
Так все же, есть ли смысл использовать DRx, или можно продолжать изучение SMM? Пока с отладочными регистрами разбираюсь по статье http://www.wasm.ru/print.php?article=protect_by_hasp01
Зато в pmode он может вполне успешно использоваться, и никто нифига не сможет с этим поделать. Единственный 100% способ - использование виртуализации, поддержка которой есть в современных процах.
В pmode Ring0. Можно прогу запустить в Ring3 и будет тот же облом. А вообще человек про загрузочные вирусы под DOS спрашивает. А я чё-то вирусов таких не встречал в DOS чтоб они сразу в PM переходили да ещё и в Ring0. Это всё RM код. И его спокойно можно в V86 запустить и всё мониторить.
сейчас не найду, но тут года полтора назад был чудный топик как раз на тему таких вещей. И что характерно - работало оно... rm-код это верно. Но он может (и он это часто делает(!)) обращатся напрямую к железу, что в v86 фиг отработает.
Это ещё почему? Никто не мешает для V86 задачи создать битовую карту IO где расшарить все порты кроме HDD и прямой доступ к портам будет. А при доступе к HDD будет исключение - сохраняешь в лог данные, разрешаешь вывод в порт, включаешь трассировку, выполняешь ввод/вывод, после выполнения io команды ловишь debug trap, закрываешь доступ к порту и снимаешь трассировку. Всё это реализуемо - было б желание... А если просто доступ к портам открыть ко всем из V86 - дык IOPL опустить до 3 и все дела...
Желание то есть. А вот опыта, бывает, не хватает Вроде как понял, что надо делать. Вот сейчас попробую сделать что-то работающее. Сначала для pm. Уже хочу попробовать и под Винду.
Под Win можно драйвер фильтра написать. IMHO намного проще, тем более что напрямую она к железу доступа прикладным программам не даёт.
lukash Вообще можно считать загрузочный сектор в файл в сыром виде через debug.com с парметром -l так как у меня нет домашнего инета а я пользуюся услугами интернет центра точно как это делается я не помню но вроде так debug -l [диск:][сектор] [сколько байт считываем (обычно 512)] А насчет проверки контрольной суммы ту я точно не знаю сам не проверял. Хотя в принципе DOS при загрузке в память сектора, как то проверяет CRC.
Почти доделал программу под Win. Код приводить не буду, так как программу делал по статье Chingachgukа, и почти весь код взят оттуда Только сейчас вспомнил, что программа должна запускаться до загрузки Винды, так что в виде драйвера не получится. Поэтому опять появились вопросы: 1 Есть “отрезанный” у DOS кусок памяти, в котором нужно оставить обработчик. Можно подправить IDT до загрузки Винды, или это необходимо сделать после ее загрузки? 2 Код включения ловушки можно использовать и под DOS, только с IDT не придется шаманить? 3 Как я понял, останов происходит во время записи/чтения в порт, указанный в регистрах Dr0-Dr3. Как сделать только на out, например? Или это нужно указывать при настройке Dr7? По-моему я не правильно понял Вот так думаю составлять код, поправьте, если что не так: Переключаемся в pmode (для Винды). Определение адреса idt Код (Text): tidt_descr struc idt_size dw ? ; размер idt lin_addr dd ? ; линейный адрес начала idt tidt_descr ends idt_descr tidt_descr <> sidt fword ptr idt_descr mov ebx,dword ptr idt_descr.lin_addr add ebx,1*8 Затем заносим обработчик в “отрезанный” у DOS кусок памяти Код (Text): push 0 pop es sub word ptr es:[0413h],2 ; “отрезаем” у DOS кусок памяти в 2К: mov ax,es:[0413h] mov cl,6 shl ax,cl mov es,ax ; копирование процедуры в память начиная с es:0000 xor si,si mov cx,prg_lenght prg_copy: mov bl,byte ptr cs:@@ResidentalCode[si] mov byte ptr es:[si],bl inc si loop cs:prg_copy Немного редактируем idt: Код (Text): ttrap struc offs_l dw ? ; [0] sel dw ? ; [2] rsrv db ? ; [4] attr_ db 8fh ; [5] offs_h dw ? ; [6] ttrap ends trap ttrap <> mov trap.offs_l,es; mov trap.offs_h,0 ; в ebx начало описателя #1 mov eax,dword ptr trap xchg [ebx],eax mov dword ptr old_trap_01,eax mov eax,dword ptr trap+4 xchg [ebx+4],eax mov dword ptr old_trap_01+4,eax Устанавливаем флаг DE в Enable и включаем ловушку: Код (Text): mov eax,cr4 or eax,01000b mov cr4,eax xor ebx,ebx mov bx,Port mov dr0,ebx add ebx,2 mov dr1,ebx add ebx,2 mov dr2,ebx add ebx,2 mov dr3,ebx ; FEDCBA9876543210FEDCBA9876543210 mov eax,01100110011001100010011111111111b mov dr7,eax Переключаемся в rmode (для DOS). Все тоже, только с IDT не придется шаманить. Просто обращаемся к таблице векторов и изменяем содержимое соответствующих ячеек: Код (Text): mov ax,0h mov es,ax mov es:[1h*4],dx mov es:[1h*4+2],ds Теоретически, после этого при обращении к портам или к Dr регистрам будут осуществлен переход на обработчик 1 прерывания (в DOS и Win).