|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 20, 2004 14:39:02 Меня не оставляет мысль о получении информации о windows hooks. Неоднократно слышал вопросы, как получить список хуков, но не видел пока ответов. Решил попробовать сам. Сразу оговорюсь, что система Windows XP 2600 (SP0). 1. Итак, есть команда в SoftIce (2.7) OBJTAB hook С помощью неё получается информация об объектах HOOK: object|type|id|handle|owner|flags В Using SoftIce описывается методика просмотра этих данных для объекта HWND. Но она не работает применительно к HOOK. В общем, непонятны следующие поля: Object — Pointer to the object’s data Owner — CSRSS specific instance data for the process or thread that owns the object Применительно к HOOK первое поле не является указателем на память. В общем, это касательно команды SoftIce просмотра Object table. А как можно получить указатель на эту таблицу? Чувствую, нужно капать в сторону EPROCESS.ObjectTable, но как добраться до EPROCESS? 2. Хотел покопать SetWindowsHookEx, но наткнулся на sysenter. Сама по себе инструкция понятна, но: при SetWindowsHookEx индекс равен 0х1225, а в KeServiceDescriptorTable таких индексов отродясь не было. Как я понимаю, дело в том, что это "GUI-поток"? То есть надо смотреть не в KeServiceDescriptorTable, а в KeServiceDescriptorTableShadow? Хорошо, я пошёл искать эту таблицу: - посмотрел указатель на KPRCB: fs:120(ring0) или 0008:0FFDFF120h - через неё спустился на KTHREAD: KPRCB+04h - далее на ServiceTable: KTHREAD+0Eh Получил значение 80544BC0h, а KeServiceDescriptorTable указывает на 80544C00h. Итак, если я действительно попал на SERVICE_DESCRIPTOR_TABLE (теневую), то там у win32k dwServiceLimit равен 0x29A (666). А в SetWindowsHookEx индекс равен 0х1225. Главный вопрос: как добраться до обработчика (win32k!NtUserSetWindowsHookEx)? 3. Попытался поставить точку прерывания на SYSENTER_CS:SYSENTER_EIP, но ничего не вышло — на тех инструкциях SoftIce не всплывает. А можно ли прервать вполнение программы на тех инструкциях (см. снимок экрана)? 4. Вопрос общий. Мне непонятно следующее: typedef struct _KPROCESS *PKPROCESS ,*PRKPROCESS, *PEPROCESS; Как могут PKPROCESS и PEPROCESS указывать на одно и то же? Я понимаю, что это всего лишь указатели, но почему сделано такое допущение? |
|
|
Дата: Авг 20, 2004 14:42:48 снимок при просмотре MSR, ``точки входа в ядро``, KeServiceDescriptorShadow _1914046594__sysenter_eip.png |
|
|
Дата: Авг 20, 2004 14:54:29 msinfo32 (кажется, с msoffice ставится) вроде бы умела информацию о хуках показывать. еще http://www.anticracking.sk/EliCZ/export/ShowGWH.zip - show global windows hooks (Win9x only) |
|
|
Дата: Авг 20, 2004 15:12:37 ssx вроде бы умела вот именно. и DrWatson тоже показывал. Но как ты заметил, это всё Win9x only. Есть, конечно, возможность и в 2k+ посмотреть на это, но я пока не знаю, как. |
|
|
Дата: Авг 20, 2004 16:53:24 [ sensy: Применительно к HOOK первое поле не является указателем на память. ] Да нет - всё нормально. Object - Указатель на структуру хука, а Owner - указатель на EPROCESS процесса-владельца. [ sensy: Чувствую, нужно капать в сторону EPROCESS.ObjectTable, но как добраться до EPROCESS? ] Это указатель на таблицу хендлов процесса. Хуки в неё не попадают. До EPROCESS добраться элементарно. В айсе proc. KPEB - это и есть указатель на EPROCESS/KPROCESS. [ sensy: То есть надо смотреть не в KeServiceDescriptorTable, а в KeServiceDescriptorTableShadow? ] Именно. [ sensy: Главный вопрос: как добраться до обработчика (win32k!NtUserSetWindowsHookEx)? ] Всего может быть 4 сервисные таблицы. Индексы в первой таблице будут 0XXX, во второй 1XXX... Так что ты не там ищешь. Отбрось единицу, получишь 0х225. Это и есть искомый индекс, но только во второй таблице, которая для win32k.sys. Дальше берешь дамп KeServiceDescriptorTableShadow, смотришь массив адресов точек входа (по смещению 0x10) и u xxxxxxxx+225*4, где xxxxxxxx адрес массива точек входа. Или если символы установлены, то вообще просто: table win32k u NtUserSetWindowsHookExAW [ sensy: Как могут PKPROCESS и PEPROCESS указывать на одно и то же? ] Очень просто. KPROCESS вложена в EPROCESS. На smidgeonsoft.com лежит NTObjects. Она видит хуки. И небольшой анонс. В 16-ой части цикла по дровам будет HookMon. Уже установленные хуки он, конечно, не видит, так как mon, но устанавливаемые запросто :) |
|
|
Дата: Авг 20, 2004 17:25:36 · Поправил: sensy Four-F Большое спасибо за ответы! Object - Указатель на структуру хука При попытке отобразить дамп памяти под Object вижу лишь вопросительные знаки. Индексы в первой таблице будут Н-да… Как всё просто оказалось… KPROCESS вложена в EPROCESS Вот это да. Я не подумал об этом, хотя видел, что KPROCESS — первый член EPROCESS. Следовательно, отпадает вопрос, как добраться до EPROCESS. Хуки в неё не попадают А где находятся хуки? В Using softice сказано, что в USER object table. А где она? И как же всё-таки поставить точку прерывания ``на sysenter``? P.S. Прошу прощения, если спрашиваю об общеизвестных вещах — я только начал изучать теорию… |
|
|
Дата: Авг 20, 2004 18:04:32 [ sensy: При попытке отобразить дамп памяти под Object вижу лишь вопросительные знаки. ] Странно. У меня нормально отображается. [ sensy: А где находятся хуки? В Using softice сказано, что в USER object table. А где она? ] Там и находятся. А где она хз. Искать некогда. Но должно быть просто. [ sensy: И как же всё-таки поставить точку прерывания ``на sysenter``? ] Если символы установлены, то: bpm KiSystemService x Или прямо наступи по F8 на любую sysenter и попадешь на KiSystemService. |
|
|
Дата: Авг 21, 2004 01:50:53 Four-F У меня нормально отображается К сожалению, снимок экрана не могу показать - новый IceExt (0.64) не загружается. В общем, первый в списке объект hook: BC6418A0 HOOK 05 00060060 FFAF4A3800 по команде dd BC6418A0 отображаются только вопросительные знаки. Или прямо наступи по F8 Не получается - проскакиваю на данной функции. А если на других (InitUnicodeString), то хотя бы бряк срабатывает. |
|
|
Дата: Авг 21, 2004 16:15:36 Глянул под ХР. До этого смотрел под 2000. Вобщем, под ХР эти адреса контекстно зависимы. Переключись на адресное пространство процесса csrss, который всей этой байдой заведует и увидишь свои хуки :) addr csrss dd BC6418A0 NTObjects из-за этого под XP хуки тоже не видит. Насчет KiSystemService это я чуть грядки попутал. Это точка входа для обработчика int2E. Для sysenter точка входа KiFastCallEntry. Набери в айсе msr и увидишь такое: 174 00000000:00000008 IA32_SYSENTER_CS CS register for CPL 0 code 175 00000000:00000000 IA32_SYSENTER_ESP Stack pointer for CPL 0 stack 176 00000000:804D4DA0 IA32_SYSENTER_EIP CPL 0 code entry point IA32_SYSENTER_EIP - это и есть адрес KiFastCallEntry. Кстати я спокойно под ХР наступаю по F8 на sysenter и попадаю в KiFastCallEntry. Только ты браки туда осторожно ставь, а то айс как-то странно их обрабатывает. Я вот поставил, а потом почти час разбирался почему при загрузке BSOD. Оказалось сбоил айсовый видеодрайвер siwvid. Пришлось айс переставить и всё ОК. Что там с ним случилось хз. Вот ещё инфа по sysenter: http://www.anticracking.sk/EliCZ/infos/FastNTCALL.txt http://folk.uio.no/botnen/intel/vt/reference/vc311.htm |
|
|
Дата: Авг 21, 2004 16:29:20 Блин, так у тя на картинке всё это было. Т.е. про IA32_SYSENTER_EIP ты уже знаешь. Зря только распинался :) |
|
|
Дата: Авг 23, 2004 00:02:00 Доброе время суток Four-F Не зря, так как я не могу поставить туда точку прерывания. Точнее, точка ставится (bl), но не срабатывает. Далее. Что вы понимаете под F8? Просто у меня стоит F8=^p;. Правильно? И спасибо за ссылки, буду разбираться. |
|
|
Дата: Авг 23, 2004 12:14:02 [ sensy: Далее. Что вы понимаете под F8? ] Это trace. Можешь набирать команду t. [ sensy: Просто у меня стоит F8=^p;. Правильно? ] Нет, не правильно. Должно быть (в смысле по умолчанию) так: F8="^t;" F10="^p;" F8 - это trace, т.е. выполнять по одной инструкции, входить в функции и т.п. F10 - это step over, т.е. не заходить в функции, а остановиться на следующей за вызовом функции команде. Глянь ещё доку по айсу. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.100 |