Аналог ptrace в win64

Тема в разделе "WASM.WIN32", создана пользователем semen, 4 май 2009.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    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.
     
  2. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Mika0x65
    Значит просто манов нету. Возможно даже нету инклудов. Но сискол должен быть, условной компиляции в кернеле я не вижу, так что дефайном его не выключить.
    Попробуй простенький примерчик скомпилить:
    Код (Text):
    1. #include <sys/ptrace.h>
    2.  
    3. int main()
    4. {
    5.     ptrace(PTRACE_TRACEME, 0, NULL, NULL);
    6.     return 0;
    7. }
     
  3. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Без /proc иногда даже не обойтись, но это восновном только для получения информации, а не для таких вещей как трассировка, ptrace всегда активно и использовался совместно с /proc - например чтобы приаттачиться к процессу для енумерации всех тредов. Тут кроется и большой недостаток ptrace - нет метода атомарного аттача ко всем тредам, а пока енумеруешь треды с помощью /proc могут и новые появиться, так что приходится сначала все останавливать. Вобщем, для мультипоточной отладки он плохо подходит, и гуишный отладчик с ним сделать сложно.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да, точно, ptrace на месте. Скомпилировалось и работает :).
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Появилась чудесная идея. Ведь указатель на стек в MSR никто не проверяет(всмысле никакой антируткит). Инструкция Sysenter выполняется на PASSIVE_LEVEL, тоесть в юзермоде. Это позволяет обработать #PF/#GP в KiDebugRoutine, ибо обработку для #PF ядро пропустит только на первых двух IRQL. Значит посылаем IPI, записываем в IA32_SYSENTER_ESP невалидный указатель. После этого в диспетчере исключений будем чекать опкод и вручную перезагружать регистры. Вот и решение (с).
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Забыл что x64, для сискала мср другие, но сути это не меняет.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не верно, вылетает на #DF, ядро не обрабатывает :dntknw:
    После загрузки указателя на ядерный стек к нему происходит обращение, тут и слетает.
     
  8. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Ну впринципе идея была хорошей, для улучшения msr перехвата, чтобы не вопили всякие антивири. Хотя это уже вторично.

    В WRK нужных каллбэков не нашел, другие нашел, сисколов не нашел, видимо не полная поддержка трейсов, тот .tmf что я смотрел - от DDK win7, видимо только в нем есть нужные каллбэки - буду дизасмить его кернел.

    Драйверов от отладчиков коотрые можно было бы заюзать тоже пока не нашел. Пробую перехват через ZwSystemDebugControl, но в x64 виндах 2008 и семерке из 32бит кода он не работает, буду пробовать из х64 кода. Но даже в случае успеха нужен саппорт в кернеле, чтобы не менять IA32(64)_SYSENTER_CS и разместить код перехватчика в кернеле а не юзере. Фактически нам нужно только чтобы кто-то rwe память выделил, дальше и ZwSystemDebugControl можно, если в x64 он не стал более умный и не выполняет больше проверок. Если найти такой саппорт в готовом драйвере, то хотябы в 32бит XP проблема уже решается.