您的位置:首页 > 编程语言

masm32编程判断当前帐户是否拥有管理员权限方法1

2006-12-06 13:51 411 查看
; 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 Start 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息