GetSecurityInfo function (aclapi.h) - Win32 apps | Microsoft Learn ConvertSecurityDescriptorToStringSecurityDescriptorW function (sddl.h) - Win32 apps | Microsoft Learn SDDL for Device Objects - Windows drivers | Microsoft Learn (сравнить через strcmp\wcscmp) Код (C): GetSecurityInfo(handle, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, &pSidOwner, &pSidGroup, nullptr, nullptr, &pSecurityDescriptor); ConvertSecurityDescriptorToStringSecurityDescriptorW(pSecurityDescriptor, SDDL_REVISION_1, OWNER_SECURITY_INFORMATION, &StringSecurityDescriptorOwner, nullptr); ConvertSecurityDescriptorToStringSecurityDescriptorW(pSecurityDescriptor, SDDL_REVISION_1, GROUP_SECURITY_INFORMATION, &StringSecurityDescriptorGroup, nullptr); if (wcscmp(StringSecurityDescriptorOwner, TEXT("O:BA")) == 0) {} if (wcscmp(StringSecurityDescriptorOwner, TEXT("O:SY")) == 0) {} if (wcscmp(StringSecurityDescriptorGroup, TEXT("G:BA")) == 0) {} if (wcscmp(StringSecurityDescriptorGroup, TEXT("G:SY")) == 0) {}
IsUserAnAdmin() из Shell32.dll (без параметров) возвращает True, если запуск под админом, иначе False. Не смотря на то, что мокрые считают её устаревшей, функция благополучно дожила от XP до Win10.
Там же под капотом все тот же CheckTokenMemberShip , по факту это просто обертка. ТС как всегда, год не ходил на васм - все по прежнему. Открыл бы для себя хотя бы чат_гпт или это бот и пишет, я хз.
примерно вот так Код (ASM): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\advapi32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\advapi32.lib TokenIntegrityLevel equ 25 SID_AND_ATTRIBUTES STRUCT Sid DWORD ? Attributes DWORD ? SID_AND_ATTRIBUTES ENDS .data msgFormat db "Process Integrity Level: %s", 0 caption db "Process Privileges", 0 debugMsgStart db "Starting CheckIntegrityLevel", 0 debugMsgOpenToken db "OpenProcessToken result: %d", 0 debugMsgGetInfo db "GetTokenInformation result: %d", 0 debugMsgIntegrityLevel db "Integrity Level: %d", 0 debugBuffer db 256 dup(0) resultBuffer db 256 dup(0) strSystem db "System", 0 strHigh db "High", 0 strMedium db "Medium", 0 strLow db "Low", 0 strUnknown db "Unknown", 0 .code CheckIntegrityLevel proc LOCAL hToken:HANDLE LOCAL tkIntegrityLevel[32]:BYTE LOCAL dwSize:DWORD LOCAL dwIntegrityLevel:DWORD LOCAL pSid:DWORD invoke OutputDebugString, addr debugMsgStart invoke OpenProcessToken, -1, TOKEN_QUERY, addr hToken push eax invoke wsprintf, addr debugBuffer, addr debugMsgOpenToken, eax invoke OutputDebugString, addr debugBuffer pop eax test eax, eax jz Failed mov dwSize, 32 invoke GetTokenInformation, hToken, TokenIntegrityLevel, addr tkIntegrityLevel, 32, addr dwSize push eax invoke wsprintf, addr debugBuffer, addr debugMsgGetInfo, eax invoke OutputDebugString, addr debugBuffer pop eax test eax, eax jz CloseHandleAndExit mov eax, DWORD PTR [tkIntegrityLevel] mov pSid, eax add pSid, 8 ; Skip over SID_IDENTIFIER_AUTHORITY mov eax, DWORD PTR [pSid] and eax, 0FFFFh mov dwIntegrityLevel, eax push eax invoke wsprintf, addr debugBuffer, addr debugMsgIntegrityLevel, eax invoke OutputDebugString, addr debugBuffer pop eax cmp eax, 04000h jae SystemLevel cmp eax, 03000h jae HighLevel cmp eax, 02000h jae MediumLevel cmp eax, 01000h jae LowLevel jmp UnknownLevel SystemLevel: mov eax, offset strSystem jmp CloseHandleAndExit HighLevel: mov eax, offset strHigh jmp CloseHandleAndExit MediumLevel: mov eax, offset strMedium jmp CloseHandleAndExit LowLevel: mov eax, offset strLow jmp CloseHandleAndExit UnknownLevel: mov eax, offset strUnknown jmp CloseHandleAndExit Failed: mov eax, offset strUnknown CloseHandleAndExit: invoke CloseHandle, hToken ret CheckIntegrityLevel endp start: call CheckIntegrityLevel push eax push offset msgFormat push offset resultBuffer call wsprintf add esp, 12 invoke MessageBox, NULL, addr resultBuffer, addr caption, MB_OK invoke ExitProcess, 0 end start
забавно видеть массив cmp eax,.. для выбора соответствующих строк.. Код (ASM): cmp eax, 04000h jae SystemLevel cmp eax, 03000h jae HighLevel cmp eax, 02000h jae MediumLevel cmp eax, 01000h jae LowLevel jmp UnknownLevel SystemLevel: mov eax, offset strSystem jmp CloseHandleAndExit HighLevel: mov eax, offset strHigh jmp CloseHandleAndExit MediumLevel: mov eax, offset strMedium jmp CloseHandleAndExit LowLevel: mov eax, offset strLow jmp CloseHandleAndExit UnknownLevel: mov eax, offset strUnknown jmp CloseHandleAndExit Failed: mov eax, offset strUnknown CloseHandleAndExit: invoke CloseHandle, hToken ret это хорошо, что здесь всего 4 возможных варианта (хотя должно быть 6 с доп.константами 5000h и 7000h), а если нужно будет прочекать овер 100 значений, тогда как?
Тимур, стоит глянуть по ссылке в топик Сам себе Iczelion (2007 ) в раздел Внутри процедуры окна, конкретно Способ шестой — последовательное приближение
Mikl___, угу.. первые(3) способа сразу в топку, т.к. это те-же яйки cmp/jump только сбоку. а вот табличные методы начиная с 4 уже рулят - к ним можно добавить ещё один для случая, когда на входе строго последовательное значение типа 0,1,2,3,4,..N (тупо используем его как индекс в таблице адресов).