频道栏目
首页 > 资讯 > 安全编程 > 正文

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

09-03-31        来源:[db:作者]  
收藏   我要投稿
http://nokyo.blogbus.com/logs/37252170.html

      在编写驱动进行HOOK的时候,我们经常会需要从某参数获取相关信息,最常见的就是从进程、文件、注册表句柄中获取相关路径以进行相关保护。其中关于从进程句柄获取信息的方法我已经在《SSDT HOOK实现进程保护》一文中给出了方法,今天我们就给出文件和注册表句柄的处理方法。

      下面首先看通过HOOK ZwSetInformationFile保护文件防删除的方法,这个函数的第一个参数FileHandle给定了文件路径,但是我们该怎么获取这个路径呢?核心函数在于ObReferenceObjectByHandle,下面是示例代码:

PFILE_OBJECT        pFileObject;
UNICODE_STRING      DosName;
UNICODE_STRING      uniFileName;
ANSI_STRING         aniFileName;

ObReferenceObjectByHandle(FileHandle, 0, 0, KernelMode, &pFileObject, NULL);
IoVolumeDeviceToDosName(pFileObject->DeviceObject, &DosName);

KdPrint(("[nokyo] %s%s", DosName.Buffer, pFileObject->FileName.Buffer));

ExFreePool(DosName.Buffer);
ObDereferenceObject(pFileObject);

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

PVOID              pKey;
PUNICODE_STRING    pUniName;
UNICODE_STRING     ustrReg;

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

      其中ObQueryNameString的声明如下所示:

NTSYSAPI
NTSTATUS
NTAPI
ObQueryNameString(
    IN  PVOID                Object,
    OUT PVOID                ObjectNameInfo,
    IN  ULONG                Length,
    OUT PULONG                ReturnLength
);

好了,核心代码基本上都放出来了,剩下的就是你自己动手测试了。注意使用ZwQueryInformationFile和ZwQueryKey也可以获得相关信息,但不是完整路径。

相关TAG标签
上一篇:西方称中国网络间谍入侵103国 我专家驳斥
下一篇:网络工程师必懂的专业术语!
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站