|
按一个键到底发生了多少事?为什么有的驻留程序能够一下子被热键唤醒从后台弹出?听说过一些能够记录按键的软件吗,平时它不声不响躲在后台,可是你敲入的键全都被它记录在一个文件当中!这一切的原理到底是什么?
先让我们来瞧一个程序:
#include <dos .h >
#include <bios .h >
#include <stdio .h >
void interrupt (*old9)();
void interrupt (*old60)();
void interrupt (*old61)();
void interrupt (*old78)();
void interrupt (*new61)();
void interrupt new9()
{(*old9)();/*调用原09H 中断*/
sound(2227);
delay(100);
nosound();}
void interrupt new60()/*恢复原向量,由卸载程序使用
*/
{setvect(0x9,old9);
setvect(0x60,old60);
setvect(0x61,old61);
setvect(0x78,old78);}
void interrupt new78()
{/*空函数,起防止多次驻留用*/}
void main(void)
{old61=getvect(0x61);/*保存原0x61中断向量*/
old78=getvect(0x78);/*保存原0x78中断向量*/
old60=getvect(0x60);/*保存原0x60中断向量*/
old9=getvect(0x9);/*保存原0x9中断向量*/
if(old78!=0)
{printf("程序已经驻留在内存!");
return ;}
new61=_psp ;/*设置new61中断地址为程序
段前缀,供卸载程序使用*/
setvect(0x61,new61);
/*设置新0x61中断向量*/
setvect(0x9,new9);/*设置新0x9中断向量*/
setvect(0x60,new60);/*设置新0x60中断向量*/
setvect(0x78,new78);/*设置新0x78中断向量*/
printf("已完成驻留!");
keep(0,900);/*驻留内存,如果发生死机,可
将900适当增大即可*/}
将此程序用TC2.0编译后运行,你会发现你敲入一个键,计算机除了能够正常处理外,还将会伴有响声,原来敲键被监视了!原来每次按下或释放键盘时都会触发INT09H
中断,并由这个中断处理所敲的键。但上述程序中这个中断处理居然被new9()新中断函数代替了,但它为了能够处理原来的敲键,完成它自己所要干的事后又去调用原来的中断函数,使这一切看起来天衣无缝。注意在这里是驻留内存而不是退出(否则将会失去监视的资格),使用keep()函数即可。但是我们要防止程序多次驻留,所以在程序中设置了另外一个没被系统使用中断向量标志0x78,即new78()函数。在第二次程序驻留时,检查该标志即可。只要你重新改写本程序中new9()函数,你可以自己编写一些有用的小程序,如编写一个暗中驻留内存,将所有的敲键记录在一个文件中;也可以编写自己的驻留式英语词典程序,监视按键如果是热键就激活。
有来必有去,如何卸载此TSR 程序?首先要还原中断向量和释放该程序所占的内存,包括环境变量块所占内存。我们设置新60H
中断来恢复所有被改设的中断向量,参看程序中的new60()函数,此函数可在任何程序中由INT0x60来调用。而卸载程序使用新61H中断来获得驻留程序的PSP
段地址,从而来释放程序所占的内存,而再由PSP 值得到环境变量区段地址值(PSP 的2CH、2DH 指向该值)来释放环境变量内存。(程序略)
(浙江省瑞安市场桥电信局陈宏宇325205)
|