找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 207|回复: 0

【驱动笔记16】读取文件和注册表句柄信息

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-16 23:36:30 | 显示全部楼层 |阅读模式
[bgcolor=#ffffff]在编写驱动进行HOOK的时候,我们经常会需要从某参数获取相关信息,最常见的就是从进程、文件、注册表句柄中获取相关路径以进行相关保护。其中关于从进程句柄获取信息的方法我已经在[/bgcolor]《SSDT HOOK实现进程保护》[bgcolor=#ffffff]一文中给出了方法,今天我们就给出文件和注册表句柄的处理方法。[/bgcolor]
[bgcolor=#ffffff]      下面首先看通过HOOK ZwSetInformationFile保护文件防删除的方法,这个函数的第一个参数FileHandle给定了文件路径,但是我们该怎么获取这个路径呢?核心函数在于ObReferenceObjectByHandle,下面是示例代码:[/bgcolor]

[bgcolor=#ffffff]PFILE_OBJECT        pFileObject;[/bgcolor]
[bgcolor=#ffffff]UNICODE_STRING      DosName;[/bgcolor]
[bgcolor=#ffffff]UNICODE_STRING      uniFileName;[/bgcolor]
[bgcolor=#ffffff]ANSI_STRING         aniFileName;[/bgcolor]

[bgcolor=#ffffff]ObReferenceObjectByHandle(FileHandle, [/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff], KernelMode, [/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]pFileObject, [/bgcolor][bgcolor=#ffffff]NULL[/bgcolor][bgcolor=#ffffff]);[/bgcolor]
[bgcolor=#ffffff]IoVolumeDeviceToDosName(pFileObject[/bgcolor][bgcolor=#ffffff]->[/bgcolor][bgcolor=#ffffff]DeviceObject, [/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]DosName);[/bgcolor]

[bgcolor=#ffffff]KdPrint(([/bgcolor][bgcolor=#fff0f0]"[nokyo] %s%s"[/bgcolor][bgcolor=#ffffff], DosName.Buffer, pFileObject[/bgcolor][bgcolor=#ffffff]->[/bgcolor][bgcolor=#ffffff]FileName.Buffer));[/bgcolor]

[bgcolor=#ffffff]ExFreePool(DosName.Buffer);[/bgcolor]
[bgcolor=#ffffff]ObDereferenceObject(pFileObject);[/bgcolor]

[bgcolor=#ffffff]      上述代码是我从自己的程序中抽出来的,没有亲自测试可靠性,还望各位读者在使用前能先测试一下,ring0的程序可不是闹着玩的。[/bgcolor]
[bgcolor=#ffffff]下面我们再来看HOOK ZwDeleteValueKey防止删除注册表键的方法:[/bgcolor]

[bgcolor=#ffffff]PVOID              pKey;[/bgcolor]
[bgcolor=#ffffff]PUNICODE_STRING    pUniName;[/bgcolor]
[bgcolor=#ffffff]UNICODE_STRING     ustrReg;[/bgcolor]

[bgcolor=#ffffff]ObReferenceObjectByHandle(KeyHandle, [/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff], KernelMode, [/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]pKey, [/bgcolor][bgcolor=#ffffff]NULL[/bgcolor][bgcolor=#ffffff]);[/bgcolor]
[bgcolor=#ffffff]pUniName [/bgcolor][bgcolor=#ffffff]=[/bgcolor][bgcolor=#ffffff] ExAllocatePool(NonPagedPool, [/bgcolor][bgcolor=#ffffff]1024[/bgcolor][bgcolor=#ffffff]);[/bgcolor]
[bgcolor=#ffffff]ObQueryNameString(pKey, pUniName, [/bgcolor][bgcolor=#ffffff]1024[/bgcolor][bgcolor=#ffffff], [/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]nRet);[/bgcolor]
[bgcolor=#ffffff]    [/bgcolor]
[bgcolor=#ffffff]RtlInitUnicodeString([/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]ustrReg, [/bgcolor][bgcolor=#fff0f0]L"[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]REGISTRY[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]MACHINE[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]SOFTWARE[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]Microsoft[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]Windows[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]CurrentVersion[/bgcolor][bgcolor=#fff0f0]\\[/bgcolor][bgcolor=#fff0f0]Run"[/bgcolor][bgcolor=#ffffff]);[/bgcolor]
[bgcolor=#ffffff]    [/bgcolor]
[bgcolor=#ffffff]if[/bgcolor][bgcolor=#ffffff] (RtlCompareUnicodeString(pUniName, [/bgcolor][bgcolor=#ffffff]&[/bgcolor][bgcolor=#ffffff]ustrReg, TRUE) [/bgcolor][bgcolor=#ffffff]==[/bgcolor][bgcolor=#ffffff] [/bgcolor][bgcolor=#ffffff]0[/bgcolor][bgcolor=#ffffff])[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]    ExFreePool(pUniName);[/bgcolor]
[bgcolor=#ffffff]    ObDereferenceObject(pKey);[/bgcolor]
[bgcolor=#ffffff]    [/bgcolor]
[bgcolor=#ffffff]    [/bgcolor][bgcolor=#ffffff]return[/bgcolor][bgcolor=#ffffff] STATUS_ACCESS_DENIED;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]

[bgcolor=#ffffff]      其中ObQueryNameString的声明如下所示:[/bgcolor]

[bgcolor=#ffffff]NTSYSAPI[/bgcolor]
[bgcolor=#ffffff]NTSTATUS[/bgcolor]
[bgcolor=#ffffff]NTAPI[/bgcolor]
[bgcolor=#ffffff]ObQueryNameString([/bgcolor]
[bgcolor=#ffffff]    IN  PVOID                Object,[/bgcolor]
[bgcolor=#ffffff]    OUT PVOID                ObjectNameInfo,[/bgcolor]
[bgcolor=#ffffff]    IN  ULONG                Length,[/bgcolor]
[bgcolor=#ffffff]    OUT PULONG                ReturnLength[/bgcolor]
[bgcolor=#ffffff]);[/bgcolor]

[bgcolor=#ffffff]好了,核心代码基本上都放出来了,剩下的就是你自己动手测试了。注意使用ZwQueryInformationFile和ZwQueryKey也可以获得相关信息,但不是完整路径。[/bgcolor]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 03:26 , Processed in 0.132085 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表