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