首页
社区
课程
招聘
[求助]获取注册表中 CurrentVersion\\SvcHost 各子健的值
发表于: 2010-8-17 13:57 7407

[求助]获取注册表中 CurrentVersion\\SvcHost 各子健的值

2010-8-17 13:57
7407
下列代码是想获取注册表 \\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost 中的"netsvcs"键值里面的值。里面的值都是用\0隔开。
一下代码只能获取第一个值,比如下面打印的结果是6to4, 怎样能把里面的值全部取出来呢,
是我用的查询函数问题还是什么问题,请大家指点一下。

NTSTATUS QuerySvchostValue(){
       
        UNICODE_STRING ustrKeyPath;
        UNICODE_STRING ustrKeySvcPath;
        UNICODE_STRING ustrKeySvcNameValue;
       
       
        ULONG  ulSize, i = 0;
        HANDLE        hRegedit = NULL;
        NTSTATUS status;
        OBJECT_ATTRIBUTES my_obj_attr ={0};
       
        // 用来试探大小的key_infor
        PKEY_VALUE_PARTIAL_INFORMATION key_infor;
        // 最后实际用到的key_infor指针。内存分配在堆中
        PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor;
       

        RtlInitUnicodeString(&ustrKeyPath,L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost");
        //获取键值
        RtlInitUnicodeString(&ustrKeySvcPath,L"netsvcs");
       
        // 初始化OBJECT_ATTRIBUTE
        InitializeObjectAttributes(
                &my_obj_attr,
                &ustrKeyPath,
                OBJ_CASE_INSENSITIVE,
                NULL,
        NULL);

        _asm{
                int 3;
        }
        //打开
        status=ZwOpenKey(&hRegedit,KEY_READ,&my_obj_attr);
        if(!NT_SUCCESS(status))
        {
                // 失败处理
                KdPrint(("[QuerySvchostValue: ]打开注册表 : %wZ. 失败!\n", &ustrKeyPath));
                //ZwClose(&hOpenKey);
                return status;
        }
       
        //先读取长度
        status = ZwQueryValueKey(hRegedit, &ustrKeySvcPath, KeyValuePartialInformation, &key_infor, sizeof(key_infor), &ulSize);
       
        if(!NT_SUCCESS(status) &&
                status != STATUS_BUFFER_OVERFLOW &&
                status != STATUS_BUFFER_TOO_SMALL)
        {
                // 错误处理
                DbgPrint("读取键值长度  失败....");
                DbgPrint( "status :%X\n", status );
               
                ZwClose(hRegedit);
                return status;
        }
       
        DbgPrint("读取键值长度 成功....");
       
        // 如果没失败,那么分配足够的空间,再次读取
        //ulSize = ulSize+1000;
        ac_key_infor = (PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePoolWithTag(NonPagedPool,ulSize ,'Va');
        if(ac_key_infor == NULL)
        {
                status = STATUS_INSUFFICIENT_RESOURCES;
                DbgPrint("为读取的键值分配长度 失败....");
               
        }
        // 第二次调用是为了获取数据
        status = ZwQueryValueKey( hRegedit, &ustrKeySvcPath,  KeyValuePartialInformation, ac_key_infor, ulSize, &ulSize);
        if(!NT_SUCCESS(status) &&
                status != STATUS_BUFFER_OVERFLOW &&
                status != STATUS_BUFFER_TOO_SMALL)
        {
                // 错误处理
               
        }
       
        KdPrint(("[QuerySvchostValue] netsvcs 里的内容是 : %ws \n", &ac_key_infor->Data));
       
        ZwClose(hRegedit);
        ExFreePool(ac_key_infor);
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
2
REG_MULTI_SZ 类型的值是以 \0为间隔, 以 \0\0为结尾的特殊字串。

以一个足够大的空间将此值全部读取,然后用循环读取值。
以PCHAR pszValue 指向其地址,步长为 lstrlen(pszValue)+1, 条件为 *pszValue == NULL。
2010-8-17 14:09
0
雪    币: 233
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上的回答,代码里我的分配容量为ulSize,后来也考虑是读取大小不够,所以我将
ulSize= ulSize+1000  加了1000,读取的数据仍然是6to4 。请继续指教一下
2010-8-17 14:26
0
游客
登录 | 注册 方可回帖
返回
//