輸入法注入原理
IME輸入法實際就是一個dll文件(后綴為ime),此dll文件需要導出必要的接口供系統加載輸入法時調用。我們可以在此ime文件的DllMain函數的入口通過調用LoadLibrary函數來加載需要注入的dll。
輸入法注入實現
ime文件需要導出必要的接口函數。
ImeConversionList //將字符串/字符轉換成目標字符串/字符
ImeConfigure //設置ime參數
ImeDestroy //退出當前使用的IME
ImeEscape //應用軟件訪問輸入法的接口函數
ImeInquire //啟動並初始化當前ime輸入法
ImeProcessKey //ime輸入鍵盤事件管理函數
ImeSelect //啟動當前的ime輸入法
ImeSetActiveContext //設置當前的輸入處於活動狀態
ImeSetCompositionString //由應用程序設置輸入法編碼
ImeToAsciiEx //將輸入的鍵盤事件轉換為漢字編碼事件
NotifyIME //ime事件管理函數
ImeRegisterWord //向輸入法字典注冊字符串
ImeUnregisterWord //刪除被注冊的字符串
ImeGetRegisterWordStyle
ImeEnumRegisterWord
其中最重要的就是ImeInquire函數,當切換到此ime輸入法時此函數就會被調用啟動並初始化此ime輸入法。
參數lpIMEInfo用於輸入對Ime輸入法初始化的內容結構,參數lpszUIClass為輸入法的窗口類。lpszUIClass對應的窗口類必須已注冊,我們應該在ime的DllMain入口處注冊此窗口類。
BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption)
我們通過調用ImmInstallIME來加載輸入法,函數的兩個參數分別為輸入法IME文件的文件名和在控制面板的是輸入法選項中顯示的輸入法名稱。
HKL ImmInstallIME(LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);
當我們調用ImmInstallIME函數后只是將此ime輸入法加載了而已,但是當進程沒有切換到此輸入法前,其DllMain函數都不會被調用輸入法未被激活。我們可以通過手動切換,也可以通過向應用程序發送WM_INPUTLANGCHANGEREQUEST消息來切換。
其次我們可以調用SystemParametersinfo將此IME輸入法設為默認輸入法,這樣新進程創建時就會默認使用並激活此輸入法。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni)
當uiAction的值為SPI_SETDEFAULTINPUTLANG,其會將pvParam指向的輸入法作為默認輸入法。
這樣每次有進程創建就會默認將此ime文件加載並調用入口點函數,從而進一步在入口點注入我們的dll。