есть идея обнулить отладочные регистры "DR0 DR1 .... и т.д." но как это сделать из ring 3, или подскажите кто нибуть универсальный способ перехода в RING 0 реально работающий на платформе WIN32. _______________________________________ Заранее спасибо Сергей г.Мурманск. Hpmadoctor@mail.ru
А через SEH обнулить слабо? Насчет перехода в ринг0 - читай статьи из раздела "Секреты Win32" и выбирай что твоей душе угодно, но учти, что тогда твоей программе для работы будут нужны права администратора, что может не понравиться конечным пользователям.
Ms Rem Я думаю такая программа и так конечным пользователям не понравится, иначе вопрос был бы в другом разделе ))
Ms Rem а точно можно ? я когда - то пробовал , но отладочные регистры не изменялись , только общего назначения ...
Код (Text): struc CONTEXT .ContextFlags: resd 1 .iDr0: resd 1 .iDr1: resd 1 .iDr2: resd 1 .iDr3: resd 1 .iDr6: resd 1 .iDr7: resd 1 .FloatSave: resd 01Ch ;FLOATING_SAVE_AREA <> .regGs: resd 1 .regFs: resd 1 .regEs: resd 1 .regDs: resd 1 .regEdi: resd 1 .regEsi: resd 1 .regEbx: resd 1 .regEdx: resd 1 .regEcx: resd 1 .regEax: resd 1 .regEbp: resd 1 .regEip: resd 1 .regCs: resd 1 .regFlag: resd 1 .regEsp: resd 1 .regSs: resd 1 ; Other unneeded shit... endstruc clear_dr: push eax call delta1 ; PIC prolog No.1 delta1: add dword [esp], xHandler - delta1 push dword [fs:eax] mov dword [fs:eax], esp mem_av: mov eax, [eax] ; AV xHandler: ; Exception handler push ecx push edi xor eax, eax mov edi, [esp + 0Ch + 08] ; Clear DRx registers add dword [edi + CONTEXT.regEip],(xExit-mem_av) ; ptr to xExit label add edi, CONTEXT.iDr0 push byte 04 pop ecx rep stosd mov dword [edi + 04], 0155h pop edi pop ecx ret xExit: pop dword [fs:eax] pop eax pop eax
Boby лучше даже не обнулять их, а использовать для хранения данных, которые используются в программе ...хотя все это конечно не спасет вашу прогу от головорезов типа Доктора
Есть возможность и через SetThreadContext (GetCurrentThread...) сделать тоже самое, но к сожалению на функцию можно установить и бряк.
Есть возможность проверить не стоит ли бряк на искомую функцию при полочении импорта , я сам юзаю эту тему и SoftIce не выскакивает, вот так я это делаю: push eax ;base K32 call dword ptr [ebp + offset GetP] ;{Проверим не стоит ли BreackPoint на искомую функцию} cmp byte ptr [eax],0cch je Found_BreackPoint ;В случае обнаружения таковово сгенерируем ошибку ;{----------------------------------------------------} и так далее в цикле поиска API адресов )
infern0 Пожалуйста не моглили бы вы быть так добры привести пример РЕАЛЬНО РАБОЧЕГО SEH . Пожалуйса, а то у меня ничего не получается.
Boby См. "Обработка исключений Win32 для программистов на ассемблере". И во вторые упаковщики тоже нужно глянуть. Примеры все рабочие.