能力值:
( LV2,RANK:10 )
|
-
-
2 楼
观注。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
nsudo 可以看下它git的代码, 其实还有其他更骚的操作
|
能力值:
( LV9,RANK:140 )
|
-
-
4 楼
可以用服务启动一个system级别的程序,正常服务运行在会话0下,要启动一个运行在会话1下的程序,可以这样 BOOL createcmd() { HANDLE hPToken = NULL; HANDLE hUserTokenDup = NULL; PROCESS_INFORMATION pi; TOKEN_PRIVILEGES tp; LUID luid; BOOL bRet = FALSE; __try { if (!::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID | TOKEN_READ | TOKEN_WRITE, &hPToken)) __leave; if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hUserTokenDup)) { __leave; } DWORD dwSessionId = 1; //会话1 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { DWORD error = GetLastError(); __leave; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hUserTokenDup, FALSE, &tp, sizeof (TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL)) { DWORD error = GetLastError(); __leave; }
if (!SetTokenInformation(hUserTokenDup, TokenSessionId, (void *)& dwSessionId, sizeof (DWORD))) { DWORD error = GetLastError(); __leave; }
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); //si.dwXSize = 120; si.lpDesktop = L"WinSta0\\Default"; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; LPVOID pEnv = NULL; TCHAR buffCmd[MAX_PATH] = { 0 }; _tcscat_s(buffCmd, _countof(buffCmd) - 1, L"C:\\Windows\\System32\\CMD.exe");
bRet = CreateProcessAsUser(hUserTokenDup, NULL, buffCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
} __finally { if (hPToken) { CloseHandle(hPToken); hPToken = NULL; } if (hUserTokenDup) { CloseHandle(hUserTokenDup); hUserTokenDup = NULL; } if (pi.hProcess) { CloseHandle(pi.hProcess); pi.hProcess = NULL; } if (pi.hThread) { CloseHandle(pi.hThread); pi.hThread = NULL; } } return bRet; } 服务运行在会话0下,登录的第一个用户运行在会话1,第二个用户运行在会话2下,以此类推,这段代码运行在system服务中,即可启动一个会话1的cmd,在winlogn界面就会启动了,但是要登录进去才能看到
最后于 2022-4-13 11:28
被0346954编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢大佬回帖,一会儿去试试这段代码。 不过对“ DWORD dwSessionId = 1; //会话1” 这行有点疑问: 1、既然cmd在winlogon界面就启动了,这时还没有用户登录,哪来的session1、session2这些sessionid呢?还是说这些sessionid是windows预置的,在用户登录前就已经存在,用户不登录就已经有了,等到用户登录后再按顺序分配? 2、如果要做到这台机器上每个用户登录时都用system启动这个cmd(预先不知道有多少个用户、是同时登录还是按顺序注销完一个再登录另一个),这样的话sessionid又要怎么写呢?
最后于 2022-4-13 12:40
被碧水秋沙编辑
,原因:
|
能力值:
( LV9,RANK:140 )
|
-
-
6 楼
碧水秋沙
谢大佬回帖,一会儿去试试这段代码。不过对“ DWORD dwSessionId = 1; //会话1”& ...
也可以用 WTSGetActiveConsoleSessionId获取当前活跃的sessionid
第一个问题,其实已经有了session 1了,在用户登录界面,你可以在登录后,用processexplorer查看 
在登录界面,登录进程winlogon.exe就是session1,如果登录成功后,切换用户,第二个winlogon就是session 2 第二个问题:如果不知道有多少个用户,其实每个用户登录后都有至少一个explorer.exe进程,遍历进程获取每个进程的sessionid,已经创建过的就不再创建了,所以可以用服务程序遍历explorer.exe或者winlogon.exe,获取sessionid,判断是否已经启动过了监控程序,然后用上面的代码动态传递sessionid,启动监控程序。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
0346954
也可以用 WTSGetActiveConsoleSessionId获取当前活跃的sessionid
第一个问题,其实已经有了session 1了,在用户登录界面,你可以在登录后,用processex ...
太6了~多谢大佬解答,似乎明白怎么回事了,晚上回去就试试,有问题再来请教  不愧“大侠”称号,救万民于水火,解百姓于倒悬,事了拂衣去,深藏功与名
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
已经搞清楚原理并成功实现,再次感谢看雪的各位大侠们路见不平拔刀相助~~
|
|
|