64位vista,win7中KeServiceDescriptorTable问题

     最近在移植64位驱动,原本在32位驱动中使用到了KeServiceDescTable进行SSDT Hook等。但是在64位系统上是不允许进行SSDT HOOk的。在64位的XP系统上,使用到这个导出符号式没有问题的。但是在64位Vista和Win7下面,如果使用了这个符号,那么你在加载驱动的时候,返回的错误是找到不指定文件。在修这个bug真是有点吃力,只能一点点个跟进去,还好手边有WRK,要不然就完蛋了。首先说说加载驱动的过程吧,首先由应用层启动服务,之后会调用nt中的NtloadDriver,进去之后调用了IopLoadUnloadDriver(驱动卸载也是调用这个,只是参数改为FALSE),最好调用了IopLoadDriver进行。在这个函数中才是真正的加载驱动,包括加载镜像文件,检查导入表,修改重定位表等。具体的还是要看WRK的代码了。WRK虽然不是具体操作系统的原始代码,但是整个框架是有的。

    不说这个了,跟到IopLoadDriver之后,通过错误信息,还以为是镜像文件不存在导致的呢。后来发现在进行检查导入表的时候返回失败了。但是导入表中的函数实在是太多了,单步调就太痛苦了。在返回错误的时,下单点,查看当前检测的符号名,基本上确定是由KeServiceDescriptionTable导致的了。之后,专门写了专门用来检查导入表符号的小工具,真是有点累。这个工具主要的功能就是静态分析PE文件的导入表,挨个对导入表中的符号,去导入文件的导出表中去搜索。搜索的代码基本上用的是WRK中的代码。奇怪的是,在ntoskrnl.exe中有导出这个符号的。于是我在次调试分析加载过程。使用条件断点,很快确定是这个符号的文件。之后把驱动中使用到KeServiceDescriptionTable驱动。果然不出所料,驱动可以加载起来了。O(∩_∩)O哈哈~
     总结一下,这个符号虽然是有导出的,但是我们不可以使用。这个可能就是为了防止SSDT hook的时候来着吧。

你可能感兴趣的:(64位vista,win7中KeServiceDescriptorTable问题)