Notify Routines Viewer

Тема в разделе "WASM.NT.KERNEL", создана пользователем soveren, 6 мар 2008.

  1. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Добрый день.

    Есть такая программа Notify Routines Viewer, позволяющая просматривать нотификаторы, устанавливаемые через PsSetCreateProcessNotifyRoutine, PsSetCreateThreadNotifyRoutine итд.

    В первом сервис паке Виста и насколько мне известно в 2008 сервере был добавлен ещё один вид нотификаторов PsSetCreateProcessNotifyRoutineEx, поддерживающий до 64 колбеков (против стандартных 8).

    Собственно вопрос, никто не копал эту функцию на предмет адреса массива нотификаторов?

    Это я клоню к тому, чтобы расширить функционал этой маленькой утилитки добавив в него новый тип нотификаторов. Утилитка opensource так что с переделкой проблем не должно быть.

    Спасибо.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это не массив, а двусвязанный список. Есть объект в системе 'CallBack', под каждую зарегистрированную процедуру выделяется память, где её параметры хранятся. Смотри в сорсах винды callback.c вроде, точно не помню.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это начиная с wxp afair
     
  4. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Clerk

    А нафига мне эти параметры, когда мне нужен только указатель на колбек? Про двухсвязный список первый раз слышу. Возможно в Висте СП1 с PsSetProcessNotifyRoutineEx это и так, но во всех остальных случаях (да тот же экспи) получали адрес массива, читали его и декодировали каждый указатель & 0xFFFFFFFC (исключая 2000, там достаточно было просто сдампить область памяти). И все что-то замечательно работало. Что касается Висты, то там формат функции был изменен и перед чтением требовалось выполнить несколько дополнительных операций, что в итоге дает все тот же замечательный список всех нотификаторов, включая до экспи. При этом PsSetProcessNotifyRoutine и PsSetProcessNotifyRoutineEx идут в одно и то же место, собственно это и был вопрос, в чем между их реализацией разница, если кто-то это копал.

    Если дальше пойдет дальнейший бред про Callback объекты (что вообще не из этой оперы, достаточно запустить WinObjEx и посмотреть самому) то я если не поленюсь - закину вам рабочий код нахождения нотификаторов от 2000 до Виста СП1 под функцию PsSetProcessNotifyRoutine. Пожалуйста, конструктивные предложения.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ты прав, насчёт объектов я с другим попутал. Посмотрел тут под дз.
    Все адреса можно определить анализом кода, только в Vista надо будет учитывать переход в функции PsSetCreateProcessNotifyRoutine().
    Размер массивов можно опеределить из команды сравнения(проверки граничного условия), но я заметил, что переменныя XXCount находится сразу после
    массива процедур, отсюда можно получить размер его:
    Routines=(@PspCreateProcessNotifyRoutineCount - @PspCreateProcessNotifyRoutine)/4
    А все три массива идут друг за другом. К сожалению у меня наверно ранняя версия ядра и нет функции PsSetCreateProcessNotifyRoutineEx().
    Код (Text):
    1. #define PSP_MAX_CREATE_PROCESS_NOTIFY 8
    2. ULONG PspCreateProcessNotifyRoutineCount;
    3. EX_CALLBACK PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
    4.  
    5. #define PSP_MAX_CREATE_THREAD_NOTIFY 8
    6. ULONG PspCreateThreadNotifyRoutineCount;
    7. EX_CALLBACK PspCreateThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
    8.  
    9. #define PSP_MAX_LOAD_IMAGE_NOTIFY 8
    10. ULONG PspLoadImageNotifyRoutineCount;
    11. EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
    12.  
    13. ;XP v5.1.2600.2180
    14. PsSetCreateProcessNotifyRoutine:
    15.     [...]
    16.     mov eax,00493700    ;PspCreateProcessNotifyRoutineCount
    17.     or ecx,FFFFFFFF
    18.     lock xadd dword ptr ds:[eax],ecx
    19.     push esi
    20.     lea eax,dword ptr ds:[ebx*4+4936E0] ;PspCreateProcessNotifyRoutine
    21.     call 00575B0F   ;ExCompareExchangeCallBack()
    22.     [...]
    23.     xor ecx,ecx
    24.     mov eax,00493700    ;PspCreateProcessNotifyRoutineCount
    25.     inc ecx
    26.     lock xadd dword ptr ds:[eax],ecx
    27. ;-------------------------------------
    28. PsSetCreateThreadNotifyRoutine:
    29.     [...]
    30.     mov esi,004936A0    ;PspCreateThreadNotifyRoutine
    31.     push 0
    32.     push ebx
    33.     push esi
    34.     call 00575B0F   ;ExCompareExchangeCallBack()
    35.     [...]
    36.     xor ecx,ecx
    37.     mov eax,004936C0    ;PspCreateThreadNotifyRoutineCount
    38.     inc ecx
    39.     lock xadd dword ptr ds:[eax],ecx
    40. ;-------------------------------------
    41. PsSetLoadImageNotifyRoutine:
    42. [...]
    43.     mov esi,00493680    ;PspLoadImageNotifyRoutineCount
    44.     push 0
    45.     push ebx
    46.     push esi
    47.     call 00575B0F   ;ExCompareExchangeCallBack()
    48.     [...]
    49.     xor ecx,ecx
    50.     mov eax,00493668    ;PspLoadImageNotifyRoutineCount
    51.     inc ecx
    52.     lock xadd dword ptr ds:[eax],ecx
    53. ;*************************************
    54. ;Vista v6.0.6000.16386
    55. PsSetCreateProcessNotifyRoutine:
    56.     mov edi,edi
    57.     push ebp
    58.     mov ebp,esp
    59.     pop ebp
    60.     jmp 00ADD7B4
    61. 00ADD7B4:
    62.     [...]
    63.     mov eax,500970  ;PspCreateProcessNotifyRoutineCount
    64.     or ecx,FFFFFFFF
    65.     lock xadd dword ptr ds:[eax],ecx
    66.     lea eax,dword ptr ds:[ebx*4+500940] ;PspCreateProcessNotifyRoutine
    67.     mov ecx,esi
    68.     call 00A858BB   ;ExCompareExchangeCallBack()
    69.     [...]
    70.     xor ecx,ecx
    71.     mov eax,500970  ;PspCreateProcessNotifyRoutineCount
    72.     inc ecx
    73.     lock xadd dword ptr ds:[eax],ecx
    74. ;-------------------------------------
    75. PsSetCreateThreadNotifyRoutine:
    76.     [...]
    77.     mov esi,4936A0  ;PspCreateThreadNotifyRoutine
    78.     push 0
    79.     push ebx
    80.     push esi
    81.     call 00D65B0F   ;ExCompareExchangeCallBack()
    82.     [...]
    83.     xor ecx,ecx
    84.     mov eax,4936C0  ;PspCreateThreadNotifyRoutineCount
    85.     inc ecx
    86.     lock xadd dword ptr ds:[eax],ecx
    87. ;-------------------------------------
    88. PsSetLoadImageNotifyRoutine:
    89.     [...]
    90.     mov esi,493680  ;PspLoadImageNotifyRoutineCount
    91.     push 0
    92.     push ebx
    93.     push esi
    94.     call 00D65B0F   ;ExCompareExchangeCallBack()
    95.     [...]
    96.     xor ecx,ecx
    97.     mov eax,493668  ;PspLoadImageNotifyRoutineCount
    98.     inc ecx
    99.     lock xadd dword ptr ds:[eax],ecx
    100.     mov byte ptr ds:[5C52B4],1
     
  6. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    У меня складывается стойкое ощущение, что ты не читаешь, что я пишу.

    Судя по всему ты не в теме. Найди в гугле исходники тулзы о которой я пишу и откроешь для себя много нового.

    PsSetCreateProcessNotifyRoutineEx появилась начиная с Виста СП1 и Сервер 2008.
    Как это работает в экспи я сам прекрасно знаю и находится этот массив следующим образом:


    1) PsSetCreateProcessNotifyRoutine трассируется до опкода

    XP, 2k3, BF

    2000, BA

    2) Читается адрес, при этом не изобретается никакой велосипед с определением размера, потому что он константа = 8 * sizeof(DWORD), MSDN рулит.

    3) идет декодирование указателей

    Все.

    Вопрос был - под Виста СП1 появилась новая функция, новый вид нотификатора.

    Запихать в дизассемблер я и сам могу, потому толку от верхнего поста - ноль, к тому же он абсолютно не по теме по листингу.

    Так вот дизассемблер показывает, что вызовы и новой и старой функции идут в одну и туже под функцию. При этом я твердо и уверенно читаю оттуда адрес нотификаторов для старой функции. Так вот, внимание, вопрос - если кто знает, как в ней реализована работа с новым видом нотификаторов? Просьба все-таки читать посты и если нечего сказать, то нефиг флудить.
     
  7. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Моя недопрограммулина приобрела известность... ;)

    Будет время - гляну. Просто сейчас занят написанием статьи, которую сто лет назад обещал здесь на форуме...

    ADDED: Хотя нет, не гляну:
    Ни того, ни другого у меня нет. Есть Виста без СП.
     
  8. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Twister

    А просто это единственная программа, умеющая показывать нотификаторы. афаир.

    Могу кинуть бинарь ядра.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    rku
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    RkU даже предпочтительней. :)
    Хотя в нём эта фича появилась сразу после того, как я выложил NRV, даже кнопочки в RkU такого же размера, как мои, что наталкивает на определенные мысли...

    Мне бинарь не нужен, дай лучше линк на закачку sp1 :derisive:
     
  11. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    http://technet.microsoft.com/en-us/windowsvista/bb738089.aspx

    Rootkit Unhooker 3.7 что я нашел не работает под вистой сп1.
     
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Поддержка RkU прекратилась до выхода сп1. Скорее всего, не будет работать и четвертая версия, хотя без сервиспака и то, и то прекрасно работает...

    Много СП1 весит?
     
  13. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Я ставил с образа с интегрированным сп1, могу сказать что сп1 для 64 весит около 600 мегов и ставится почти сорок минут.