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

原文地址:https://www.cnblogs.com/revercc/p/14683828.html