0

UACを無効にした状態で、UACを有効にして作成したプロセスと同じ特性を持つプロセスを作成する必要があります。基本的には、UACを有効にしてプロセスの作成をエミュレートしています。

私の唯一の障害は仮想化です。以下のサンプルコードは、仮想化が有効になっている中程度のILでnotetableのインスタンスを作成する必要があります。実際には、仮想化を無効にして中程度のILでメモ帳のインスタンスを作成します。仮想化トークンが無視されている理由がよくわかりません。何か案は?

BOOL bRet;
HANDLE hToken;
HANDLE hNewToken;

// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] =
L"C:\\Windows\\System32\\Notepad.exe";

// Medium integrity SID
WCHAR wszIntegritySid[20] = L"S-1-16-8192";
PSID pIntegritySid = NULL;

DWORD EnableVirtualization = 1;
TOKEN_MANDATORY_LABEL TIL = {0};
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
ULONG ExitCode = 0;

if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
   if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
      SecurityImpersonation, TokenPrimary, &hNewToken))
   {
      if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid))
      {
         TIL.Label.Attributes = SE_GROUP_INTEGRITY;
         TIL.Label.Sid = pIntegritySid;

         // Set the process integrity level
         if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,
            sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
         {
            // Enable FS Virtualization
            if (SetTokenInformation(hNewToken, TokenVirtualizationEnabled,
               &EnableVirtualization, sizeof(EnableVirtualization)))
            {
               // Create the new process at Low integrity
               bRet = CreateProcessAsUser(hNewToken, NULL,
                  wszProcessName, NULL, NULL, FALSE,
                  0, NULL, NULL, &StartupInfo, &ProcInfo);
            }
         }
         LocalFree(pIntegritySid);
      }
      CloseHandle(hNewToken);
   }
   CloseHandle(hToken);
}
4

2 に答える 2

0

だから、私はこれに間違ってアプローチしていました-fs仮想化は私が望むものではありません。上記のようにUACをエミュレートするには、管理者グループを無効にして制限付きトークンを作成し、そのトークンを使用してプロセスを作成する必要があります。

于 2010-08-18T19:26:26.507 に答える
0

これが機能しない理由は、SetTokenInformation仮想化をオンにする呼び出しが、に対して作成されたプライマリトークンで機能しているためCreateProcessAsUserです。必要なのは、実際のプロセスのアクセストークンです。これは、を使用してプロセスを作成し、からプロセスハンドルを使用してCreationFlag CREATE_SUSPENDED呼び出すことで取得できます。そのトークンを使用して仮想化を有効にしてから、プロセスを実行します。OpenProcessTokenProcInfoSetTokenInformationResumeThread

于 2013-05-12T21:28:32.027 に答える