|
其实这种方法并没有什么神秘之处,它的关键是:PECMD可以调用动态链接库DLL中的API函数。
不信你可以在命令提示符下键入以下命令:
pecmd call $user32,MessageBoxW,#0,Hello world!,hello,#64
你可以得到一个和pecmd mess效果完全相同的消息框。
所以只要合理使用PECM的call $命令,就可以直接调用系统API完全一些任务。需要注意的是API函数名称必须正确,你必须按系统文档MSDN中指出的那样写函数名,如MessageBox写成messagebox就不行;第二是必须在函数名后加一个大写的W,因为系统的API有两套,一套使用ANSI字符集,以A为后缀,另一套使用UNICODE字符集,以W为后缀,PECMD本身是用UNICODE字符集写成的,它调用API时传递的也是UNICODE字符串,所以必须用带W的函数。最后是函数的参数,在PECMD中显然只能传递字符串和整数给系统API,而且字符串只能是UNICODE字符串,整数必须在其前面加一个“#”前缀(这样PECMD才认为它是一个整数,而不是一个UNICODE字符串)。
我们知道Rundll32这个系统自带的EXE也可以调用一些API,如可用它打开一些控制面板中的选项,但是由于我们对它缺乏资料,所以用起来并不好使,甚至上面的简单消息框能不能打开都成问题(有时能成功,有时不成功,有时虽然能打开一个消息但文字是乱码),而PECMD则不成问题,因为我们能看到它的源代码,知道它是怎样实现的。
说到怎样发现这种安装输入法的方法,也是很偶然的。最初我是想自己写一个小程序,以便能将输入法安到外置程序包,因为InstallIME只能安装支持文件位于System32目录的输入法。于是我用记事本打开InstallIME.exe这个文件,希望能发现它调用了API函数,但遗憾的是它是加过密的,看不出来。后来通过在网上搜索,得知可以使用ImmInstallIME函数,于是用C语言写程序,发现确实能安装输入法。后转而一想反正都是调用API函数,PECMD也可以为什么不用PECMD呢,于是就有了这种方法。但我不得不告诉大家,这种方法还是不能将输入法安到外置程序包,所以如果你想这么干就不要白费力气。如果你真想这么干,我还是建你使用极点五笔等输入,这些输入法很优秀,也可以安到外置程序包中。
最后指出一点,传统输入法“词语联想”、“逐渐提示”等选项信息是存在注册表中,通过用Regshot跟踪,我发现它们位于“HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔”(最后一的“极品五笔”是你调用ImmInstallIME函数时传递的第二个参数)。事实上我的PE是这样配置输入法的:
FILE jpwb.*=>%SystemRoot%\System32
FILE winabc.*=>%SystemRoot%\System32
CALL $imm32,ImmInstallIMEW,%SystemRoot%\System32\jpwb.ime,极品五笔
CALL $imm32,ImmInstallIMEW,%SystemRoot%\System32\winabc.ime,智能ABC
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\FC aid=#1
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\FC input=#1
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\GB/GBK=#0
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\词语联想=#0
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\词语输入=#1
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\光标跟随=#1
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\外码提示=#1
REGI HKCU\Software\Microsoft\Windows\CurrentVersion\极品五笔\逐渐提示=#1
LINK %Programs%\启动\输入法指示器,internat.exe
外置程序包中具有的文件为:internat.exe、jpwb.ime、jpwb.mb、winabc.cwd、winabc.ime、winabc.ovl,外加一个PECMD配置文件,其内容如上。
[ 本帖最后由 shoulea 于 2009-11-24 19:22 编辑 ] |
|