首页
社区
课程
招聘
[求助]请问怎样从key handle 获取注册表项的完整路径
发表于: 2009-5-12 10:33 8533

[求助]请问怎样从key handle 获取注册表项的完整路径

2009-5-12 10:33
8533
用ObQueryNameString总蓝屏,代码如下:
麻烦大家帮帮忙看看有什么问题,或者有没有其他方法来做。
BOOLEAN GetRegistryObjectCompleteName1(PUNICODE_STRING pRegistryPath, PUNICODE_STRING pPartialRegistryPath, PVOID pKey)
{
BOOLEAN getCompleteName = FALSE;
PUNICODE_STRING fullName = NULL;
ULONG actualLen;
NTSTATUS status;

status = ObQueryNameString( pKey, (POBJECT_NAME_INFORMATION)fullName, 0, &actualLen );
if(status == STATUS_INFO_LENGTH_MISMATCH)
{
    fullName = ExAllocatePoolWithTag(NonPagedPool, actualLen,REGISTRY_POOL_TAG);
    status = ObQueryNameString( pKey, (POBJECT_NAME_INFORMATION)fullName, actualLen, &actualLen );
    if(NT_SUCCESS(status))
    {
        RtlUnicodeStringCopy(pRegistryPath, fullName);
        getCompleteName = TRUE;
    }
    else
    {
        KdPrint(("Error %x getting QueryNameString.\n"));
    }
        ExFreePoolWithTag(fullName,REGISTRY_POOL_TAG);
}

        return getCompleteName;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
ObQueryNameString函数本身有BUG,另外,你不会调试不会分析dump吗?
2009-5-12 11:17
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
3
PUNICODE_STRING fullName = NULL;

2009-5-12 12:48
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
PUNICODE_STRING fullName = NULL;
太猛了,往NULL里写名字...蓝死是应该的,基础没过关就冒出来导出乱hook~
2009-5-12 14:12
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呃...不好意思
把status = ObQueryNameString( pKey, (POBJECT_NAME_INFORMATION)fullName, 0, &actualLen );
改成
status = ObQueryNameString( pKey, NULL, 0, &actualLen );
2009-5-12 14:31
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习中,没必要那么冷嘲热讽的吧
就你基础好??
2009-5-12 16:19
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7


123456
2009-5-12 16:51
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这样还是有问题,有时蓝屏有时不蓝,请问什么原因呢?
除了ObQueryNameString外有没有其他方法?
2009-5-12 17:08
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顺便再请教个问题,注册表监控用RegistryCallback还是ssdt hook好呢
2009-5-12 17:24
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
RtlUnicodeStringCopy溢出?
2009-5-12 17:27
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
11
注意长度...你分配的内存如果太小当然BSOD咯..
监控的话...CALLBACK比较简单
2009-5-12 17:28
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
用windbg结合代码与符号看dump多方便,蓝在那里一目了然~

当然是Callback
2009-5-12 17:28
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
13
自己用个定时器检测比较好,稳定
2009-5-12 17:28
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
这个方法比较适合正规科班程序员,对于hook and hooker这种方法无疑是很难的~
2009-5-12 17:29
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
15
现在讲究的就是稳定,有文档
2009-5-12 17:37
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
16
感受颇深啊....稳定,文档...
2009-5-12 17:45
0
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
用callback监控注册表创建键值,将获取的信息传到应用层进行判断(比如是否让其创建),如果前一判断没有结束,后续的创建键值通知,是否都挂起了?
2009-5-12 21:11
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Google一大堆,先鄙视一下
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;
}
2009-5-13 09:05
0
游客
登录 | 注册 方可回帖
返回
//