![]() |
eXeL@B —› Программирование —› User32InitializeImmEntryTable |
Посл.ответ | Сообщение |
|
Создано: 24 марта 2013 04:22 · Поправил: plutos · Личное сообщение · #1 Пытаюсь разобраться со структурой из win32k : typedef struct _SHAREDINFO { // W2k XP PSERVERINFO psi; // 000 PHANDLEENTRY aheList; // 004 PDISPLAYINFO pDisplayInfo; // 008 ULONG_PTR ulSharedDelta; // 00c WNDMSG awmControl[31]; // 010 010 W2k size is 27 WNDMSG DefWindowMsgs; // 0e8 108 WNDMSG DefWindowSpecMsgs; // 0f0 110 } SHAREDINFO, *PSHAREDINFO; Конечная цель - получить SharedInfo->HandleEntryList и по нему пройтись. Нашел пример того, как получить pointer *PSHAREDINFO, все работает, но не дает покоя вопрос КАК оно работает. Вот сам код: NtStatus = LdrGetProcedureAddress(ImageBase, // DllHandle &ProcedureName, // ProcedureName 0, // ProcedureNumber OPTIONAL (PVOID*)&User32InitializeImmEntryTable); // ProcedureAddress Code:
Все начинается с функции User32InitializeImmEntryTable. Она не документирована и информации о ней совсем немного. Вот что удалось найти: " it appears to be used with imm32.dll, which is apparently used to support Asian characters. You can see User32InitializeImmEntryTable is one of the User32 imports required by imm32.dll, along with a bunch of keyboard, char and unicode imports. The IME (Input Method Editor) is a driver to input double-byte (or unicode) characters specific to the Asian languages. The system provides the common interface called IMM (Input Method Manager) to control IMEs. It enables applications to give some commands to the IME or get the messages from the IME. IMM APIs are exported by IMM32.DLL in the system folder. To use IMM APIs, you should #include <imm.h> and link imm32.lib (or load IMM32.DLL dynamically)." Но эта информация скорее затемнила картину, нежели прояснила... Кто-нибудь может объяснить при чем тут User32InitializeImmEntryTable и, если возможно, прокомментировать выше приведеный asm code (кроме очевидных мест). ----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 24 марта 2013 07:48 · Поправил: Alchemistry · Личное сообщение · #2 Очевидно же. Получили стартовый адрес, с какого начать поиск по сигнатуре, 0x80 это предел перебора, фактически размер этой функции. Сигнатура здесь это push eax (0x50), push (0x68), кусок от следующей конструкции: Code:
Потом в конце идет кусок, извлечение дельты из TEB, которая будет использоваться далее в операциях валидации hwnd. В общем афтар этого кода либо не умеет писать циклы на С либо хотел попонтоваться. Вытащить указатель можно и из UserRegisterWOWHandlers. Вообще возьми дизасм+символы и посмотри user32.dll сам. Не факт что эти push eax push gSharedInfo будут везде одинаковы. ![]() |
|
Создано: 24 марта 2013 07:54 · Личное сообщение · #3 Код ищет вот этот фрагмент из функции User32InitializeImmEntryTable: Code:
Обрати внимание на опкоды 50 и 68. P.S. пользуйся тегами для кода в постах. ![]() |
|
Создано: 24 марта 2013 08:31 · Личное сообщение · #4 Alchemistry и reverser спасибо за ответы! Но в своем первом посте я написал, что прошу "прокомментировать выше приведеный asm code (кроме очевидных мест)." Меня интересует сама функция User32InitializeImmEntryTable и ее предназначение. Поэтому ее имя я и вынес в название темы. Мой вопрос, если выразить его более точно, состоит в следующем: Почему нужно использовать функцию со столь специфическим предназначением (User32InitializeImmEntryTable is one of the User32 imports required by imm32.dll used to support Asian characters), чтобы получить доступ к структурам, таким как SHAREDINFO? Допустим, я никогда не слышал о User32InitializeImmEntryTable. Каким образом получить доступ к *PSHAREDINFO? Alchemistry пишет, что "Вытащить указатель можно и из UserRegisterWOWHandlers". Это вроде бы ближе к теме, но все же если не знаешь, то никогда не догадаешься. Меня интересует системный метод, если таковой существует, а не гадание на гуще. Предусмотрел ли Microsoft какой-нибудь универсальный и интуитивный подход для работы с hook chains? PS Я прошу прощения, если в своем первом посте недостаточно ясно выразил свою мысль и недостаточно четко сформулировал свой вопрос. ----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 24 марта 2013 08:59 · Личное сообщение · #5 plutos пишет: Почему нужно использовать функцию со столь специфическим предназначением Да он просто нашел первую где есть референс на структуру и которую проще обработать. SHAREDINFO недокументированная структура win32k со всеми вытекающими последствиями. Я так понимаю, цель здесь получить список установленных хуков. ![]() |
|
Создано: 24 марта 2013 09:10 · Поправил: plutos · Личное сообщение · #6 Alchemistry Я так понимаю, цель здесь получить список установленных хуков. Ну да, я же и пишу: Предусмотрел ли Microsoft какой-нибудь универсальный и интуитивный подход для работы с hook chains? **************************************************************************************** PS Прежде чем закрыть тему хочу сказать, что все, что я наворотил выше, можно было выразить буквально в трех словах, а именно: Вопрос: Что такого особенного в функции User32InitializeImmEntryTable что именно с нее мы начинаем наш поиск? Ответ: Ничего особенного. Просто в ней содержится reference to structure, которая нас интересует. Вот и все. Я как-то со страху вообразил, что эта функция какая-то уж очень особенная и кинулся делать research прежде, чем разобрался что собственно происходит. Так что всем спасибо, что вразумили! ----- Give me a HANDLE and I will move the Earth. ![]() |
![]() |
eXeL@B —› Программирование —› User32InitializeImmEntryTable |
Эта тема закрыта. Ответы больше не принимаются. |