Можно ли написать для Windows отладчик, не лезя в ядро и не пользуясь прикладными функциями типа CreateProcess с флагом DEBUG и DebugActiveProcess? Выскажите все возможные варианты.
AndreyMust19 Можно МЕГА извращенными способами, читай нельзя. ДА ви вообще задачи не по весу ставишь.
Че же делать если отладчик захочется написать? Использовать CreateProcess с флагом DEBUG и DebugActiveProcess? А нельзя ли установить свой SEH-обработчик и каким-то образом перехватывать попытки установить свой обработчик. Например, поставить аппаратный бряк на FS:[0] на запись (если можно) и какой-то WinAPI функцией запретить другим прикладным процессам прикасаться к отлаживаемой программе?
Перехватывай в отлаживаемом процессе ntdll.dll!KiUserExceptionDispatcher, на васм есть цикл статей про SEH в одной из частей эта точка описывалась.
Спасибо, blast. А можно ли такому методу перехвата противостоять со стороны другого, постороннего, процесса?
Для начала сесть и отдышаться, потом закончить писать антивирус, потом модуль эвристики, анализатор почерка... А потом уже и за отладчик садиться )
Выражаю мои симпатии Осеню, он когда-то в какой-то теме очень четко выразил мысль (правда потом удалил =( ), я присоединяюсь =)
Да перехват можно определить, если задача состоит в как можно большей скрытности обработки исключения в usermode то конечно же лучше всего использовать VEH.
Специально отвечаю на слова MSoft: 1) Модуль эвристики нужен для антивируса (чтоб определять зараженные файлы). 2) Анализатор почерка - для обнаруженя посторонних вставок в UNIX-скрипты (bat-скрипты очень редкие и чаще всего очень маленькие и почерк в них распознать сложно), к антивирусу относится тоже. 3) Отладчик, не использующий ring0 и функций отладки - просто предположение - можно ли написать отладчик, почти не пользуясь услугами операционной системы.
Всем спасибо, я знал что ещё не все методы исчерпаны!!! Если кто не понял чего я трепался - я так решил что используя перехват ntdll.dll!KiUserExceptionDispatcher можно "отлаживать" те приложения, которые уже отлаживаются другими методами. Например, в целях защиты.
AndreyMust19 Вот только сопряжено с рядом значительных подводных камней. Первые два - сокрытие. Ты уже знаешь что многие исключения устанавливают флаг трассировки в флажках потока при входе в диспетчер и после исполнения его первой иснтрукции возникнет трассировочное исключение и повторный вход потока в диспетчер. Вот тут и тупик, в контексте потока регистр Eip будет указывать на следующую инструкцию, а это уже будет адрес твоего диспетчера. В совокупности с перехватом отлаживаемой программой этой точки для собственных нужд этот способ не рабочий. Во втором случае - проблема в перехвате этой точки, тоесть как исполнить её перехват, без коллизий с основной программой. Вариант - уменьшить на два указатель на эту точку в одной из переменных ядра, но для этого нужен к ниму доступ, а у тебя вероятно его нет.
AndreyMust19 Всегда пожалусто. Я готов написать код, который прибьёт/обнаружит отладку подобного типа. Даже если ты будешь использовать подмену секций(тот механизм, что является альтернативой сервисам записи в память), создав на месте той страницы, где находится KiUserExceptiondispatcher() свою проецию, это ничем не поможет.
почти не пользуясь - нельзя. как раз таки тут придется гораздо больше пользоваться услугами операционной системы аля LPC или пайпы, чем в случае с Debug API.