; Function: Demo the way to determine if you have administrator privileges
; Author: Purple Endurer
; Dev: Win XP SP2 + MASM32 v8
;
; log
; ---------
; 2006-12-06 Passed!
; 2006-12-05 Created!
.486
.model
flat,
stdcall
option
casemap:
none
;case sensitive
include /masm32/
include/windows.inc
include /masm32/
include/kernel32.inc
includelib /masm32/
lib/kernel32.lib
include /masm32/
include/user32.inc
includelib /masm32/
lib/user32.lib
include /masm32/
include/advapi32.inc
includelib /masm32/
lib/advapi32.lib
IsAdmin
PROTO
d_UseGlobeVar
equ 0
.data
g_szAppName
db
"IsAdmin", 0
g_szHaveAdminPriv
db
"You have Admin privileges!", 0
g_szNoAdminPriv
db
"You don't have Admin privileges!", 0
if d_UseGlobeVar eq 1
g_stSiaNtAuthority SID_IDENTIFIER_AUTHORITY <SECURITY_NT_AUTHORITY>
endif
.code
Start:
invoke IsAdmin
.if
eax ==
TRUE
mov
eax,
offset g_szHaveAdminPriv
.else
mov
eax,
offset g_szNoAdminPriv
.endif
invoke MessageBox, NULL,
eax,
offset g_szAppName, MB_OK
invoke ExitProcess, 0
IsAdmin
proc
local hCurrentThread, hAccessToken, hCurrentProcess: HANDLE
local dwInfoBufferSize, pInfoBuffer, dwSuccess, psidAdministrators:
dword
if d_UseGlobeVar eq 0
local stSiaNtAuthority: SID_IDENTIFIER_AUTHORITY
endif
invoke GetCurrentThread
mov hCurrentThread,
eax
invoke OpenThreadToken, hCurrentThread, TOKEN_QUERY,
TRUE,
ADDR hAccessToken
.if
eax == 0
invoke GetLastError
cmp
eax, ERROR_NO_TOKEN
je @F
mov
eax,
FALSE
jmp @IsAdminRet
@@:
invoke GetCurrentProcess
mov hCurrentProcess,
eax
invoke OpenProcessToken, hCurrentProcess, TOKEN_QUERY,
ADDR hAccessToken
or
eax,
eax
jnz @F
mov
eax,
FALSE
jmp @IsAdminRet
.endif
@@:
invoke GetTokenInformation, hAccessToken, TokenGroups, NULL, NULL,
ADDR dwInfoBufferSize
.if dwInfoBufferSize > 0
invoke GlobalAlloc, GMEM_FIXED, dwInfoBufferSize
mov pInfoBuffer,
eax
invoke GetTokenInformation, hAccessToken, TokenGroups, pInfoBuffer, dwInfoBufferSize,
ADDR dwInfoBufferSize
.endif
mov dwSuccess,
eax
invoke CloseHandle, hAccessToken
cmp dwSuccess, 0
jne @F
mov
eax,
FALSE
jmp @IsAdminRet
@@:
if d_UseGlobeVar eq 1
invoke AllocateAndInitializeSid,
offset g_stSiaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
ADDR psidAdministrators
else
invoke RtlZeroMemory,
addr stSiaNtAuthority, sizeof stSiaNtAuthority
mov
byte
ptr [stSiaNtAuthority+5], 5
;SECURITY_NT_AUTHORITY equ {0,0,0,0,0,5}
invoke AllocateAndInitializeSid,
addr stSiaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
ADDR psidAdministrators
endif
or
eax,
eax
jnz @F
mov
eax,
FALSE
jmp @IsAdminRet
@@:
mov dwSuccess,
FALSE
mov
ebx, pInfoBuffer
mov
ecx, TOKEN_GROUPS.GroupCount[
ebx]
xor
esi,
esi
.while
esi <
ecx
push
esi
push
ecx
mov
ecx, TOKEN_GROUPS.Groups.Sid[
ebx]
mov
eax, sizeof TOKEN_GROUPS.Groups
xor
edx,
edx
mul
esi
;eax * esi -> eax
add
ecx,
eax
invoke EqualSid, psidAdministrators,
ecx
pop
ecx
pop
esi
.if
eax != 0
mov dwSuccess,
TRUE
.break
.endif
inc
esi
.endw
invoke FreeSid, psidAdministrators
invoke GlobalFree, pInfoBuffer
mov
eax, dwSuccess
@IsAdminRet:
ret
IsAdmin
endp
end