Нимогу понять почему происходит нижеследующее действо. Хучится invalid opcode перезаписью в idt (для простоты хукер содержит простой джамп на оригинальный nt!KiTrap06), работает окейно на родных protected mode апликейшенах, но вот на virtual 8086 mode начинаются бока. Что имеем на практике: Код (Text): kd> !idt 6 Dumping IDT: 06: f9fd24d8 vdmint6!__int6handler kd> u vdmint6!__int6handler f9fd24d8 ff251427fdf9 jmp dword ptr [vdmint6!gInt6OriginHandler (f9fd2714)] kd> u poi(vdmint6!gInt6OriginHandler) nt!KiTrap06: 8053dd04 f744240800000200 test dword ptr [esp+8],20000h 8053dd0c 0f8464040000 je nt!KiTrap06+0x472 (8053e176) 8053dd12 60 pushad 8053dd13 b823000000 mov eax,23h 8053dd18 668ed8 mov ds,ax ... Какого плана случаются бока в эмуляции 8086? Программа из аттача (install.exe) говорит что-то вроде, messagebox: caption: "16-разрядная подсистема MS-DOS" text: "<путь к бинарнику> X#=0D, CS=00c7 IP=00002725. Процессор NTVMD обнаружил необрабатываемое исключение. Для завершения нажмите "Закрыть" " Никак не могу допереть как один джамп может на это влиять, сорец драйвера, бинарник, программы загрузки\выгрузки драйвера и сама ms-dos программа на которой падает в атаче, гляньте кому не лень плиз
rain в обработчике примерно вот так сделай Код (Text): __declspec(naked) UDhandler() // { __asm{ // saveregd mov edi, dword ptr cs:[esp+28] // fault eip cmp edi,0x0000ffff // NTVDM ? ja __notfromvdm jmp __search_ret __notfromvdm: .....
rain Дык "jmp [addr]" = "jmp ds:[addr]", а при выходе из V86 процессор сбрасывает ds в 0. Вот и получается #GP. Пиши "jmp cs:[addr]" либо установи правильный ds.
k3internal не совсем ясно что здесь проверяется? что такое saveregd? вообще-то проверить под vdm мы или нет, можно как это делает nt!KiTrap06: Код (Text): 8053dd04 f744240800000200 test dword ptr [esp+8],20000h это проверка VM флага в eflags на стеке. Но вся соль к том что я _ничего_ не делаю кроме как вставляю джамп на оригинальный диспатчер, почему это приводит к таким ошибкам -- хз
rain проверяется, откуда был вызов. eip в v86 явно меньше 0xffff, а в pm явно не может быть меньше, если речь идёт об nt-системе.
k3internal ага понял но вообщем-то это один из способов diamond да всё отлично, только вот почему не всегда ds, es обнуляется или это windbg врёт? И ещё вопрос, такие проверки судя по всему нужно делать только в 13 (gp) и 6 (invalid opcode) ?
При возникновении исключения в защищённом режиме процессор, переходя к обработчику прерывания защищённого режима, не трогает ds,es. При возникновении исключения в режиме V86 процессор, переходя к обработчику прерывания защищённого режима (а это, кстати, единственный способ выхода из V86 - не считая сигнала #RESET, который и запретить можно), сбрасывает ds,es (а также fs и gs) в нули (ибо значения, валидные в V86-режиме, не являются таковыми в защищённом). Если WinDBG при этом показывает что-то другое - да, он врёт В V86 может произойти любое исключение, а не только #GP и #UD. Кроме того, обычная ring3-программа имеет полное право сбросить ds в ноль (если она потом не будет к нему обращаться); никто этого не делает, но само по себе действие "xor eax,eax/mov ds,ax" не вызывает исключения. Так что к нулевому ds нужно быть готовым во всех обработчиках.