Контроль ЖД

Тема в разделе "WASM.ASSEMBLER", создана пользователем lukash, 26 сен 2006.

  1. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Подскажите какими способами возможно отследить изменения в загрузочном секторе и на ЖД в целом. Хватит ли для этого информации, получаемой при перехвате прерываний (13h,19h) во входных регистрах прерывания? Например: в процедуре обработки 13 прерывания проверяем ah. Если ah=3, то кто-то записывает сектор. ah=0, ch=0, cl=1 -загрузочный сектор, и т.д.
    Как сделать такую проверку на уровне портов ЖД, и нужен ли такой метод?
    Какие еще способы используют boot–вирусы для записи на ЖД?
     
  2. gatman

    gatman New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    4
    ИМХО, никаким. Перехватчики прерываний могут помочь только при работе под DOS или WIn9x, и то только с теми прогами, которые их использую. Если же прога работает через порты, то ИМХО тут уже ничем не поможешь.
    В WinXP(2000) вся работа ведётся через порты. Тока у обычных программ нет доступа к портам. Поэтому обычно все пишут через API-функции. Так что достаточно перехватить какой-нибудь CreateFile, и большинство обращений к диску ты перехватишь.
    Тока от вирусов это не спасёт, так как любой нормальный вирус умеет скрывать свои действия на компе. И при доступе к диску либо сам перехватывает тот же CreateFile, либо открывает себе доступ к портам (переползая на нулевой уровень привилегий или исменяя карту портов в/в).
     
  3. brat315

    brat315 New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    21
    Адрес:
    Russia
    Я так понял что речь здесь идет про работу в среде DOS и причем здесь CreateFile?
    В краце скажу что "boot-вирусы" под DOS изменяют сектор начальной зыгрузки
    который находится на нулевом секторе первой дорожки, при этом копируя свое
    тело в другие сектора на этой дорожке их там вроде не больше 16 - но точно непомню
    после чего вставляют команду безусловного перехода на тело вируса, при загрузке
    Bios определяет жесткий диск и загружает ядро MS-DOS которое находит загружочный
    сектор и грузит его в память по определенному адрессу(адресс не пишу так как точно
    его не помню),так как вирус вставил в загрузчик команду(jmp ...) то сначало работает
    вирус при этом происходит переход на тело вируса который находится в другом секторе на той же дорожке, при этом первым срабатывает вирус и грузится в память резидентно послесрабатывания вирус возвращает загрузчику управление и ОСЬ загружается когда ось загрузилась если было обращение к файлу пользователя, вирус заражает этот файл или ишет файлы по маске (*.exe or *.com).

    Вот основной принцип boot-вирусов, хотя вирусы тоже бывают разные об этом нужно помнить, и желательно учитывать.
     
  4. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    brat315

    Меня интересует как раз действия вируса в момент доступа к ЖД и способы определения записи.
    Можно ли сделать что-то наподобие образа этого сектора, и сравнивать его с сектором? Или проверять по контрольной сумме. Ведь программа проверки будет загружаться до активации вируса, и сможет сделать “рабочий” образ.

    Может у кого-то есть хорошее описание портов ЖД. Искал, но чего-то стоящего не нашел, или попадаются битые ссылки.
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    одно время тут пробегал топег про SMM - там как раз такое и делалось :)
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вы б человека ещё дальше послали :)
    И чё людей на undoc так тянет.
    Если в учебных целях - то перехват int 13 будет отслеживать обращения ~90% программ (думаю пойдёт).
    А если 100% надо - можно использовать отладочные регистры DRx для перехвата доступа к портам.
    Но это будет гораздо сложней т.к. придётся переходить либо в PM либо в V86.
    Хотя может и из-под RM можно - я не проверял (но есть сомнения).
    В отличии от SMM V86 и PM документированы.
     
  7. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    100% не нужно. Мне кажется, что нет необходимости в SMM (код придется писать аппаратно-привязным, и еще разобраться во всем этом нужно…). Но соответствующие топики были найдены, и изучение идет полным ходом :)

    Но пока что идея использование отладочных регистров и перехват int 13 мне больше нравится, но еще не разобрался до конца. Теоретически нужно с помощью DR7 создать точку останова на запись в порт. Объясните, пожалуйста, как это правильно сделать. Желательно на примере.
     
  8. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Теоретически, код который будет пытаться писать в порты, может легко сбросить все точки останова.
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    теоретически можно его обломать на доступе к DRx :), особенно если этот код не проверяет результат сброса дебага.
     
  10. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Пожалуйста пример того, как обломать такой код:
    Код (Text):
    1. mov eax, cr4
    2. and eax, FFFFFFF7h
    3. mov cr4, eax
    4. xor eax, eax
    5. mov dr7, eax
    6. mov dr0, eax
    7. mov dr1, eax
    8. mov dr2, eax
    9. mov dr3, eax
    10. mov al, FEh
    11. out 64h, al
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Запустить его в V86 - он сам обломается на доступе к CRx
    Ты попробуй таким кодом обламать SoftIce for DOS.
    Поставь бряк на какой-нить порт и потом попробуй его сбросить таким макаром - гарантирую что ничего не получится.
     
  12. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Так все же, есть ли смысл использовать DRx, или можно продолжать изучение SMM?
    Пока с отладочными регистрами разбираюсь по статье
    http://www.wasm.ru/print.php?article=protect_by_hasp01
     
  13. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Зато в pmode он может вполне успешно использоваться, и никто нифига не сможет с этим поделать. Единственный 100% способ - использование виртуализации, поддержка которой есть в современных процах.
     
  14. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    В pmode Ring0.
    Можно прогу запустить в Ring3 и будет тот же облом.

    А вообще человек про загрузочные вирусы под DOS спрашивает.
    А я чё-то вирусов таких не встречал в DOS чтоб они сразу в PM переходили да ещё и в Ring0.
    Это всё RM код. И его спокойно можно в V86 запустить и всё мониторить.
     
  15. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    сейчас не найду, но тут года полтора назад был чудный топик как раз на тему таких вещей. И что характерно - работало оно...
    rm-код это верно. Но он может (и он это часто делает(!)) обращатся напрямую к железу, что в v86 фиг отработает.
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это ещё почему?
    Никто не мешает для V86 задачи создать битовую карту IO где расшарить все порты кроме HDD и прямой доступ к портам будет.
    А при доступе к HDD будет исключение - сохраняешь в лог данные, разрешаешь вывод в порт, включаешь трассировку, выполняешь ввод/вывод, после выполнения io команды ловишь debug trap, закрываешь доступ к порту и снимаешь трассировку.
    Всё это реализуемо - было б желание...

    А если просто доступ к портам открыть ко всем из V86 - дык IOPL опустить до 3 и все дела...
     
  17. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Желание то есть. А вот опыта, бывает, не хватает :dntknw:
    Вроде как понял, что надо делать. Вот сейчас попробую сделать что-то работающее. Сначала для pm.
    Уже хочу попробовать и под Винду.
     
  18. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Под Win можно драйвер фильтра написать.
    IMHO намного проще, тем более что напрямую она к железу доступа прикладным программам не даёт.
     
  19. brat315

    brat315 New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    21
    Адрес:
    Russia
    lukash
    Вообще можно считать загрузочный сектор в файл в сыром виде через
    debug.com с парметром -l так как у меня нет домашнего инета а я пользуюся
    услугами интернет центра точно как это делается я не помню но вроде так
    debug -l [диск:][сектор] [сколько байт считываем (обычно 512)]

    А насчет проверки контрольной суммы ту я точно не знаю сам не проверял.
    Хотя в принципе DOS при загрузке в память сектора, как то проверяет CRC.
     
  20. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Почти доделал программу под Win. Код приводить не буду, так как программу делал по статье Chingachgukа, и почти весь код взят оттуда:)

    Только сейчас вспомнил, что программа должна запускаться до загрузки Винды, так что в виде драйвера не получится. Поэтому опять появились вопросы:
    1 Есть “отрезанный” у DOS кусок памяти, в котором нужно оставить обработчик. Можно подправить IDT до загрузки Винды, или это необходимо сделать после ее загрузки?
    2 Код включения ловушки можно использовать и под DOS, только с IDT не придется шаманить?
    3 Как я понял, останов происходит во время записи/чтения в порт, указанный в регистрах Dr0-Dr3. Как сделать только на out, например? Или это нужно указывать при настройке Dr7? По-моему я не правильно понял:)

    Вот так думаю составлять код, поправьте, если что не так:

    Переключаемся в pmode (для Винды).
    Определение адреса idt

    Код (Text):
    1. tidt_descr struc
    2.   idt_size dw ? ; размер idt
    3.   lin_addr dd ? ; линейный адрес начала idt
    4. tidt_descr ends
    5.  
    6. idt_descr tidt_descr <>
    7.  
    8. sidt fword ptr idt_descr
    9. mov  ebx,dword ptr idt_descr.lin_addr
    10. add  ebx,1*8
    Затем заносим обработчик в “отрезанный” у DOS кусок памяти

    Код (Text):
    1. push 0    
    2. pop  es
    3. sub  word ptr es:[0413h],2 ;  “отрезаем” у DOS кусок памяти в 2К:
    4. mov  ax,es:[0413h]                    
    5. mov  cl,6                                                        
    6. shl  ax,cl          
    7. mov  es,ax ; копирование процедуры в память начиная с es:0000
    8. xor  si,si
    9. mov  cx,prg_lenght      
    10.  
    11. prg_copy:
    12.                 mov  bl,byte ptr cs:@@ResidentalCode[si]              
    13.                 mov  byte ptr es:[si],bl
    14.                 inc  si                
    15. loop cs:prg_copy
    Немного редактируем idt:

    Код (Text):
    1. ttrap  struc
    2.   offs_l dw  ?       ; [0]
    3.   sel    dw    ?       ; [2]
    4.   rsrv   db    ?       ; [4]
    5.   attr_  db    8fh   ; [5]
    6.   offs_h dw  ?      ; [6]
    7. ttrap  ends
    8.  
    9. trap        ttrap <>
    10.  
    11. mov  trap.offs_l,es;
    12. mov  trap.offs_h,0
    13.  
    14. ; в ebx начало описателя #1
    15. mov  eax,dword ptr trap
    16. xchg [ebx],eax
    17. mov  dword ptr old_trap_01,eax
    18. mov  eax,dword ptr trap+4
    19. xchg [ebx+4],eax
    20. mov  dword ptr old_trap_01+4,eax
    Устанавливаем флаг DE в Enable и включаем ловушку:

    Код (Text):
    1. mov  eax,cr4
    2. or   eax,01000b
    3. mov  cr4,eax
    4.  
    5. xor  ebx,ebx
    6. mov  bx,Port
    7. mov  dr0,ebx
    8. add  ebx,2
    9. mov  dr1,ebx
    10. add  ebx,2
    11. mov  dr2,ebx
    12. add  ebx,2
    13. mov  dr3,ebx
    14.  
    15.   ;          FEDCBA9876543210FEDCBA9876543210
    16. mov  eax,01100110011001100010011111111111b
    17. mov  dr7,eax
    Переключаемся в rmode (для DOS).
    Все тоже, только с IDT не придется шаманить. Просто обращаемся к таблице векторов и изменяем содержимое соответствующих ячеек:

    Код (Text):
    1. mov ax,0h
    2. mov es,ax
    3. mov es:[1h*4],dx
    4. mov es:[1h*4+2],ds
    Теоретически, после этого при обращении к портам или к Dr регистрам будут осуществлен переход на обработчик 1 прерывания (в DOS и Win).