semen mikae@******:~$ man ptrace No manual entry for ptrace mikae@******:~$ uname -a Linux ****** 2.6.28-12-generic #43-Ubuntu SMP Fri May 1 19:31:32 UTC 2009 x86_64 GNU/Linux mikae@******:~$ Я далеко не спец (но вчера как раз читал про ptrace ), и насколько понял -- сейчас больше любят /proc.
Mika0x65 Значит просто манов нету. Возможно даже нету инклудов. Но сискол должен быть, условной компиляции в кернеле я не вижу, так что дефайном его не выключить. Попробуй простенький примерчик скомпилить: Код (Text): #include <sys/ptrace.h> int main() { ptrace(PTRACE_TRACEME, 0, NULL, NULL); return 0; }
Без /proc иногда даже не обойтись, но это восновном только для получения информации, а не для таких вещей как трассировка, ptrace всегда активно и использовался совместно с /proc - например чтобы приаттачиться к процессу для енумерации всех тредов. Тут кроется и большой недостаток ptrace - нет метода атомарного аттача ко всем тредам, а пока енумеруешь треды с помощью /proc могут и новые появиться, так что приходится сначала все останавливать. Вобщем, для мультипоточной отладки он плохо подходит, и гуишный отладчик с ним сделать сложно.
Появилась чудесная идея. Ведь указатель на стек в MSR никто не проверяет(всмысле никакой антируткит). Инструкция Sysenter выполняется на PASSIVE_LEVEL, тоесть в юзермоде. Это позволяет обработать #PF/#GP в KiDebugRoutine, ибо обработку для #PF ядро пропустит только на первых двух IRQL. Значит посылаем IPI, записываем в IA32_SYSENTER_ESP невалидный указатель. После этого в диспетчере исключений будем чекать опкод и вручную перезагружать регистры. Вот и решение (с).
Не верно, вылетает на #DF, ядро не обрабатывает После загрузки указателя на ядерный стек к нему происходит обращение, тут и слетает.
Ну впринципе идея была хорошей, для улучшения msr перехвата, чтобы не вопили всякие антивири. Хотя это уже вторично. В WRK нужных каллбэков не нашел, другие нашел, сисколов не нашел, видимо не полная поддержка трейсов, тот .tmf что я смотрел - от DDK win7, видимо только в нем есть нужные каллбэки - буду дизасмить его кернел. Драйверов от отладчиков коотрые можно было бы заюзать тоже пока не нашел. Пробую перехват через ZwSystemDebugControl, но в x64 виндах 2008 и семерке из 32бит кода он не работает, буду пробовать из х64 кода. Но даже в случае успеха нужен саппорт в кернеле, чтобы не менять IA32(64)_SYSENTER_CS и разместить код перехватчика в кернеле а не юзере. Фактически нам нужно только чтобы кто-то rwe память выделил, дальше и ZwSystemDebugControl можно, если в x64 он не стал более умный и не выполняет больше проверок. Если найти такой саппорт в готовом драйвере, то хотябы в 32бит XP проблема уже решается.