MENU

win10 创建指定父进程的管理员权限进程

October 9, 2019 • 默认分类

场景

  1. 系统:win10.1903 UAC 默认设置(不考虑彻底关闭时的情况)
  2. 进程 explorer.exe 的 session=3
  3. 进程A: administrator 用户管理员权限
  4. 进程A:session=3
  5. 进程A 创建 进程B
  6. 进程B 的父进程指定为 system系统特权级进程(如 svchost.exe 服务进程,session=0)
  7. 进程B:session=3
  8. 进程B:administrator 用户管理员权限

解决

暂未完全实现,只实现到第七条,第八条为进程B处于 system系统权限下;当第三四条为 system系统权限(session=0)时,则能实现到条八条。

以下为没什么卵用的代码:

#include <cstdio>
#include <Windows.h>
#include <atlbase.h>
#include <Tlhelp32.h>

BOOL EnablePrivilege( LPCTSTR name )
{//提升进程权限
    BOOL    bRet=FALSE;
    //获得指定的权限值
    TOKEN_PRIVILEGES priv = { 1, { 0, 0, SE_PRIVILEGE_ENABLED } };
    BOOL bLookup = LookupPrivilegeValue( NULL, name, &priv.Privileges[0].Luid );
    if( !bLookup )
    {
        //OutLog("查找指定权限值失败");
        return bRet;
    }
    //打开进程的访问标记
    HANDLE hToken = NULL;
    BOOL bOpenToken = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );
    if( !bOpenToken )
    {
        //OutLog("打开进程的访问标记失败");
        return bRet;
    }

    //调整权限
    BOOL bAdjustpriv = AdjustTokenPrivileges( hToken, false, &priv, sizeof( priv ), 0, 0 );
    if( !bAdjustpriv )
    {
        //OutLog("调整权限失败");
        CloseHandle( hToken );
        return bRet;
    }
    CloseHandle( hToken );

    return TRUE;
}

DWORD FindProcessIDByProcessName(LPCTSTR lpszProcessName)//根据进程名寻找进程ID
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( hSnapshot == NULL )
    {
        return 0;
    }
    int nStrLen=lstrlen(lpszProcessName);

    PROCESSENTRY32 stProcessEntry32 = {0};
    stProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
    Process32First( hSnapshot, &stProcessEntry32 );
    BOOL bFind = FALSE;
    do
    {
        if(lstrcmp( stProcessEntry32.szExeFile,lpszProcessName) == 0 )
        {
            bFind = TRUE;
            break;
        }
    }while( Process32Next( hSnapshot, &stProcessEntry32 ) );
    CloseHandle( hSnapshot );
    if (bFind)
    {
        return stProcessEntry32.th32ProcessID;
    }
    return 0;
}

//置新进程的父进程为指定进程 仅支持 vista win2008 及以上版本
int main()
{
    EnablePrivilege(SE_SECURITY_NAME);//提权
    PROCESS_INFORMATION pi={0};
    STARTUPINFOEX si={sizeof(STARTUPINFOEX)};
    SIZE_T    cbAListSize=0;
    InitializeProcThreadAttributeList(NULL,1,0,&cbAListSize);
    PPROC_THREAD_ATTRIBUTE_LIST pAList=(PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(),0,cbAListSize);
    InitializeProcThreadAttributeList(pAList,1,0,&cbAListSize);
    HANDLE hParent=OpenProcess(PROCESS_ALL_ACCESS,FALSE,FindProcessIDByProcessName(TEXT("explorer.exe")));//要置为父进程的句柄
    UpdateProcThreadAttribute(pAList,0,PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,&hParent,sizeof(HANDLE),NULL,NULL);
    si.lpAttributeList=pAList;
    TCHAR szProcess[]=TEXT("notepad.exe");
    CreateProcess(NULL,szProcess,NULL,NULL,FALSE,EXTENDED_STARTUPINFO_PRESENT,NULL,NULL,&si.StartupInfo,&pi);

    DeleteProcThreadAttributeList(pAList);
    HeapFree(GetProcessHeap(),0,pAList);
    system("pause");
    return 0;
}