游戏辅助工具开发教程-从入门到精通之A3_19篇

二 23rd, 2010 | Filed under GameCheat

作者:Figo

本篇进入输入法注入的部分。因为这种方法在很多键盘记录木马中应用不少,所以有的杀毒软件会报警,因此我的意见是:可以不用的就别用;如果会驱动就不去考虑输入法;作为最后的备选方案可以考虑。

输入法的官方称呼为:Input Method Editor(缩写IME)。从Windows2000以后,所有的安装了亚洲语言包的系统都可以使用,IME实际上通过输入法管理器(Input Method Manager:缩写IMM)的调用来实现,但并非所有的系统都支持IMM,可通过向GetSystemMetrics函数传递SM_IMMENABLED参数来检测系统是否支持IMM。IME包括2个组件:转换接口,用于导出IMM需要调用的标准接口函数,也即我们所说的*.ime文件;界面接口,用于接收消息和响应用户输入,也即我们的控制窗口。

ime文件实际就是dll文件,下面我们来看下需要导出哪些标准接口函数供IMM调用,大家最好动手自己操作一下:
1、对于Windows NT系列,进入系统目录下的system32目录,即\WINDOWS\system32,搜索*.ime文件,我的电脑搜索结果如下:
imefile
拷贝这些文件到单独的一个文件夹,我这里是新建了一个ime文件夹。下载PEditor或者找到VC自带的DUMPBIN。
2、PEditor查看标准导出函数:
搜狗拼音输入法导出函数列表如下:
sougoupy
智能ABC输入法导出函数列表如下:
winabc
2、使用DUMPBIN查看导出函数:
我这里把DUMPBIN拷贝一份到ime文件夹,然后通过命令行切换目录至ime:
cmdime
把导出函数保存在imeabc.txt中:
dumpbinabc
文本中部分内容:
imeabctxt

通过上面操作我们看到,搜狗拼音和智能ABC导出的标准接口函数数目不一致,这说明存在一个最小导出函数集,不过此处我们先看看智能ABC导出的这19个标准接口函数的意义。此处多次出现标准接口函数一词,你可以理解为和系统标准入口WinMain函数一样的事物,只不过WinMain由系统调用,IME导出的标准函数由IMM调用而已。主要接口函数如下:
1、初始化IME
BOOL ImeInquire(
LPIMEINFO lpIMEInfo,//需要初始化的IMEINFO结构体地址
LPTSTR lpszWndClass,//接收UI类的字符串地址
LPCTSTR lpszData//一般为NULL,不必关心
)
使用IDA分析智能ABC对于该函数的执行过程:
ImeInquire

2、//通过对话框来获取附加信息
BOOL ImeConfigure(
HKL hKL,//输入法句柄
HWND hWnd,//对话框的父窗口句柄
DWORD dwMode,//调用本函数的目的
LPVOID lpData//指向REGISTERWORD结构的指针
)

3、//格式控制字符(format effective character)转换函数
DWORD IMEConversionList(
HIMC hIMC,//输入法上下文句柄
LPCTSTRlpSrc,//要转换的字符
LPCANDIDATELIST lpDst,//接收转换后字符的地址
DWORD dwBufLen,//lpDst长度,以byte为计数单位
UINT uFlag//指定lpSource和lpDest的具体用途
//uFlag可为GCL_CONVERSION、GCL_REVERSECONVERSION或GCL_REVERSE_LENGTH
)

4、//关闭当前IME
BOOL ImeDestroy(
UINT uReserved//系统保留,必须为0
)

5、//运行应用程序获取其他IMM函数未能提供的信息
//主要用于国家/地区相关的函数或者IME内部函数
//执行成功返回非0结果
LRESULT ImeEscape(
HIMC hIMC,//输入法上下文句柄
UINT uEscape,//指定要获取的信息类别
LPVOID lpData//存储uEscape制定信息的地址
)

6、//当前输入法被激活或将失效
BOOL ImeSetActiveContext(
HIMC hIMC,//输入法上下文句柄
BOOL fFlag//TRUE:被激活;FALSE:将失效
)

7、//处理IMM传递进来的击键消息
BOOL ImeProcessKey(
HIMC hIMC,//输入法上下文句柄
UINT uVirKey,//待处理的虚拟键码
DWORD lParam,//击键消息中的lParam,即消息回调过程中的lParam
CONST LPBYTE lpbKeyState//指向一个包含当前键盘状态的256字节长的数组
)

8、//用于当前输入法被激活或将失效时执行初始化或清理工作
BOOL ImeSelect(
HIMC hIMC,//输入法上下文句柄
BOOL fSelect//TRUE:被激活;FALSE:将失效[释放资源]
)

