AdjustTokenPrivileges - Error 998



  • Hallo zusammen, habe gerade erst mit ASM angefangen, also lacht bitte nicht, wenn ihr den Code seht 😉

    Folgendes Problem; ich möchte meiner Anwendung das SeDebugPrivilege-Privileg geben.
    Die Funktion AdjustTokenPrivileges liefert jedoch über GetLastError() den Fehler 998, also "Invalid access to memory location."

    Hier der Code:

    seDBG DB "SeDebugPrivilege", 0
    hID DD ?
    tkp TOKEN_PRIVILEGES <>
    hToken DD ?
    
        invoke GetCurrentProcess
    	mov hID, EAX
    	invoke OpenProcessToken, hID, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, OFFSET hToken
    	cmp EAX, 0
    	jle Err
    	invoke LookupPrivilegeValue, NULL, OFFSET seDBG, OFFSET tkp.Privileges[0].Luid
    	cmp EAX, 0
    	jle Err
    	mov tkp.PrivilegeCount, 1
    	mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
    	invoke SetLastError, 0
    	invoke AdjustTokenPrivileges, OFFSET hToken, 0, OFFSET tkp, 0, 0, 0
    	cmp EAX, 0
    	jle Err ;Tritt ein
    	ret
    

    Hoffe ihr könnt mir helfen, habe Google schon durch 😕



  • GastASM schrieb:

    nvoke AdjustTokenPrivileges, OFFSET hToken, 0, OFFSET tkp, 0, 0, 0

    😮



  • Und etwas genauer? 😉
    Wie gesagt, ich hab gerade erst mit Assembler angefangen...



  • Edit:
    Wenn ich OFFSET weg lasse, bekomme ich den selben Fehler an der gleichen Stelle...



  • Niemand?...



  • Du brauchst Administrator Rechte damit du das debug-Privileg setzten kannst:

    include masm32rt.inc
    ...
    SetDebugPrivilege proc 
    LOCAL hToken:HANDLE
    LOCAL tp:TOKEN_PRIVILEGES
    LOCAL luid:LUID
    
        mov edx,rv(GetCurrentProcess)
        .if rv(OpenProcessToken,edx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ADDR hToken)
            .if rv(LookupPrivilegeValue,0,"SeDebugPrivilege",ADDR luid)
                mov tp.PrivilegeCount,1
                m2m tp.Privileges.Luid.LowPart,luid.LowPart
                m2m tp.Privileges.Luid.HighPart,luid.HighPart
                mov tp.Privileges.Attributes,SE_PRIVILEGE_ENABLED
                .if rv(AdjustTokenPrivileges,hToken,FALSE,ADDR tp,SIZEOF TOKEN_PRIVILEGES,0,0) 	
                    .if rv(GetLastError) != ERROR_NOT_ALL_ASSIGNED
                        invoke CloseHandle,hToken
                        mov eax,1
                        ret
                    .endif
                .endif
            .endif
            invoke CloseHandle,hToken
        .endif
        xor eax,eax
        ret	
    SetDebugPrivilege endp
    


  • Hey, danke, hab´s aber gerade selber hinbekommen, aber jetzt wird´s echt lustig:

    Was ist der Unterschied:

    .DATA
    tkp TOKEN_PRIVILEGES <>
    hToken DWORD ?
    seDBG DB "SeDebugPrivilege", 0
    .CODE
    ;...
    
    .DATA
    seDBG DB "SeDebugPrivilege", 0
    tkp TOKEN_PRIVILEGES <>
    hToken DWORD ?
    .CODE
    ;...
    

    Letzteres funktioniert nicht, "AdjustTokenPrivileges" gibt No_Access (998) zurück !

    Gibt es da eine logische Erklärung ???



  • GastASM schrieb:

    Gibt es da eine logische Erklärung ???

    ja, das aligment. Einige API-Strukturen erwarten ein aligment von 4.
    Ansonsten würde ich dir empfehlen von den globalen Variablen Abstand zu nehmen. Auch das cmp+jcc-Gefummel kann man sich in Rahmen der WinAPI-Programmierung sparen und MASMs Hochsprachenkonstrukte verwendet.


Anmelden zum Antworten