Введение
В азиатских языковых культурах существует большое количество символов, которые не всегда помещаются на стандартную раскладку клавиатуры. Для ввода этих символов была разработана специальная технология, которая получила название Input Manager Editor (рус. «Редакторы метода ввода»). Input Method Editor (IME) — это программа или компонент операционной системы, позволяющий пользователям вводить символы, которые физически отсутствуют на клавиатуре.
Несмотря на то, что термин «редактор метода ввода» (IME) изначально использовался только в Microsoft Windows, в настоящее время он применяется и в других операционных системах, когда важно отличить сам метод ввода от функциональности программы, обеспечивающей его, и общую поддержку методов ввода операционной системы.
Термин «метод ввода» обычно означает определенный способ ввода с клавиатуры на каком-либо языке, например Цанцзе, ввод с использованием Пиньиня или использование «мёртвых» клавиш".
Термин «редактор метода ввода» же обычно означает конкретную программу, позволяющую использовать метод ввода (например, SCIM или Microsoft IME).
Система IME по умолчанию
Если языковая культура содержит не более 100 символов, то при вводе с клавиатуры не нужно конвертировать несколько нажатых клавиш к одному символу, как это было в пишущих машинках. Для современных клавиатур данное правило актуально, например QWERTY-клавиатуры содержит 102 клавиши и несколько модификаторов. Однако, если в языке присутствует более 100 символов, то необходимо предусмотреть преобразование комбинации введенных символов перед их использовании в приложении. Такой процесс называется «коммуникационным процессом» (FEP) и IME – стандартный способ для FEP в Windows.
Стандартно, IME использует слоговую фонетическую карту ввода для выбранного языка. В обычном сценарии пользователь вводит латинские символы, которые входят в произношение определенного слога. Если IME распознает введенный слог, то он отображает пользователю список слов или фраз кандидатов, из которых пользователь может выбрать окончательный вариант. Выбранное слово затем отправляется в приложение через серию сообщений Microsoft Windows — WM_CHAR. Поскольку IME работает на уровне ниже обычного приложения (путем перехвата ввода с клавиатуры), то наличие IME прозрачно для приложения. Почти все окна приложения могут легко воспользоваться IME, не зная об его существовании и не требуя специального кодирования.
Ввод отдельного слова может происходит в два или три этапа, в зависимости от выбранной языковой системы.
Например, сценарий для японского языка:
- Пользователь вводит обозначение слогов на латинице. Например, слово «цунами» набирается как «tsunami».
- Введенные слоги на латинице автоматически заменяются на символы из хираганы или катаканы. Хирагана и катакана – слоговые азбуки, в которых каждому звуку японского языка соответствует свой иероглиф. Например, если пользователем выбрана хирагана: «Tsu» автоматически заменяется на «つ», «na» -> «な», «mi» -> «み».
- Пользователь может оставить слово записанным хираганой, а может сконвертировать в иероглиф. Конвертация в иероглифы похожа на систему ввода T9: в худшем случае пользователю предлагается список вариантов, из которых он должен выбрать один вариант. В примере с «цунами» хирагана «つなみ» превращается в иероглифы «津波». На третьем этапе можно управлять конвертацией, обычно используются клавиши «Space», «Enter», стрелки, «numpad». Например, Space конвертирует из хираганы в иероглифы, еще один Space показывает список с вариантами замены, «Enter» означает закончить конвертацию и оставить введенные символы «как есть».
На первом скриншоте показано, как пользователь вводит последовательность символов, называемая «строка композиции» (en. “Composition string”). Необходимо отметить, что последовательность из двух предлагаемых символов преобразовалось к одному символу «Ф» в блокноте.
На втором скриншоте показано, что пользователь завершил ввод слогов, и система IME предлагает выбрать подходящее слово (Пользователь нажал «space»). Пользователь может подтвердить ввод слова с помощью нажатия «Enter».
После нажатия «Enter» для подтверждения введенного слова, приложение (в примере – блокнот) получает результирующую строку в виде сообщения WM_IME_CHAR. Впоследствии, если приложение не обрабатывает это сообщение, то оно получит стандартное сообщение WM_CHAR от системы IME.
Переопределение поведения IME по умолчанию
Обычно IME использует стандартные процедуры Windows для создания окон (используется WinAPI).
Примечание: Когда приложение работает в полноэкранном режиме, как это принято, например, для игр, стандартные окна не работают и не могут отображаться поверх приложения. Чтобы решить эту проблему, приложение должно обработать IME-сообщения самостоятельно, а не полагаться на окна IME, чтобы выполнить эту задачу.
Стандартно, приложение может воспользоваться библиотекой IME напрямую, путем обработки IME-связанных сообщений и вызова менеджера метода ввода (IMM).
Когда пользователь использует IME-раскладку для ввода сложных символов, IMM отправляет в приложение сообщения, чтобы уведомить его о важных событиях, таких как запуск композиционного окна или «показывать список кандидатов слов». Приложение обычно игнорирует эти сообщения и передает их, по умолчанию, в обработчик сообщений Windows, что приводит к вызову IME-библиотеки.
На диаграмме процесса (рис. 2) показано, каким образом происходит процесс ввода текста:
- Когда IMM получает нажатые клавиши от клавиатурного драйвера, он отправляет виртуальные символы в систему IME, вызывая функцию «ImeProcessKey». Если в результате выполнения этой функции — «0», то нажатие клавиш должно быть обработано операционной системой и приложением самостоятельно. В приложение будут передаваться сообщения WM_KEYDOWN и WM_KEYUP, а затем и WM_CHAR или WM_COMMAND.
- Если же система IME возвратило результат, отличный от «0», то IMM будет передавать нажатые символы, вызывая функцию «ImeToAsciiEx» IME-библиотеки.
- Система IME возвращает «lpdwTransBuf» параметр, который содержит сообщения Windows которые необходимо передать в приложение. Система IME также принимает hIMC, в качестве параметра, где указывается «composition string». В процессе работы, система IME будет менять содержимое области памяти hIMC.
- Каждый раз, когда IMM получает «lpdwTransBuf» параметр, то проверяет, содержит ли этот буфер сообщения для приложения. Обычно в буфере содержится WM_IME_COMPOSITION сообщение, которое должно передаваться в приложение каждый раз, когда меняется строка композиции.
- Если приложение не поддерживает IME, то оно не будет обрабатывать сообщение WM_IME_COMPOSITION. Таким образом, пользователь не будет видеть введенный. В этом случае, сообщение передается соответствующему окну IME UI (которое создается системой IME при инициализации в функции «ImeInquire»), которая всегда создается, если IME активирована. Окно IME будет показывать строку композиции так, как оно введено пользователем.
- Если приложение поддерживает IME, то оно будет обрабатывать WM_IME_COMPOSITION сообщение. Если нужно получить содержимое строки композиции, приложение вызывает функцию «ImmGetCompositionString» из библиотеки «Imm32.dll». WM_IME_COMPOSITION сообщение может также уведомить приложение, что строка была сформирована.
- Если приложение получает строку композиции от IMM, то оно должно вызывать функцию DefWindowProc для сообщения WM_IME_CHAR, т.к. дальнейшая обработка может опять сгенерировать это сообщение.
- Если приложение не поддерживает IME, то оно получит WM_IME_CHAR сообщение. Если приложение поддерживает Unicode, то в параметрах будет передан Unicode-символ, если же нет, то приложение получит сообщение WM_CHAR, но оно будет знать, что необходимо преобразовать символ.
- В итоге, приложение всегда получает сообщение WM_CHAR и знает, надо ли преобразовывать символ.
Библиотека IME – это обычный DLL файл, обычно имеющий расширение «.ime». Каждая IME система должна быть зарегистрирована в Microsoft Windows в реестре: «HKEY_LOCAL_MACHINE\SYSTEM\ControlSet00X\Keyboard Layouts». Для любого приложения всегда можно получить его клавиатурный контекст.
Потенциальная угроза при использовании IME-системы
Каждая клавиатурный слой (Keyboard Layout), включая IME-системы, всегда загружаются в каждый процесс операционной системы. Обычное приложение, запущенное в пользовательской среде, не может запретить загрузку клавиатурных модулей в свое адресное пространство. Библиотека IME, как библиотека Windows, обязана экспортировать несколько функций, которые можно переопределить. Также, при загрузке библиотеки всегда вызывается функция DLLMain.
Для реализации атаки, типа Keylogger, злоумышленнику достаточно создать свою IME-систему для любой клавиатурной раскладки (Например, IME для US, UK, RU, CH, JP, KR), которая не отображает окон и осуществляет конвертацию символов. Т.е. будет незаметна для пользователя.
Как было сказано выше, IMM-менеджер всегда передает коды нажатых клавиш выбранной IME-системе, вызывая функции ImeProcessKey и ImeToAsciiEx, экспортируемые из IME-библиотеки.
Самый простой способ перехватить нажатые клавиши – это использовать функцию «ImeProcessKey», которая должна возвращать всегда «0», чтобы исключить дальнейшую обработку сообщений для заданного символа. Т.к. IME-библиотека загружается во все процессы, то пользователь не сможет заметить подозрительную активность стандартными средствами (Например, не будет отдельного процесса для IME-библиотеки).
Также если ImeProcessKey возвращает значение, отличное от нуля, то перехват клавиш можно осуществить в функции ImeToAsciiEx, но при этом необходимо осуществить преобразование скан-кода нажатой клавиши к символу в нужной кодировке, что является тривиальной операцией.
Более вредоносные действия
Подписанные (легальные) файлы IME-библиотек могут быть легко удалены с компьютера пользователя. Если IME-библиотека создана злоумышленниками, то она может быть добавлена вместо легальной библиотеки. Это может привести к следующим угрозам:
- Вредоносные IME могут изменить стандартный IME всех пользователей;
- Даже если пользователь изменяет IME по умолчанию, редакторы IME, которые уже были выбраны ранее, не будут изменены. Пользователь должен выполнить вход в ОС или перезагрузить компьютер.
- Если IME-библиотека работает в отдельном потоке, то она может продолжать работать. Пользователь не сможет завершить его стандартными средствами.
- Злоумышленники могут установить специальные права на изменения реестра, чтобы было затруднительно удалить IME-библиотеку.
- IME загружается даже в 16-разрядных приложений и приложений из командной строки.
- IME можете загрузить подсистему WinSock, для доступа в Интернет.