Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› User32InitializeImmEntryTable
Посл.ответ Сообщение


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 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:
  1.        __asm
  2.                               {
  3.                                    mov esi, User32InitializeImmEntryTable
  4.                                    test esi, esi
  5.                                    jz __exit2
  6.                                    mov ecx, 0x80
  7.                                        
  8.                               __loop:
  9.                                    dec ecx
  10.                                    test ecx, ecx
  11.                                    jz __exit1
  12.  
  13.                                    lodsb
  14.                                    cmp al, 0x50
  15.                                    jnz __loop
  16.  
  17.                                    lodsb
  18.                                    cmp al, 0x68
  19.                                    jnz __loop
  20.  
  21.                                    lodsd
  22.                                    mov SharedInfo, eax
  23.                                                                 jmp __exit2
  24.  
  25.                               __exit1:
  26.                                    mov SharedInfo, ecx
  27.                                    
  28.                               __exit2:
  29.                                    sub eax, eax
  30.                                    mov eax, fs:[eax+0x18]
  31.                                    lea eax, [eax+0x06CC]
  32.                                    mov eax, [eax+0x001C]
  33.                                    mov UserDelta, eax
  34.                               }


Все начинается с функции 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.




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 24 марта 2013 07:48 · Поправил: Alchemistry
· Личное сообщение · #2

Очевидно же. Получили стартовый адрес, с какого начать поиск по сигнатуре, 0x80 это предел перебора, фактически размер этой функции. Сигнатура здесь это push eax (0x50), push (0x68), кусок от следующей конструкции:

Code:
  1. push    eax
  2. push    offset _gSharedInfo


Потом в конце идет кусок, извлечение дельты из TEB, которая будет использоваться далее в операциях валидации hwnd. В общем афтар этого кода либо не умеет писать циклы на С либо хотел попонтоваться.

Вытащить указатель можно и из UserRegisterWOWHandlers.
Вообще возьми дизасм+символы и посмотри user32.dll сам. Не факт что эти

push eax
push gSharedInfo

будут везде одинаковы.

| Сообщение посчитали полезным: plutos

Ранг: 58.0 (постоянный), 13thx
Активность: 0.020.01
Статус: Участник

Создано: 24 марта 2013 07:54
· Личное сообщение · #3

Код ищет вот этот фрагмент из функции User32InitializeImmEntryTable:

Code:
  1. .text:7D40A908 50                             push    eax
  2. .text:7D40A909 68 E0 04 47 7D                 push    offset _gSharedInfo
  3. .text:7D40A90E FF 15 90 01 47+                call    pImmRegisterClient


Обрати внимание на опкоды 50 и 68.

P.S. пользуйся тегами для кода в постах.

| Сообщение посчитали полезным: plutos


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 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.




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 24 марта 2013 08:59
· Личное сообщение · #5

plutos пишет:
Почему нужно использовать функцию со столь специфическим предназначением


Да он просто нашел первую где есть референс на структуру и которую проще обработать.

SHAREDINFO недокументированная структура win32k со всеми вытекающими последствиями.

Я так понимаю, цель здесь получить список установленных хуков.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 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
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати