Re[2]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: Аноним  
Дата: 22.05.05 06:33
Оценка:
Здравствуйте, Alex Fedotov

Где-то здесь был уже этот код:
    bool rrt;
    PCTSTR privs = {_T("SeDebugPrivilege")};
    rrt = EnablePrivileges(&privs,1);

    PCTSTR privs2 = {_T("SeIncreaseQuotaPrivilege")};
    rrt = EnablePrivileges(&privs2,1);

    PCTSTR privs3 = {_T("SeAssignPrimaryTokenPrivilege")};
    rrt = EnablePrivileges(&privs3,1);

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,0x04);
    if (hProcess != NULL){
        HANDLE hTok;
        if (OpenProcessToken(hProcess, READ_CONTROL|WRITE_DAC,&hTok)){
            PACL pDacl = NULL;
            PSECURITY_DESCRIPTOR pSD = NULL;

            if (GetSecurityInfo(hTok,SE_KERNEL_OBJECT,
                DACL_SECURITY_INFORMATION,
                NULL,NULL,&pDacl,NULL,&pSD) != ERROR_SUCCESS) goto l1;

            PACL dacl;
            BOOL b;
            if (!GetSecurityDescriptorDacl(pSD,&b,&dacl,&b)) goto l1;

            TCHAR UserName[1024];
            DWORD dwLen = sizeof UserName/sizeof UserName[0];
            if (!GetUserName(UserName, &dwLen)) goto l1;

            EXPLICIT_ACCESS ea;
            BuildExplicitAccessWithName(&ea, UserName,
                TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY, GRANT_ACCESS, 0);
            ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
            ea.grfAccessPermissions = TOKEN_DUPLICATE;

            PACL newpAcl = NULL;
            if (SetEntriesInAcl(1, &ea, dacl,&newpAcl) != ERROR_SUCCESS) goto l1;

            if (SetSecurityInfo(hTok,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,
                NULL,NULL,newpAcl,NULL) == ERROR_SUCCESS)
            {

                BOOL res;
                res = 1;
    
                CloseHandle(hTok);
                hTok = NULL;

                res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
                DWORD aaa = GetLastError();
                if (res){
                    STARTUPINFO si = {sizeof(STARTUPINFO)};
                    GetStartupInfo(&si);
                    PROCESS_INFORMATION pi = {0};
                    res = CreateProcessAsUser(hTok,NULL,_T("notepad.exe"),NULL,NULL,FALSE,
                        0,NULL,NULL,&si,&pi);
                    CloseHandle(pi.hThread);
                    CloseHandle(pi.hProcess);
                }
            }
            if (newpAcl) LocalFree(newpAcl);
l1:
            if (pSD) LocalFree(pSD);
            if (hTok) CloseHandle(hTok);
        }
         CloseHandle(hProcess);
    }
    return 0;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.