• XSS.stack #1 – первый литературный журнал от юзеров форума

Implementation of disabling UAC (C++)

GridsNetwork

ripper
КИДАЛА
Регистрация
30.03.2023
Сообщения
426
Реакции
128
Гарант сделки
2
Пожалуйста, обратите внимание, что пользователь заблокирован
C++:
#include <iostream>
#include <Windows.h>
#include <shellapi.h>

bool IsRunningAsAdmin() {
    BOOL isAdmin = FALSE;
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup;
    if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
                                 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
                                 &AdministratorsGroup)) {
        if (!CheckTokenMembership(nullptr, AdministratorsGroup, &isAdmin)) {
            isAdmin = FALSE;
        }
        FreeSid(AdministratorsGroup);
    }
    return isAdmin != FALSE;
}

void RestartAsAdmin() {
    wchar_t szPath[MAX_PATH];
    if (GetModuleFileName(nullptr, szPath, ARRAYSIZE(szPath))) {
        SHELLEXECUTEINFO sei = { sizeof(sei) };
        sei.lpVerb = L"runas";
        sei.lpFile = szPath;
        sei.hwnd = nullptr;
        sei.nShow = SW_NORMAL;

        if (!ShellExecuteEx(&sei)) {
            DWORD dwError = GetLastError();
            if (dwError == ERROR_CANCELLED) {
                std::cout << "Administrative privileges not granted." << std::endl;
            }
        }
    }
    exit(0);
}

int main() {
    const char* keyPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    HKEY hKey;

    if (!IsRunningAsAdmin()) {
        RestartAsAdmin();
    }

    LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, KEY_WRITE, &hKey);
    if (lResult == ERROR_SUCCESS) {
        DWORD dwData = 0;
        lResult = RegSetValueEx(hKey, "EnableLUA", 0, REG_DWORD, (const BYTE*)&dwData, sizeof(dwData));
        RegCloseKey(hKey);

        if (lResult == ERROR_SUCCESS) {
            std::cout << "UAC has been disabled." << std::endl;
        } else {
            std::cout << "Failed to disable UAC." << std::endl;
        }
    } else {
        std::cout << "Registry key not found. UAC may already be disabled!." << std::endl;
    }

    return 0;
}
 
wchar_t szPath[MAX_PATH]; if (GetModuleFileName(nullptr, szPath, ARRAYSIZE(szPath))) {
Не стоит выделять столько места не стэке. Лучше вызвать GetModuleFileName с нулевыми параметрами, получить размер и выделить место в куче (не и потом освободить само собой).
Почитай внимательней доку на все *W функции. Обрати внимание на "\\?\".
Да и сам на коммерс проекте столкнулся с проблемой, что пути на самом деле могут и больше быть))) Особенно если туда smb шару захерачить (в твоём случае такое не случится конечн). Так что забудь про константу MAX_PATH и всегда старася найти длину (если уж кодишь в C style). ИЗБЕГАЙ БУФЕРОВ НА СТЭКЕ С ФИКС РАЗМЕРОМ, В ПРОДЕ ПИЗДЕЦ БУДЕТ!!!!!!!!
If the buffer is too small to hold the module name, the string is truncated to nSize characters including the terminating null character, the function returns nSize, and the function sets the last error to ERROR_INSUFFICIENT_BUFFER.
return isAdmin != FALSE;
это можно сокращать до "return isAdmin;"
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Не стоит выделять столько места не стэке. Лучше вызвать GetModuleFileName с нулевыми параметрами, получить размер и выделить место в куче (не и потом освободить само собой).
Почитай внимательней доку на все *W функции. Обрати внимание на "\\?\".
Да и сам на коммерс проекте столкнулся с проблемой, что пути на самом деле могут и больше быть))) Особенно если туда smb шару захерачить (в твоём случае такое не случится конечн). Так что забудь про константу MAX_PATH и всегда старася найти длину (если уж кодишь в C style). ИЗБЕГАЙ БУФЕРОВ НА СТЭКЕ С ФИКС РАЗМЕРОМ, В ПРОДЕ ПИЗДЕЦ БУДЕТ!!!!!!!!


это можно сокращать до "return isAdmin;"
реализовать динамическое выделение памяти для буфера, что позволяет избежать проблем с переполнением буфера в стеке и обрабатывать пути к файлам любой длины. На ваш вкус.

В любом случае, это просто опыт.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх