virtual 8086 mode, int 6

Тема в разделе "WASM.NT.KERNEL", создана пользователем rain, 22 апр 2008.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Нимогу понять почему происходит нижеследующее действо.

    Хучится invalid opcode перезаписью в idt (для простоты хукер содержит простой джамп на оригинальный nt!KiTrap06), работает окейно на родных protected mode апликейшенах, но вот на virtual 8086 mode начинаются бока.

    Что имеем на практике:
    Код (Text):
    1. kd> !idt 6
    2.  
    3. Dumping IDT:
    4.  
    5. 06: f9fd24d8 vdmint6!__int6handler
    6.  
    7. kd> u vdmint6!__int6handler
    8. f9fd24d8 ff251427fdf9    jmp     dword ptr [vdmint6!gInt6OriginHandler (f9fd2714)]
    9.  
    10. kd> u poi(vdmint6!gInt6OriginHandler)
    11. nt!KiTrap06:
    12. 8053dd04 f744240800000200 test    dword ptr [esp+8],20000h
    13. 8053dd0c 0f8464040000    je      nt!KiTrap06+0x472 (8053e176)
    14. 8053dd12 60              pushad
    15. 8053dd13 b823000000      mov     eax,23h
    16. 8053dd18 668ed8          mov     ds,ax
    17. ...
    Какого плана случаются бока в эмуляции 8086?
    Программа из аттача (install.exe) говорит что-то вроде, messagebox:
    caption: "16-разрядная подсистема MS-DOS"
    text: "<путь к бинарнику> X#=0D, CS=00c7 IP=00002725. Процессор NTVMD обнаружил необрабатываемое исключение. Для завершения нажмите "Закрыть" "

    Никак не могу допереть как один джамп может на это влиять, сорец драйвера, бинарник, программы загрузки\выгрузки драйвера и сама ms-dos программа на которой падает в атаче, гляньте кому не лень плиз
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    на случай если атач не будет качаться, рапида
     
  3. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    rain
    в обработчике примерно вот так сделай
    Код (Text):
    1. __declspec(naked) UDhandler()       //
    2. {
    3. __asm{                          //
    4.  
    5.                 saveregd
    6.  
    7.                 mov edi, dword ptr cs:[esp+28]      // fault eip
    8.                 cmp  edi,0x0000ffff                 // NTVDM ?
    9.                 ja __notfromvdm
    10.                 jmp __search_ret
    11.                
    12. __notfromvdm:
    13. .....
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    rain
    Дык "jmp [addr]" = "jmp ds:[addr]", а при выходе из V86 процессор сбрасывает ds в 0. Вот и получается #GP. Пиши "jmp cs:[addr]" либо установи правильный ds.
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    k3internal
    не совсем ясно что здесь проверяется? что такое saveregd?
    вообще-то проверить под vdm мы или нет, можно как это делает nt!KiTrap06:
    Код (Text):
    1. 8053dd04 f744240800000200 test    dword ptr [esp+8],20000h
    это проверка VM флага в eflags на стеке. Но вся соль к том что я _ничего_ не делаю кроме как вставляю джамп на оригинальный диспатчер, почему это приводит к таким ошибкам -- хз
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    diamond
    йай! спасиб большое ща попробуем
     
  7. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    rain
    проверяется, откуда был вызов. eip в v86 явно меньше 0xffff, а в pm явно не может быть меньше, если речь идёт об nt-системе.
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    k3internal ага понял но вообщем-то это один из способов
    diamond да всё отлично, только вот почему не всегда ds, es обнуляется или это windbg врёт? И ещё вопрос, такие проверки судя по всему нужно делать только в 13 (gp) и 6 (invalid opcode) ?
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    При возникновении исключения в защищённом режиме процессор, переходя к обработчику прерывания защищённого режима, не трогает ds,es.
    При возникновении исключения в режиме V86 процессор, переходя к обработчику прерывания защищённого режима (а это, кстати, единственный способ выхода из V86 - не считая сигнала #RESET, который и запретить можно), сбрасывает ds,es (а также fs и gs) в нули (ибо значения, валидные в V86-режиме, не являются таковыми в защищённом). Если WinDBG при этом показывает что-то другое - да, он врёт :)

    В V86 может произойти любое исключение, а не только #GP и #UD. Кроме того, обычная ring3-программа имеет полное право сбросить ds в ноль (если она потом не будет к нему обращаться); никто этого не делает, но само по себе действие "xor eax,eax/mov ds,ax" не вызывает исключения. Так что к нулевому ds нужно быть готовым во всех обработчиках.