AdjustTokenPrivileges will nicht so, wie ich das will

25/03/2009 - 01:10 von Ralph rkhb Bauer | Report spam
Hallo,

Für ein Windows-Programm brauche ich Backup-Privilegien. Leider wirft mir
meine Nasm-Golink-Kombination immer bei AdjustTokenPrivileges einen Fehler 998
(Unzulàssiger Zugriff auf einen Speicherbereich) aus. Ich habe mal
ein einfaches Beispiel (ohne Schnickschnack) entworfen:

In C++ funktioniert:

#pragma comment (lib, "advapi32.lib")
#include <stdio.h>
#include <windows.h>

HANDLE hToken;
TOKEN_PRIVILEGES tkp = {1,0,0,SE_PRIVILEGE_ENABLED};

int EnableBackupPriv ()
{
if (!OpenProcessToken (GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
return 1;
if (!LookupPrivilegeValue (NULL,SE_BACKUP_NAME,&tkp.Privileges[0].Luid))
return 2;
if (!AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, NULL, NULL)) return 3;
return 0;
}

int main (void)
{
if (int err=EnableBackupPriv())
{
LPVOID lpMsgBuf;
FormatMessage(0x13FF,0,GetLastError(),0x0400,(LPTSTR)&lpMsgBuf,0,0);
printf ("%d - %s ", err, lpMsgBuf);
LocalFree(lpMsgBuf);
return 0;
}
printf ("alles ok");
return 1;
}

Das Gleiche in Nasm-GoLink funktioniert nicht:

; Name: test.nasm
; Assemblieren: nasm.exe -fwin32 -o test.obj test.nasm
; Linken: GoLink.exe /console /entry _main test.obj _
; kernel32.dll shell32.dll advapi32.dll msvcrt.dll

BITS 32

%MACRO m_invoke 1-*
%if %0 > 1
%rep %0-1
%rotate -1
push %1
%endrep
%rotate -1
%endif
call %1
%ENDMACRO

%MACRO m_printf 2-* ; "Format", Argument(e)
EXTERN printf
pushad
jmp short %%SkipData
%%fmt: db %1,10,0
%%SkipData:
%rep %0-1
%rotate -1
push %1
%endrep
push %%fmt
call printf
add esp, (%0*4)
popad
%ENDMACRO

%MACRO m_check_zero_err 0
EXTERN GetLastError, FormatMessageA, LocalFree, ExitProcess
test eax, eax
jne %%SkipErr
mov esi, __LINE__
call GetLastError
mov edi, eax
m_invoke FormatMessageA, 0x13FF, 0, eax, 0x0400, %%Buffer, 0, 0
m_printf "%d GetLastError=%i(0x%08X) - %s",esi,edi,edi,dword[%%Buffer]
m_invoke LocalFree,%%Buffer
m_invoke ExitProcess,1
SECTION .bss
%%Buffer RESD 1
%%ErrNum RESD 1
SECTION .text
%%SkipErr:
%ENDMACRO

SECTION .data
hToken dd 0
SE_BACKUP_NAME db "SeBackupPrivilege",0
TOKEN_PRIVILEGES dd 1,0,0,2

SECTION .text
GLOBAL _main

EnableDebugPriv:
EXTERN GetCurrentProcess,OpenProcessToken,
EXTERN LookupPrivilegeValueA,AdjustTokenPrivileges

;OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
call GetCurrentProcess
push hToken
push 0x20
push eax
call OpenProcessToken
m_check_zero_err

; LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &tp.Privileges[0].Luid)
push (TOKEN_PRIVILEGES + 4)
push SE_BACKUP_NAME
push 0
call LookupPrivilegeValueA
m_check_zero_err

; AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL)
push 0
push 0
push 0
push TOKEN_PRIVILEGES
push 0
push dword[hToken]
call AdjustTokenPrivileges
m_check_zero_err

ret

_main:
call EnableDebugPriv
mov eax, 0
ret

Die Makros sind nur für die Fehlerausgabe und haben mit dem eigentlichen
Algorithmus nichts zu tun. Ich habe gedebuggt und geguggelt und die
assemblierten Ausgaben verglichen und nachgedacht und bin mit meinem Latein am
Ende. Meiner Meinung nach sind beide Programme korrekt. Hat jemand noch eine
Idee, woran es liegen könnte?

viele grüße
ralph
 

Lesen sie die antworten

#1 Ralph rkhb Bauer
25/03/2009 - 17:40 | Warnen spam
Ralph 'rkhb' Bauer schrieb:

SECTION .data
hToken dd 0
SE_BACKUP_NAME db "SeBackupPrivilege",0
TOKEN_PRIVILEGES dd 1,0,0,2



Gelöst: TOKEN_PRIVILEGES war misaligned. Ein 'ALIGNB 4' hat Abhilfe
geschaffen. Bisher dachte ich immer, ein ungünstiges Alignment führt lediglich
zu Straftakten, und das Alignment erst mit demn Feinschliff am Ende des
Projektes gemacht.

viele grüße
ralph

Ähnliche fragen