Добрый день. Есть такая программа Notify Routines Viewer, позволяющая просматривать нотификаторы, устанавливаемые через PsSetCreateProcessNotifyRoutine, PsSetCreateThreadNotifyRoutine итд. В первом сервис паке Виста и насколько мне известно в 2008 сервере был добавлен ещё один вид нотификаторов PsSetCreateProcessNotifyRoutineEx, поддерживающий до 64 колбеков (против стандартных 8). Собственно вопрос, никто не копал эту функцию на предмет адреса массива нотификаторов? Это я клоню к тому, чтобы расширить функционал этой маленькой утилитки добавив в него новый тип нотификаторов. Утилитка opensource так что с переделкой проблем не должно быть. Спасибо.
Это не массив, а двусвязанный список. Есть объект в системе 'CallBack', под каждую зарегистрированную процедуру выделяется память, где её параметры хранятся. Смотри в сорсах винды callback.c вроде, точно не помню.
Clerk А нафига мне эти параметры, когда мне нужен только указатель на колбек? Про двухсвязный список первый раз слышу. Возможно в Висте СП1 с PsSetProcessNotifyRoutineEx это и так, но во всех остальных случаях (да тот же экспи) получали адрес массива, читали его и декодировали каждый указатель & 0xFFFFFFFC (исключая 2000, там достаточно было просто сдампить область памяти). И все что-то замечательно работало. Что касается Висты, то там формат функции был изменен и перед чтением требовалось выполнить несколько дополнительных операций, что в итоге дает все тот же замечательный список всех нотификаторов, включая до экспи. При этом PsSetProcessNotifyRoutine и PsSetProcessNotifyRoutineEx идут в одно и то же место, собственно это и был вопрос, в чем между их реализацией разница, если кто-то это копал. Если дальше пойдет дальнейший бред про Callback объекты (что вообще не из этой оперы, достаточно запустить WinObjEx и посмотреть самому) то я если не поленюсь - закину вам рабочий код нахождения нотификаторов от 2000 до Виста СП1 под функцию PsSetProcessNotifyRoutine. Пожалуйста, конструктивные предложения.
Ты прав, насчёт объектов я с другим попутал. Посмотрел тут под дз. Все адреса можно определить анализом кода, только в Vista надо будет учитывать переход в функции PsSetCreateProcessNotifyRoutine(). Размер массивов можно опеределить из команды сравнения(проверки граничного условия), но я заметил, что переменныя XXCount находится сразу после массива процедур, отсюда можно получить размер его: Routines=(@PspCreateProcessNotifyRoutineCount - @PspCreateProcessNotifyRoutine)/4 А все три массива идут друг за другом. К сожалению у меня наверно ранняя версия ядра и нет функции PsSetCreateProcessNotifyRoutineEx(). Код (Text): #define PSP_MAX_CREATE_PROCESS_NOTIFY 8 ULONG PspCreateProcessNotifyRoutineCount; EX_CALLBACK PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY]; #define PSP_MAX_CREATE_THREAD_NOTIFY 8 ULONG PspCreateThreadNotifyRoutineCount; EX_CALLBACK PspCreateThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY]; #define PSP_MAX_LOAD_IMAGE_NOTIFY 8 ULONG PspLoadImageNotifyRoutineCount; EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY]; ;XP v5.1.2600.2180 PsSetCreateProcessNotifyRoutine: [...] mov eax,00493700 ;PspCreateProcessNotifyRoutineCount or ecx,FFFFFFFF lock xadd dword ptr ds:[eax],ecx push esi lea eax,dword ptr ds:[ebx*4+4936E0] ;PspCreateProcessNotifyRoutine call 00575B0F ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,00493700 ;PspCreateProcessNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx ;------------------------------------- PsSetCreateThreadNotifyRoutine: [...] mov esi,004936A0 ;PspCreateThreadNotifyRoutine push 0 push ebx push esi call 00575B0F ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,004936C0 ;PspCreateThreadNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx ;------------------------------------- PsSetLoadImageNotifyRoutine: [...] mov esi,00493680 ;PspLoadImageNotifyRoutineCount push 0 push ebx push esi call 00575B0F ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,00493668 ;PspLoadImageNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx ;************************************* ;Vista v6.0.6000.16386 PsSetCreateProcessNotifyRoutine: mov edi,edi push ebp mov ebp,esp pop ebp jmp 00ADD7B4 00ADD7B4: [...] mov eax,500970 ;PspCreateProcessNotifyRoutineCount or ecx,FFFFFFFF lock xadd dword ptr ds:[eax],ecx lea eax,dword ptr ds:[ebx*4+500940] ;PspCreateProcessNotifyRoutine mov ecx,esi call 00A858BB ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,500970 ;PspCreateProcessNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx ;------------------------------------- PsSetCreateThreadNotifyRoutine: [...] mov esi,4936A0 ;PspCreateThreadNotifyRoutine push 0 push ebx push esi call 00D65B0F ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,4936C0 ;PspCreateThreadNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx ;------------------------------------- PsSetLoadImageNotifyRoutine: [...] mov esi,493680 ;PspLoadImageNotifyRoutineCount push 0 push ebx push esi call 00D65B0F ;ExCompareExchangeCallBack() [...] xor ecx,ecx mov eax,493668 ;PspLoadImageNotifyRoutineCount inc ecx lock xadd dword ptr ds:[eax],ecx mov byte ptr ds:[5C52B4],1
У меня складывается стойкое ощущение, что ты не читаешь, что я пишу. Судя по всему ты не в теме. Найди в гугле исходники тулзы о которой я пишу и откроешь для себя много нового. PsSetCreateProcessNotifyRoutineEx появилась начиная с Виста СП1 и Сервер 2008. Как это работает в экспи я сам прекрасно знаю и находится этот массив следующим образом: 1) PsSetCreateProcessNotifyRoutine трассируется до опкода XP, 2k3, BF 2000, BA 2) Читается адрес, при этом не изобретается никакой велосипед с определением размера, потому что он константа = 8 * sizeof(DWORD), MSDN рулит. 3) идет декодирование указателей Все. Вопрос был - под Виста СП1 появилась новая функция, новый вид нотификатора. Запихать в дизассемблер я и сам могу, потому толку от верхнего поста - ноль, к тому же он абсолютно не по теме по листингу. Так вот дизассемблер показывает, что вызовы и новой и старой функции идут в одну и туже под функцию. При этом я твердо и уверенно читаю оттуда адрес нотификаторов для старой функции. Так вот, внимание, вопрос - если кто знает, как в ней реализована работа с новым видом нотификаторов? Просьба все-таки читать посты и если нечего сказать, то нефиг флудить.
Моя недопрограммулина приобрела известность... Будет время - гляну. Просто сейчас занят написанием статьи, которую сто лет назад обещал здесь на форуме... ADDED: Хотя нет, не гляну: Ни того, ни другого у меня нет. Есть Виста без СП.
Twister А просто это единственная программа, умеющая показывать нотификаторы. афаир. Могу кинуть бинарь ядра.
RkU даже предпочтительней. Хотя в нём эта фича появилась сразу после того, как я выложил NRV, даже кнопочки в RkU такого же размера, как мои, что наталкивает на определенные мысли... Мне бинарь не нужен, дай лучше линк на закачку sp1
http://technet.microsoft.com/en-us/windowsvista/bb738089.aspx Rootkit Unhooker 3.7 что я нашел не работает под вистой сп1.
Поддержка RkU прекратилась до выхода сп1. Скорее всего, не будет работать и четвертая версия, хотя без сервиспака и то, и то прекрасно работает... Много СП1 весит?
Я ставил с образа с интегрированным сп1, могу сказать что сп1 для 64 весит около 600 мегов и ставится почти сорок минут.