首页
社区
课程
招聘
[讨论]驱动中获得当前current user遇到的奇怪问题 [已解决]
发表于: 2008-3-6 09:22 7781

[讨论]驱动中获得当前current user遇到的奇怪问题 [已解决]

2008-3-6 09:22
7781
驱动中获得当前current user遇到的奇怪问题

为了得到 CurrentUser 的 SID(因为要操作\\registry\\user\\下的键),所以写了个函数:

Quote:


NTSTATUS  
GetUserName(  
    char* a
    )
/*++

作者: sudami 08/03/04

参数:
a - [IN] [OUT] 得到current user的注册表内容
形式如下"\\REGISTRY\\USER\\S-XXX-XXX..."

功能:

--*/

{
    NTSTATUS status = STATUS_SUCCESS;  
    HANDLE        hProcess;  
    HANDLE        TokenHandle;  
    ULONG        ReturnLength;  
    ULONG      size;
    UNICODE_STRING SidString;
    PTOKEN_USER TokenInformation;  
    char SidStringBuffer[512];

    status = ZwOpenThreadTokenEx (NtCurrentThread(),
                                  TOKEN_READ,
                                  TRUE,
                                  OBJ_KERNEL_HANDLE,
                                  &TokenHandle);

    if ( !NT_SUCCESS( status ) ) {
        status = ZwOpenProcessTokenEx (NtCurrentProcess(),
                                  TOKEN_READ,
                                  OBJ_KERNEL_HANDLE,
                                  &TokenHandle);

        if ( !NT_SUCCESS( status )) {
            return status;
        }
    }

    // 获取token信息
    size = 0x1000;
    TokenInformation = ExAllocatePool( NonPagedPool, size );

    do {
        status = NtQueryInformationToken( TokenHandle,  
                                        TokenUser,  
                                        TokenInformation,  
                                        size,  
                                        &ReturnLength );

        if (status == STATUS_BUFFER_TOO_SMALL) {
            ExFreePool( TokenInformation );
            size *= 2;
            TokenInformation = ExAllocatePool( NonPagedPool, size );  

        } else if ( !NT_SUCCESS (status) ) {
            DbgPrint(" ZwQueryInformationToken error\n");  
            ExFreePool( TokenInformation );  
            ZwClose( TokenHandle );  

            return STATUS_UNSUCCESSFUL;
        }

    } while (status == STATUS_BUFFER_TOO_SMALL);

    ZwClose( TokenHandle );

    RtlZeroMemory( SidStringBuffer, sizeof(SidStringBuffer) );  
    SidString.Buffer = (PWCHAR)SidStringBuffer;  
    SidString.MaximumLength = sizeof( SidStringBuffer );  

    status = RtlConvertSidToUnicodeString( &SidString,  
                        ((PTOKEN_USER)TokenInformation)->User.Sid,  
                        FALSE );  

    ExFreePool( TokenInformation );  
    DbgPrint("sudami's PC Name: %ws\n", SidStringBuffer);
    a = SidStringBuffer;
    return STATUS_SUCCESS;  
}

然后很无语的是,得到的内容是下面这样的:


实际上偶电脑当前的用户的SID是下面这个,偶也证实了是下面这个:


在虚拟机上加载驱动后得到的也是一个固定的值,即 "S-1-5-18"
看了下注册表,发现总是第一个的内容:


附件是R3 下得到当前SID的code,很正常,但在驱动中实现就出问题了~o(*.*)0

俺搞不明白,希望各位大虾指点一下,嘿嘿~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
汗,无人问津~~~
2008-3-6 11:41
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
3
    status = ZwOpenThreadTokenEx (NtCurrentThread(),
                                  TOKEN_READ,
                                  TRUE,
                                  OBJ_KERNEL_HANDLE,
                                  &TokenHandle);

    if ( !NT_SUCCESS( status ) ) {
        status = ZwOpenProcessTokenEx (NtCurrentProcess(),
                                  TOKEN_READ,
                                  OBJ_KERNEL_HANDLE,
                                  &TokenHandle);
NtCurrentXXXXXXX()?
据说驱动默认应该是一个名字叫做"SYSTEM"的进程空间。
如果你要获取当前用户 酌情考虑   KeAttachProcess 之类的吧。

以上纯属乱弹 错了不要怪我。 ,forgXt来之前赶快站位
2008-3-6 11:48
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
嗯,attach后就可以了。

谢谢foxabu同学~
[已解决]
2008-3-6 12:03
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
向3楼学习,,
2008-3-6 12:20
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
看了半天不敢进来,进来才发现幸好刚才没有进来
2008-3-6 15:38
0
雪    币: 125
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
还是选合适的进程attach才行,随便attach一下有可能查询到另外一个帐户去的,天知道那个进程创建的时候有没有被指定运行在其他帐户下的
2008-3-8 13:19
0
雪    币: 125
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
ring3下这种无法查询LOCAL_SERVICE 和NETWORK_SERVICE帐户的Tokeninfo,不知道ring0下可以不

原来ring3下把自己运行在本地帐户下就可以查询了...哈哈
2008-3-8 14:04
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
9
其实你那代码根本就没有问题
在Windows NT之前,一般都假设某个线程是运行在登录用户的帐号之下。但Windows NT问世以后,允许线程可以在多个安全上下文中运行,言下之意就是一个线程对多个用户。例如,在客户/服务器(C/S)应用中,服务器的某个线程可以通过 ImpersonateNamedPipeClient 函数模仿一个客户。在这种情况下,它运行在该客户端的用户上下文中。另一个运行在不同安全上下文中的线程例子是服务线程,它具备 NT AUTHORITY 域名和 SYSTEM 用户名,并且运行在本地系统账号之下。
上传的附件:
2008-7-30 11:02
0
游客
登录 | 注册 方可回帖
返回
//