服务进程创建一个带窗口的进程,过UAC

转载 2013年08月26日 01:08:47
主要代码如下:
DWORD FindSessionPid(LPSTR lpProcessName, DWORD dwSessionId)
{
DWORD res = 0;

PROCESSENTRY32 procEntry;

HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE)
{
   return res ;
}

procEntry.dwSize = sizeof(PROCESSENTRY32);

if (!Process32First(hSnap, &procEntry))
{
   goto _end;
}

do
{
   if (_stricmp(procEntry.szExeFile, lpProcessName) == 0)
   {
    DWORD winlogonSessId = 0;
    if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId) && winlogonSessId == dwSessionId)
    {
     res = procEntry.th32ProcessID;
     break;
    }
   }

} while (Process32Next(hSnap, &procEntry));

_end:
CloseHandle(hSnap);
return res;
}

BOOL LaunchAppIntoDifferentSession(LPSTR lpCmdLine)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL bResult = FALSE;
DWORD dwSessionId = 0, winlogonPid = 0;
HANDLE hUserToken, hUserTokenDup, hPToken, hProcess;
DWORD dwCreationFlags;

// Log the client on to the local computer.

typedef DWORD (WINAPI *__pfnWTSGetActiveConsoleSessionId)();
typedef BOOL (WINAPI *__pfnWTSQueryUserToken)( ULONG SessionId, PHANDLE phToken );

__pfnWTSGetActiveConsoleSessionId pfnWTSGetActiveConsoleSessionId =
   (__pfnWTSGetActiveConsoleSessionId)GetProcAddress(LoadLibraryA("kernel32.dll"), "WTSGetActiveConsoleSessionId");

__pfnWTSQueryUserToken pfnWTSQueryUserToken =
   (__pfnWTSQueryUserToken)GetProcAddress(LoadLibraryA("Wtsapi32.dll"), "WTSQueryUserToken");

if(pfnWTSGetActiveConsoleSessionId == NULL)
{
   WriteLog("Not found api: WTSGetActiveConsoleSessionId\n");
   return 0;
}
if(pfnWTSQueryUserToken == NULL)
{
   WriteLog("Not found api: WTSQueryUserToken\n");
   return 0;
}

dwSessionId = pfnWTSGetActiveConsoleSessionId();

winlogonPid = FindSessionPid("explorer.exe", dwSessionId);

if(winlogonPid == 0)
{
   winlogonPid = FindSessionPid("winlogon.exe", dwSessionId);
}

if(winlogonPid == 0)
{
   WriteLog("Can't Find Explorer\n");
   return 0;
}

////////////////////////////////////////////////////////////////////////

dwCreationFlags = NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = "winsta0\\default";
ZeroMemory(&pi, sizeof(pi));

TOKEN_PRIVILEGES tp;
LUID luid;
LPVOID TokenInformation;
DWORD RetLen = 0;

if( !pfnWTSQueryUserToken(dwSessionId, &hUserToken) )
{
   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, winlogonPid);

   if(!OpenProcessToken(hProcess, TOKEN_ALL_ACCESS_P, &hPToken))
   {
    char pTemp[121];
    sprintf(pTemp, "Process token open Error: %u\n", GetLastError());
    WriteLog(pTemp);
   }

   if(hPToken == NULL)
   {
    WriteLog("Process tokenError: \n");
   }
}
else
{
   hPToken = hUserToken;
}

if(GetTokenInformation(hPToken, TokenLinkedToken, &TokenInformation, 4, &RetLen))
{
   hUserTokenDup = TokenInformation;
}
else
{
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    {
     char pTemp[121];
     sprintf(pTemp, "Lookup Privilege value Error: %u\n", GetLastError());
     WriteLog(pTemp);
    }

   if(!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hUserTokenDup))
   {
    char pTemp[121];
    sprintf(pTemp, "DuplicateTokenEx Error: %u\n", GetLastError());
    WriteLog(pTemp);
   }
}

LPVOID pEnv = NULL;

if(CreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))
{
   dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
}
else
{
   WriteLog("CreateEnvironmentBlock Failed\n");
   pEnv = NULL;
}

// Launch the process in the client's logon session.

bResult = CreateProcessAsUser(
   hUserTokenDup,            // client's access token
   NULL,       // file to execute
   lpCmdLine,         // command line     
   NULL,              // pointer to process SECURITY_ATTRIBUTES
   NULL,              // pointer to thread SECURITY_ATTRIBUTES
   FALSE,             // handles are not inheritable
   dwCreationFlags,   // creation flags
   pEnv,              // pointer to new environment block
   NULL,              // name of current directory
   &si,               // pointer to STARTUPINFO structure
   &pi                // receives information about new process
   );
