正文

键盘的背后2007-11-08 12:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/30814.html

分享到:

按一个键到底发生了多少事?为什么有的驻留程序能够一下子被热键唤醒从后台弹出?听说过一些能够记录按键的软件吗,平时它不声不响躲在后台,可是你敲入的键全都被它记录在一个文件当中!这一切的原理到底是什么? 先让我们来瞧一个程序: #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)

阅读(2922) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册