C++ 使用CreateProcessWithTokenW在CMD中启动CMD
我有一个控制台应用程序,它调用C++ 使用CreateProcessWithTokenW在CMD中启动CMD,c++,c,visual-studio,C++,C,Visual Studio,我有一个控制台应用程序,它调用CreateProcessWithTokenW()WinAPI函数来创建一个新的进程,启动cmd控制台。通过调用它,它将启动一个新的CMD窗口。我想在调用cmd窗口中生成另一个cmd(而不是在新窗口中) 所以我想模拟相同的行为,比如启动cmd并键入“cmd” 摆脱CREATE\u NEW\u控制台标志: 创建新的控制台 0x00000010 新进程有一个新控制台,而不是继承父进程的控制台。此标志不能与分离的\u进程标志一起使用 默认情况下,此标志处于启用状态 正是这
CreateProcessWithTokenW()
WinAPI函数来创建一个新的进程,启动cmd控制台。通过调用它,它将启动一个新的CMD窗口。我想在调用cmd窗口中生成另一个cmd(而不是在新窗口中)
所以我想模拟相同的行为,比如启动cmd并键入“cmd”
摆脱
CREATE\u NEW\u控制台
标志:
创建新的控制台0x00000010 新进程有一个新控制台,而不是继承父进程的控制台。此标志不能与分离的\u进程标志一起使用 默认情况下,此标志处于启用状态
正是这个闪存迫使创建一个新的CMD窗口。否则,将在调用进程的现有CMD窗口中创建新进程 就我而言,您应该使用
CREATE\u NEW\u CONSOLE
。根据守则:
STARTUPINFOEX startup_info = {};
PROCESS_INFORMATION process_info = {};
BOOL CreateProcTokenRes = FALSE;
CreateProcTokenRes = CreateProcessWithTokenW(NewToken, 0, L"C:\\Windows\\system32\\cmd.exe", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &process_info);
if (!CreateProcTokenRes)
{
_tprintf(L"Cannot Create Process With Token. Failed with Error Code: %d\n", GetLastError());
CloseHandle(NewToken);
ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,CREATE\u NEW\u控制台,NULL,NULL,&si,&pi)代码>
问题不在于使用CreateProcessWithTokenW()
winapi。能否请您提供一份复印本
代码如下:
STARTUPINFOEX startup_info = {};
PROCESS_INFORMATION process_info = {};
BOOL CreateProcTokenRes = FALSE;
CreateProcTokenRes = CreateProcessWithTokenW(NewToken, 0, L"C:\\Windows\\system32\\cmd.exe", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &process_info);
if (!CreateProcTokenRes)
{
_tprintf(L"Cannot Create Process With Token. Failed with Error Code: %d\n", GetLastError());
CloseHandle(NewToken);
有关更多详细信息,我建议您可以参考链接:这里是一个最小的可复制代码片段。
我添加了CreateProcess而不是CreateProcessWithToken…如果我为第5个参数(dwCreationFlag)定义了0,则它会在Powershell中启动CMD。但是对于CreateProcessWithToken,行为不同
使用提升的powershell运行此代码(因为它需要Se_Debug_Priv)
#包括
#包括
#包括
#包括
#包括
int main(){
//在此定义winlogon.exe的PID
DWORD pid=940;
句柄currentProcess={};
句柄AccessToken={};
currentProcess=OpenProcess(进程查询信息,TRUE,pid);
OpenProcessToken(currentProcess、TOKEN_ASSIGN_PRIMARY、TOKEN|u DUPLICATE、TOKEN|u IMPERSONATE、TOKEN|QUERY和AccessToken);
句柄pToken=AccessToken;
安全性模拟级别seImpersonateLevel=安全性模拟;
TOKEN_TYPE tokenType=TokenPrimary;
句柄pNewToken=新句柄;
DuplicateTokenEx(pToken、允许的最大值、NULL、seImpersonateLevel、tokenType和pNewToken);
STARTUPINFO si={};
进程信息pi={};
//测试1
//为这两个函数创建一个新窗口,因此第五个窗口似乎被忽略
CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe),NULL,0,NULL,NULL,&si,&pi);
CreateProcessWithTokenW(pNewToken,0,L“cmds.bat”,NULL,CREATE_NEW_控制台,NULL,NULL,&si,&pi);
//测试2
//创建新窗口,假定行为
CreateProcessW(L“C:\\Windows\\System32\\cmd.exe”,NULL,NULL,NULL,TRUE,创建新控制台,NULL,NULL,&si,&pi);
//还创建一个新窗口,而不是假定的行为
CreateProcessW(L“C:\\Windows\\System32\\cmd.exe”,NULL、NULL、NULL、TRUE、0、NULL、NULL、&si、&pi);
返回0;
}
控制台进程可以使用CREATE\u NEW\u console的CreateProcess功能来创建具有新控制台的控制台进程。有关更多详细信息,我建议您可以参考以下链接:。这里有一个类似的问题:ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,NULL,NULL,NULL,&si,&pi);或者ret=CreateProcessWithTokenW(pNewToken,0,L“C:\\Windows\\System32\\cmd.exe”,NULL,0,NULL,NULL,&si,&pi);具有与CREATE_NEW_CONSOLE Flag相同的行为。若要清除:我不希望CREATE_NEW_CONSOLE的行为…它希望它在现有/调用cmd/powershell中生成。我读到我必须将标志设置为0。使用函数CreateProcess,它工作得很好,但是CreateProcessWithToken似乎忽略了这一点。
#include <stdio.h>
#include <Windows.h>
#include <WinBase.h>
#include <iostream>
#include <tchar.h>
int main() {
//DEFINE HERE PID OF winlogon.exe
DWORD pid = 940;
HANDLE currentProcess = {};
HANDLE AccessToken = {};
currentProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid);
OpenProcessToken(currentProcess, TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY, &AccessToken);
HANDLE pToken = AccessToken;
SECURITY_IMPERSONATION_LEVEL seImpersonateLevel = SecurityImpersonation;
TOKEN_TYPE tokenType = TokenPrimary;
HANDLE pNewToken = new HANDLE;
DuplicateTokenEx(pToken, MAXIMUM_ALLOWED, NULL, seImpersonateLevel, tokenType, &pNewToken);
STARTUPINFO si = {};
PROCESS_INFORMATION pi = {};
//TEST1
//Creates a new window for both functions so the 5th seems to be ignored
CreateProcessWithTokenW(pNewToken, 0, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &si, &pi);
CreateProcessWithTokenW(pNewToken, 0, L"cmds.bat", NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
//TEST2
//Create a new windows, assumed behavior
CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
//Creates also a new window, NOT assumed behavior
CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
return 0;
}