// End impersonation of client.

//GetLastError Shud be 0

int iResultOfCreateProcessAsUser = GetLastError();

if(bResult == FALSE && iResultOfCreateProcessAsUser != 0)
{
   char pTemp[121];
   sprintf(pTemp, "CreateProcessAsUser Error: %u\n", GetLastError());
   WriteLog(pTemp);
}

if(pi.hProcess)
{
   CloseHandle(pi.hProcess);
}
if(pi.hThread)
{
   CloseHandle(pi.hThread);
}

//Perform All the Close Handles task

if(hProcess)
{
   CloseHandle(hProcess);
}
if(hUserToken)
{
   CloseHandle(hUserToken);
}
if(hUserTokenDup)
{
   CloseHandle(hUserTokenDup);
}
if(hPToken)
{
   CloseHandle(hPToken);
}
if(pEnv)
{
   DestroyEnvironmentBlock(pEnv);
}

return bResult;
}

调用方式:

LaunchAppIntoDifferentSession("c:\\windows\\notepad.exe");

前提是有个服务进程已经启动,然后服务进程会以管理员模式(不需要用户点UAC的框)启动一个新的可以创建窗口的进程。

安装这个服务需要点UAC的框,所以不是什么不可公开的思路。好处就一点:每次自启动的进程,不需要再让用户点UAC框了

用C创建新进程的源码

#include #include #include int main(int argc, char* argv[]){ char szCommandLine[] = "cmd"; STARTUPIN...
  • kgdiwss
  • kgdiwss
  • 2005年07月06日 23:44
  • 2846

Linux - 进程 (二) 进程创建

Linux 进程系统介绍
  • Crazy__Programmer
  • Crazy__Programmer
  • 2014年09月06日 13:21
  • 2282

程序跳过UAC研究及实现思路

网上很对跳过UAC资料都是说如果让UAC弹出窗体,并没有真正跳过弹窗,这里结合动态提权+计划任务实现真正意义上的跳过UAC弹窗,运行程序的时候可以不出现UAC窗体,并且程序还是以高权限运行。 vist...
  • daiafei
  • daiafei
  • 2013年12月26日 11:44
  • 9536

第六课 linux下进程描述与进程创建

赵连讯 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验课程内容和文章的题目...
  • zhaolianxun1987
  • zhaolianxun1987
  • 2016年04月03日 11:06
  • 599

[linux]进程(四)——进程的创建

11,进程的创建 linux的进程创建可以分为两个步骤,分别为fork()和exec()函数,fork()负责创建一个子进程,和父进程的差别仅仅是PID PPID以及一些统计量, exec()函数负责...
  • u013686805
  • u013686805
  • 2014年02月26日 20:01
  • 1117

BypassUAC------使用EVENTVWR.EXE和注册表劫持实现“无文件”UAC绕过

参考 http://blog.sina.com.cn/s/blog_12f13ac600102wkah.html   在对Windows 10进行深入挖掘并发...
  • moonhillcity
  • moonhillcity
  • 2016年10月20日 10:56
  • 1482

看我如何利用sdclt.exe实现无文件绕过UAC

原文地址:https://enigma0x3.net/2017/03/17/fileless-uac-bypass-using-sdclt-exe/ 0x00 前言 最近,我发布了一篇文章“使...
  • D_R_L_T
  • D_R_L_T
  • 2018年01月05日 09:53
  • 114

[Windows]_[初级]_[应用程序避免弹出UAC授权窗口的方案]

场景 当Windows app以管理员模式启动时, 可以做一下管理员模式下的操作, 比如安装驱动, 扫描磁盘等. 可是自从vista 开始管理员模式启动关程序必然会弹出UAC对话框. 如果每启动一个需...
  • infoworld
  • infoworld
  • 2016年08月22日 14:10
  • 1062

过UAC-通过eventvwr提权

有些时候程序为了能有能大的权限对电脑进行操作。需要提高自己的权限,但是通常很多用户都不是管理员,这样的话高权限运行某个程序就会弹这样的窗,让你来确认,这个就是UAC:       今天说的是过怎么...
  • u013761036
  • u013761036
  • 2016年12月27日 22:55
  • 1089

VC常用代码之创建进程

作者:朱金灿来源:http://blog.csdn.net/clever101            创建进程是编程开发的常用操作。Windows中的创建进程采用API函数CreateProcess实...
  • clever101
  • clever101
  • 2015年10月31日 23:53
  • 8836
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务进程创建一个带窗口的进程,过UAC
举报原因:
原因补充:

(最多只允许输入30个字)