· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Windows Hooks object table

Посл.отвђт Сообщен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