首页
社区
课程
招聘
[求助]请教一个注册表路径转换的问题!
发表于: 2009-4-2 16:51 4359

[求助]请教一个注册表路径转换的问题!

2009-4-2 16:51
4359
请问各位大侠!在驱动中 类似于
\REGISTRY\USER\S-1-5-21-1659004503-2111687655-725345543-500\Software\Microsoft\Windows
这样的路径 如何转换为

HKEY_CURRENT_USER\Software\Microsoft\Windows

这样的路径呢?

或者知道keyhandle 如何转换呢?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
按米前辈的改了个  可些执行失败  不知道为什么
NTSTATUS GetUserSIDFromProcess(PEPROCESS pProcess, PCHAR pSID)
{
  NTSTATUS        status = STATUS_SUCCESS;
  HANDLE          PrHandle=0;
  HANDLE          TokenHandle=0;
  ULONG           size;
  ULONG           ReturnLength;
  PTOKEN_USER     TokenInformation;
  UNICODE_STRING  SidString;
  WCHAR           SidStringBuffer[256];

  status = ObOpenObjectByPointer(pProcess, 0, 0, PROCESS_ALL_ACCESS, (PVOID)*PsProcessType, KernelMode, &PrHandle);
  if ( !NT_SUCCESS( status )) return status;

 status=NtOpenProcessTokenEx(PrHandle, STANDARD_RIGHTS_READ | TOKEN_QUERY,OBJ_KERNEL_HANDLE,&TokenHandle);
 if ( !NT_SUCCESS( status )) return status;//[COLOR="Red"][B]NtOpenProcessTokenEx执行失败[/B][/COLOR]	
  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) ) {
            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("SidStringBuffer:%ws",SidStringBuffer);
  ConvertFileNameWCHARToCHAR(SidStringBuffer,pSID);
  return status;
}
2009-4-3 17:40
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
status=NtOpenProcessTokenEx(PrHandle, STANDARD_RIGHTS_READ | TOKEN_QUERY,OBJ_KERNEL_HANDLE,&TokenHandle);
if ( !NT_SUCCESS( status )) return status;//NtOpenProcessTokenEx执行失败  

==================

使用ZwOpenProcessTokenEx
调用Nt系列函数而上个模式是User Mode的话,不能对函数传入kernel mode buffer
2009-4-3 18:12
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
非常感谢,受益良多
2009-4-3 18:16
0
游客
登录 | 注册 方可回帖
返回
//