ZwSetSystemInformation比较特殊,用了那段经典的加载方法,会发现老是加载不成功,到底成不成呢?
我用VMWARE+WinDbg测试了,lm,发现服务列表里面是有了的,但是dbgview没有输出。
在这里(http://hi.baidu.com/hypkb/blog/item/fe58b7830b377498f603a6f4.html)找到这样一段话:
起初是在<Rootkit:Subverting the Windows Kernel>那本书上面看到的,可惜怎么试都是失败,本身很简单就调调API的问题,再后来看到这篇:
用SystemLoadAndCallImage加载Rootkit
其中有这么一句话
typedef unsigned long NTSTATUS; //我认为这里应该是typedef long NTSTATUS,
//否则一个unsigned的值总是不小于0,下面这个宏就会
//出问题
实际上我后来才知道Greg Hoglund为什么会犯下这个"错误",因为哇卡卡大牛说他成功了, 我才知道即使ZwSetSystemInformation成功的话他还是会返回一个小于零的值,这就是为什么,Greg Hoglund要使用unsigned的原因吧.
ZwSetSystemInformation(
SystemLoadAndCallImage
,&GregsImage
,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE));
用SystemLoadAndCallImage加载Rootkit
其中有这么一句话
typedef unsigned long NTSTATUS; //我认为这里应该是typedef long NTSTATUS,
//否则一个unsigned的值总是不小于0,下面这个宏就会
//出问题
实际上我后来才知道Greg Hoglund为什么会犯下这个"错误",因为哇卡卡大牛说他成功了, 我才知道即使ZwSetSystemInformation成功的话他还是会返回一个小于零的值,这就是为什么,Greg Hoglund要使用unsigned的原因吧.
ZwSetSystemInformation(
SystemLoadAndCallImage
,&GregsImage
,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE));
我的Driver是用VirtualDDK生成的标准驱动d.sys,和寒江独钓的first例子,只加了dbgprint一些信息。每次测试,基本上重装虚拟机。
下面是测试:
1、直接从系统安装,要Inf的,工作正常。不过有时候dbgview会脑残不显示。设备管理器里有。
2、用SRVINSTW.EXE安装,工作正常。设备管理器里有。
3、用ZwSetSystemInformation,加载first.sys,提示成功了!dbgview显示OK(要等一会)。net start first 提示没有服务!winobj看也没有显示。(不确定看漏没有)。windbg lm有。
加载d.sys,提示不成功了!设备管理器里没有。windbg lm有。
反正dbgview是没有输出了,到底运行了没有呢?为什么first.sys有输出,d.sys没有呢?
找了许久,似乎在这里找到了http://forum.driverdevelop.com/read.php?tid=102399
貌似“ZwSetSystemInformation加载的有些问题比如不能建device等等",是否?
请大牛指点一二。
更新:用WinDBG单步跟踪了一些,分别在DriverEntry和DriverUnload设断点,跟踪发现,first.sys能完整运行DriverEntry和DriverUnload,但是d.sys在DeviceObject的设置完成后,一到下一句的dbgprint要输出时,就报错了。运行不到尾部的 return STATUS_SUCCESS;估计是不能创造DeviceObject了。