2017-11-12 19 views
0

NT AUTHORITY\Network ServiceまたはNT AUTHORITY\Systemのいずれかのサービスによって生成されるプロセスがあります。そのプロセスを確認する必要があります。だから私は、このようなコードを書かれている:Nt Authority System SIDとの照合に失敗しました

if (OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) { 

     GetTokenInformation(hToken, 1, 0, 0, &dwOut); 
     if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { 
      hTokenUser = (TOKEN_USER*)malloc(dwOut); 
      if (!GetTokenInformation(hToken, TokenUser, hTokenUser, dwOut, &dwOut)) 
       return false; 
     } 
     else 
      return false; 

     PSID psid = NULL; 
     SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY; 
     AllocateAndInitializeSid(&ntAuth, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &psid); 


     if (EqualSid(psid, hTokenUser->User.Sid)) { 
      bResult = TRUE; 
     } 
} 

は、だから私は何をすべきか、私は、現在のプロセストークンを取得し、私はGetTokenInfoを使用して、それからSIDを取得し、その後、私はAllocateAndInitializeSidを使用して、NT_AUTHORITY\System SIDを作成し、私は2つを比較します値が一緒に、しかし、それは決して動作しません、プロセスがNT_AUTHORITY\Systemチェックの下で実行されるとき、常に失敗しています。これはNT_AUTHORITY\System SIDを取得してプロセスsidと比較する正しい方法ですか?

+0

メモリリークがあり、エラーをチェックしていません。 – RbMm

答えて

0

コードにハンドルとメモリがリークしますが、マシン上で正しい結果が得られません。あなたのシステムでは異なるかもしれませんので、デバッグに役立つようにすべての関数呼び出しの結果とGetLastErrorを表示すると本当に役に立ちます。また、エラーと負の(成功した)結果の違いを知ることができるように、関数をコーディングする必要があります。

HRESULT isSystemUser() 
{ 
    HRESULT hr = E_FAIL; 
    HANDLE hToken; 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) 
    { 
     TOKEN_USER *pTU = NULL; 
     DWORD dwOut; 
     GetTokenInformation(hToken, TokenUser, 0, 0, &dwOut); 
     hr = HRESULT_FROM_WIN32(GetLastError()); 
     if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
      pTU = (TOKEN_USER*) malloc(dwOut), hr = E_OUTOFMEMORY; 
     if (pTU) 
     { 
      if (GetTokenInformation(hToken, TokenUser, pTU, dwOut, &dwOut)) 
      { 
       PSID psid = NULL; 
       SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY; 
       if (AllocateAndInitializeSid(&ntAuth, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &psid)) 
       { 
        hr = EqualSid(psid, pTU->User.Sid) ? S_OK : S_FALSE; 
        FreeSid(psid); 
       } 
       else 
        hr = HRESULT_FROM_WIN32(GetLastError()); 

      } 
      else 
       hr = HRESULT_FROM_WIN32(GetLastError()); 
      free(pTU); 
     } 
     CloseHandle(hToken); 
    } 
    else 
     hr = HRESULT_FROM_WIN32(GetLastError()); 
    return hr; 
} 

... 

    printf("isSystemUser=%d\n", isSystemUser()); // 0 = true, 1 = false, < 0 = error 

し、それを実行している:

C:\windows\system32>c:\test.exe 
isSystemUser=0  

C:\windows\system32>whoami 
nt authority\system 

それはあなたが実際に本物のシステムユーザーとして実行されていないことは可能ですか? ConvertSidToStringSidはあなたのTokenUserに何を返しますか?

+0

このコードはすべてのcompsとwindowsで正しい結果を返す必要があります - ローカルシステムのsid(* S-1-5-18 *)は不変です。 'GetSidSubAuthorityCount(Sid)== 1 && * GetSidSubAuthority(Sid、0)== SECURITY_LOCAL_SYSTEM_RID' – RbMm

+0

+' GetSidIdentifierAuthority'と 'SECURITY_NT_AUTHORITY'を比較します – RbMm

+0

私はSIDを知っていますすべてのマシンで同じですが、問題は、彼が実際にSYSTEMなどで動作しているかどうかです。 – Anders

関連する問題