在Hook的ZwCreateFile函数中读写注册表,加载该驱动重启失败

waltsin 2009-06-05 01:29:08
我Hook了ZwCreateFile,在里面读注册表,编译出来安装后,重启系统失败,查了一些资料,是不是跟ZwCreateFile运行的kernel mode或者user mode有关啊,应该怎么修改呢?
...全文
207 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bainan 2009-07-13
  • 打赏
  • 举报
回复
确实是Start值的问题
waltsin 2009-06-19
  • 打赏
  • 举报
回复
不好意思,前几天出去了一下

我把start值改成auto后,系统启动正常,程序功能正常
估计应该是注册表没有加载,或者这种文件过滤驱动(我是说挂钩ZwCreateFile的文件过滤驱动)本身需要依赖于某个程序

注册表中GroupOrderList下好多组,我试着将驱动放到组里,但是没成功
finicswang 2009-06-09
  • 打赏
  • 举报
回复
WinDBG 单步调试一下吧,确认一下究竟哪段代码出了问题.
装个虚拟机,然后双机调试,应该还是有帮助的.

同时你的驱动启动时,"注册表还没有加载"也是非常值得怀疑的.尝试一下把你的驱动和别的驱动之间加个Dependency,让驱动晚点被加载.

"如果你的驱动程序的Start值设置为0,在初始化时大部分注册表键是没有加载的,不能访问。"
把你的Start 值设置为手动再尝试一下.
jnkandy 2009-06-09
  • 打赏
  • 举报
回复
ZwOpenKey那行出错
刚开始接触驱动,双机调试还没弄好,还没跟出来错误原因
我在弄双机调试,呵呵
cnzdgs 2009-06-08
  • 打赏
  • 举报
回复
具体是哪行代码出什么错?
waltsin 2009-06-07
  • 打赏
  • 举报
回复
以下是部分代码:
RtlInitUnicodeString(®String, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\自定义项");
RtlInitUnicodeString(&ValueName, L"自定义键");

//KeStallExecutionProcessor(3000);
//初始化OBJECT_ATTRIBUTE
InitializeObjectAttributes(&objAttrib, ®String, OBJ_CASE_INSENSITIVE, NULL, NULL);
//打开注册表
status = ZwOpenKey(&hRegister, KEY_READ, &objAttrib);
if (!NT_SUCCESS(status))
{
return ((ZWCREATEFILE)(OldZwCreateFile)) (FileHandle, DesiredAccess,
ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes,
ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
}

//获取注册表键值数据长度并申请内存
……
//获取数据
status = ZwQueryValueKey(hRegister, &ValueName, KeyValuePartialInformation, KeyValue, ValueDataLen, &ValueDataLen);
if (!NT_SUCCESS(status))
{
if (hRegister != NULL)
{
ZwClose(hRegister);
hRegister = NULL;
}
if (KeyValue != NULL)
{
ExFreePool(KeyValue);
KeyValue = NULL;
}
return ((ZWCREATEFILE)(OldZwCreateFile)) (FileHandle, DesiredAccess,
ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes,
ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
}
if (hRegister != NULL)
{
ZwClose(hRegister);
hRegister = NULL;
}
请前辈指点

今天有点晚了,前辈有时间帮忙给看看吧
先谢过了 呵呵
asideu 2009-06-07
  • 打赏
  • 举报
回复
应该是加载顺序的问题吧 你试验下 双机调试 找找自己错误的来源

或者 你直接在不能访问的时候就 返回 看看能不能卡住

鸡生蛋蛋生鸡 启动的时候最麻烦了
如果真需要的话 不要把数据放注册表里面 放系统外面 比方硬盘上 bios里
waltsin 2009-06-07
  • 打赏
  • 举报
回复
路径没有写错
我这个程序中挂钩了两个函数
一个是ZwOpenFile,一个是ZwCreateFile
在ZwOpenFile中访问注册表没有问题
但是在ZwCreateFile中访问注册表,重启的时候就死住了
如果路径不对,调试的时候也应该报错才对
cnzdgs 2009-06-07
  • 打赏
  • 举报
回复
延迟是不行的。
驱动程序自己对应的注册表键是已经加载了的,可能是路径写法不对,你试试用DriverEntry函数参数中传过来的路径来访问。
waltsin 2009-06-07
  • 打赏
  • 举报
回复
找到一个延迟的函数KeStallExecutionProcessor,呵呵
waltsin 2009-06-07
  • 打赏
  • 举报
回复
但是我读的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下我自定义的键的,在初始化的时候应该已经加载了才对啊
waltsin 2009-06-07
  • 打赏
  • 举报
回复

我刚才查了资料,有人说加个延迟
但是我不知道驱动中如何延迟
应用程序中可以使用sleep,但是驱动中呢?
也有人说用ZwLoadKey加载的,不知道哪种方式好,我想都试试
呵呵
cnzdgs 2009-06-07
  • 打赏
  • 举报
回复
我现在只用WinDbg调试,虽然不太好用,但毕竟是MS提供的,调试MS的操作系统比较可靠。
如果你的驱动程序的Start值设置为0,在初始化时大部分注册表键是没有加载的,不能访问。
waltsin 2009-06-07
  • 打赏
  • 举报
回复
我使用DriverMonitor加载驱动,可以正常运行,功能也实现了,使用Syser加载也可以正常运行,但是重启时系统死住了
后来我把访问注册表的代码都屏蔽掉,重启系统就没事了
访问注册表我使用的是ZwOpenKey、ZwQueryValueKey函数,在调用ZwOpenKey的时候就死住了
实在想不通
waltsin 2009-06-07
  • 打赏
  • 举报
回复
楼上前辈使用什么调试工具啊?
除了DriverStdio之外,前辈可否推荐一款比较好用的
cnzdgs 2009-06-05
  • 打赏
  • 举报
回复
与mode无关,调试看执行到哪里出问题。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