9、//设置字符编码,同时发送WM_IME_COMPOSITION给应用程序
BOOL WINAPI ImeSetCompositionString(
HIMC hIMC,//输入法上下文句柄
DWORD dwIndex,
LPCVOID lpComp,
DWORD dwCompLen,
LPCVOID lpRead,
DWORD dwReadLen
);

10、//使用IME转换引擎把输入的虚拟键转换为指定编码字符
//执行成功返回转换的击键消息数目
UINT ImeToAsciiEx(
UINT uVirKey,//待转换的虚拟键
UINT uScanCode,//扫描码
CONST LPBYTE lpbKeyState,//指向一个包含当前键盘状态的256字节长的数组
LPDWORD lpdwTransBuf,//接收转换后结果的地址
UINT fuState,//活动菜单标志
HIMC hIMC//输入法上下文句柄
)

11、//向当前输入法添加用户字典字符
BOOL WINAPI ImeRegisterWord(
LPCTSTR lpszReading,//待添加的字符
DWORD dwStyle,//新字符的类型
LPCTSTR lpszString//待添加字符的编码串
)

12、//从当前输入法移除用户字典字符
BOOL WINAPI ImeUnregisterWord(
LPCTSTR lpszReading,//待添加的字符
DWORD dwStyle,//新字符的类型
LPCTSTR lpszString//待添加字符的编码串
)

13、//获取当前IME支持的类型
//返回lpStyleBuf实际获取类型数目
UINT WINAPI ImeGetRegisterWordStyle(
UINT nItem,//lpStyleBuf最大可以承载的类型数目
LPSTYLEBUF lpStyleBuf//STYLEBUF结构地址
)

14、//枚举所有符合入口参数指定特征的字典字符串
UINT WINAPI ImeEnumRegisterWord(
HKL hKL,//输入法句柄
REGISTERWORDENUMPROC lpfnEnumProc,//枚举回调函数
LPCTSTR lpReading,//指定字符,如果为NULL枚举所有
DWORD dwStyle,//指定类型,如果为NULL枚举所有
LPCTSTR lpszString,//指定编码,如果为NULL枚举所有
LPVOID lpData//应用程序请求数据
)

15、//根据入口参数改变IME状态
//可在此处响应应用程序请求
BOOL NotifyIME(
HIMC hIMC,//输入法上下文句柄
DWORD dwAction,//请求类型
DWORD dwIndex,//关联dwAction
DWORD dwValue //关联dwAction
)

至此编写ime调用模块的函数介绍完毕,因为我们是要借壳上市,所以不必关心这些函数如何处理,只需研究下在哪个函数中载入我们辅助工具的dll即可。指导方向就是,初始化和我们的输入法壳将要被切换时载入,因此可选的位置有以下几个:
1、DllMain中DLL_PROCESS_ATTACH处;
2、ImeSelect被调用时;
3、ImeDestroy被调用时;
4、ImeInquire被调用时。

实际的情况是,我们一般在DllMainImeSelect中载入dll,ImeDestroy中释放dll。我们看下无极辅助中输入法注入模块导出函数:
我是在虚拟机里执行的程序,需要查看无极ime模块的可以点击下载
wujiime
无极的ime模块用VMProtect加壳了,下面是导出函数,可以看到多出ImeClass_RegisterImeClass_Unregister函数,其实没有必要导出这2个函数的,又不是标准函数,只是自定义的输入法UI窗口类的注册和销毁函数,内部使用即可。
wujiexports

这次先讲到这里,下篇尽快放出。

转载请注明出处:http://www.figoyao.com/blog/2010/02/23/1074/

  1. simple
    二 28th, 201021:24

    问下figo老师,这个输入法注入在外挂方面有哪些应用?我觉得哪里需要用上的,而且你的讲解里说到它还会被杀软报毒,望讲解!

  2. simple
    二 28th, 201021:25

    打错字了,我没觉得哪里需要用到的。

  3. dormancy
    四 23rd, 201023:09

    老师什么时候能出输入法注入完整滴源码哇???
    教程讲解对我这样滴新手就感觉有些宏观啦。。。
    能教下具体实现滴方法吗?
    期待ing。。。

  4. Figo
    四 24th, 201007:22

    @dormancy
    完整的注入源码是不会放出了,我已经把输入法所需的必要知识都提供了,并且提供了一份可编译的输入法源码,注入部分未提供,但是教程中已经把原理讲解了。这样做的目的是稍微增加下某些做木马的人的难度,望理解。