CreateProcess Доступ запрещен при вызове с помощью липких клавиш

Моя программа предназначена для безопасного взлома Sticky Keys. Если липкие ключи вызываются из входа в систему, он запрашивает имя пользователя и пароль для локальной учетной записи. Если они верны, экземпляр cmd.exe будет вызван как этот пользователь, чтобы избежать повреждения. Когда я дважды щелкаю программу sethc из проводника,

Работает успешно.

Когда я запускаю ту же программу с нажатием клавиши Shift пять раз,

Сбой с ошибкой 5 Доступ запрещен.

Я могу убедиться, что sethc запускается под winlogon, когда Shift нажимается пять раз.

Весь файл:

// cmd.cpp : Defines the entry point for the console application.
//

#include <Windows.h>
#include <Lmcons.h>
#include <iostream>
#include <ctype.h>
#include <string>
#include <stdio.h>

#define winstring LPWSTR
#define stcas(x) static_cast<x>
#define INFO_BUFFER_SIZE    260

using namespace std;

void ReportError(LPCWSTR pszFunction, DWORD dwError = GetLastError())
{
wprintf(L"%s failed w/err 0x%08lx\n", pszFunction, dwError);
system("pause");
exit(dwError);
}

int main()
{
LPTSTR szCmdline[] = {"cmd"};
STARTUPINFOW si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
TCHAR un[UNLEN+1];
DWORD size = UNLEN + 1;
GetUserName(un, &size);

string una(un);

bool sys = !una.compare("SYSTEM");if(!sys) {
system("cls");
if(!CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi)) ReportError(L"normal Create process");
return 0;
}wchar_t szUserName[INFO_BUFFER_SIZE] = {};
wchar_t szPassword[INFO_BUFFER_SIZE] = {};
wchar_t *pc = NULL;
HANDLE hToken = NULL;
HANDLE aToken = NULL;
BOOL dup = FALSE;
BOOL logon = FALSE;printf("Enter the username: ");
fgetws(szUserName, ARRAYSIZE(szUserName), stdin);
pc = wcschr(szUserName, '\n');
if (pc != NULL) *pc = '\0';  // Remove the trailing L'\n'

cout << endl;

printf("Enter the password: ");
fgetws(szPassword, ARRAYSIZE(szPassword), stdin);
pc = wcschr(szPassword, '\n');
if (pc != NULL) *pc = '\0';  // Remove the trailing L'\n'

if(!LogonUserW(szUserName, NULL, szPassword, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken)) ReportError(L"Logon");
else logon = TRUE;

if(!DuplicateTokenEx(hToken, TOKEN_DUPLICATE | TOKEN_IMPERSONATE, NULL, SecurityImpersonation, TokenPrimary, &aToken)) ReportError(L"Impersonate");
else dup = TRUE;

if(!CreateProcessAsUserW(aToken,L"C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, L"C:\\Windows\\System32\\", &si, &pi)){
ReportError(L"Create Process");
}

SecureZeroMemory(szPassword, sizeof(szPassword));
}

Я хотел бы знать, почему sethc вообще не разрешен CreateProcess, если он получен из winlogon. Я использую Windows 7. Странная вещь в том, что system(command) работает отлично. я использую system("pause"); один раз.

0

Решение

Хотя трудно сказать, каков ваш вопрос на самом деле, имейте в виду, что есть особая привилегия, называемая PROCESS_CREATE_PROCESS,

Из MSDN:

PROCESS_CREATE_PROCESS (0x0080) Требуется для создания процесса.

Процесс, не имеющий этой привилегии, не может порождать дочерние процессы. system("pause"); не создает дочерний процесс, потому что pause — это встроенная команда оболочки, но я понимаю, почему у вас могло сложиться такое впечатление.

Поэтому проверьте, есть ли у вашего процесса эта привилегия. Используйте проводник процессов или просто функцию WINAPI, она обязательно должна быть.

Если вы хотите знать, почему разработчики Microsoft решили не предоставлять эту привилегию sethc, вы должны спросить их.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]