获得用户SID

来源:互联网 发布:ios11pp助手更新软件 编辑:程序博客网 时间:2024/05/07 18:51
 

得到当前用户的SID


我用的方法比较山寨,就是枚举HKEY_USERS下的所有键,此方法的优点是可以枚举出本机上全部有效的SID


----------------------------------------------------------------------------------------------------------------------------------------

如果要获得当前用户的SID,sudami大牛的文章里已经写的很清楚了。

http://hi.baidu.com/sudami/blog/item/5ba21ceef587e1ffb3fb9541.html

Ring3

[cpp] view plaincopy
  1. int GetUserName ()  
  2. {  
  3.     HANDLE hProcess = GetCurrentProcess();  
  4.     if(!hProcess) {  
  5.         return 0;  
  6.     }  
  7.       
  8.     HANDLE hToken;  
  9.     if( !OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) || !hToken ){  
  10.         CloseHandle(hProcess);  
  11.         return 0;  
  12.     }  
  13.       
  14.     DWORD dwTemp = 0;  
  15.     char tagTokenInfoBuf[256] = {0};  
  16.     PTOKEN_USER tagTokenInfo = (PTOKEN_USER)tagTokenInfoBuf;  
  17.     if( !GetTokenInformation( hToken, TokenUser, tagTokenInfoBuf, sizeof(tagTokenInfoBuf),\  
  18.         &dwTemp ) ) {  
  19.         CloseHandle(hToken);  
  20.         CloseHandle(hProcess);  
  21.         return 0;  
  22.     }  
  23.       
  24.     PtrConvertSidToStringSid dwPtr = (PtrConvertSidToStringSid)GetProcAddress(   
  25.         LoadLibrary("Advapi32.dll"), "ConvertSidToStringSidA" );  
  26.       
  27.     LPTSTR MySid = NULL;  
  28.     dwPtr( tagTokenInfo->User.Sid, (LPTSTR*)&MySid );  
  29.       
  30.     printf("Current user's SID:%s\n", MySid);  
  31.   
  32.     LocalFree( (HLOCAL)MySid );  
  33.       
  34.     CloseHandle(hToken);  
  35.     CloseHandle(hProcess);  
  36.       
  37.     return 0;  
  38. }  


Ring0(需要Attach到用户进程下):

[cpp] view plaincopy
  1. NTSTATUS    
  2. GetUserName()   
  3. {   
  4.     NTSTATUS status = STATUS_SUCCESS;    
  5.     HANDLE         hProcess;    
  6.     HANDLE         TokenHandle;    
  7.     ULONG         ReturnLength;    
  8.     ULONG       size;   
  9.     UNICODE_STRING SidString;   
  10.     PTOKEN_USER TokenInformation;    
  11.     char SidStringBuffer[512];   
  12.       
  13.     status = ZwOpenThreadTokenEx (NtCurrentThread(),   
  14.         TOKEN_READ,   
  15.         TRUE,   
  16.         OBJ_KERNEL_HANDLE,   
  17.         &TokenHandle);   
  18.       
  19.     if ( !NT_SUCCESS( status ) ) {   
  20.         status = ZwOpenProcessTokenEx (NtCurrentProcess(),   
  21.             TOKEN_READ,   
  22.             OBJ_KERNEL_HANDLE,   
  23.             &TokenHandle);   
  24.           
  25.         if ( !NT_SUCCESS( status )) {   
  26.             return status;   
  27.         }   
  28.     }   
  29.       
  30.     // 获取token信息   
  31.     size = 0x1000;   
  32.     TokenInformation = ExAllocatePool( NonPagedPool, size );   
  33.       
  34.     do {   
  35.         status = ZwQueryInformationToken( TokenHandle,    
  36.             TokenUser,    
  37.             TokenInformation,    
  38.             size,    
  39.             &ReturnLength );   
  40.           
  41.         if (status == STATUS_BUFFER_TOO_SMALL) {   
  42.             ExFreePool( TokenInformation );   
  43.             size *= 2;   
  44.             TokenInformation = ExAllocatePool( NonPagedPool, size );    
  45.               
  46.         } else if ( !NT_SUCCESS (status) ) {   
  47.             DbgPrint(" ZwQueryInformationToken error\n");    
  48.             ExFreePool( TokenInformation );    
  49.             ZwClose( TokenHandle );    
  50.               
  51.             return STATUS_UNSUCCESSFUL;   
  52.         }   
  53.           
  54.     } while (status == STATUS_BUFFER_TOO_SMALL);   
  55.       
  56.     ZwClose( TokenHandle );   
  57.   
  58.     status = RtlConvertSidToUnicodeString( &SidString,    
  59.         ((PTOKEN_USER)TokenInformation)->User.Sid,    
  60.         TRUE );    
  61.       
  62.     ExFreePool( TokenInformation );    
  63.     RtlFreeUnicodeString(&SidString);  
  64.   
  65.     DbgPrint("SID: %wZ\n", &SidString);   
  66.   
  67.     return STATUS_SUCCESS;    
  68. }  
或者attach到用户进程后,通过已经导出的RtlFormatCurrentUserKeyPath直接就可以得到了~o(*.*)0
0 0
原创粉丝点击