DLL注入技術(輸入法注入)


輸入法注入原理

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。

參考:https://blog.csdn.net/swanabin/article/details/21473045


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM