前一段时间参加了学校的网络安全竞赛。其中有一道题目是“拦截注册表”,使用SSDT HOOK ZwSetKeyValue函数。在自己的ZwSetKeyValue函数中,需要对传递进来的注册表路径与设定好的注册表路径进行匹配(ANSII 比较),如果一样,则被拦截。否则,则放行。
虽然在Windows内核中并不推荐使用C语言的字符串操作的库函数,但又没有其他好的办法的时候仍然需要使用。我在程序中使用了strcpy()与strcmp()函数。可以成功生成驱动,但加载之后,系统会蓝屏。开始始终搞不清楚,多次尝试之后,发现取消DriverEntry开头的#define INITCODE code_seg("INIT")即可。具体的原因到现在依然不太清楚,后来百度了一下,在pediy论坛上发现了别人也在进行这个问题的讨论。链接是:
http://bbs.pediy.com/showthread.php?p=808708
两条可能有用的回复摘下来:
2.呵呵,我早就遇到过了,原因好像是字符串放在INIT节中,卸载时却被换出内存了。不过现在好像无法重现了。
4.的确是这样,要把CreateDevice函数的#pragma INITCODE改为#pragma PAGEDCODE,我问过作者,也没有给明确的答复。
如果有遇到类似情况的并且知道原因的,希望可以告诉我。谢谢。
作者:Chenny Chen
出处:http://www.cnblogs.com/XjChenny/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。