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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理