//Declare our class exeptions
EThunkError = class(Exception);
EFOpenError = class(Exception);
var
User16Handle : THandle = 0;
GetFSR : TGetFSR = nil;
//Prototypes for some undocumented API
functionLoadLibrary16(LibFileName: PAnsiChar): THandle; stdcall; externalkernel32 index35;
functionFreeLibrary16(LibModule: THandle): THandle; stdcall; externalkernel32 index36;
functionGetProcAddress16(Module: THandle; ProcName: LPCSTR): TFarProc; stdcall; externalkernel32 index37;
procedureQT_Thunk; cdecl; external'kernel32.dll' name'QT_Thunk';
{$StackFrames On}
functionGetFeeSystemResources(SysResource: Word): Word;
varEatStackSpace: String[$3C];
begin
// Ensure buffer isn't optimised away
EatStackSpace := '';
@GetFSR:=GetProcAddress16(User16Handle, 'GETFREESYSTEMRESOURCES');
if Assigned(GetFSR) then //Test result for nil
asm
//Manually push onto the stack type of resource to be checked first
push SysResource
//Load routine address into EDX
mov edx, [GetFSR]
//Call routine
call QT_Thunk
//Assign result to the function
mov @Result, ax
end
else raiseEFOpenError.Create('GetProcAddress16 failed!');
end;
initialization
//Check Platform for Windows 9x
ifWin32Platform <> VER_PLATFORM_WIN32_WINDOWS then raiseEThunkError.Create('Flat thunks only supported under Windows 9x');
//Load 16-bit DLL (USER.EXE)
User16Handle:= LoadLibrary16(PChar('User.exe'));
ifUser16Handle < 32 then raiseEFOpenError.Create('LoadLibrary16 failed!');
finalization
//Release 16-bit DLL when done
ifUser16Handle <> 0 thenFreeLibrary16(User16Handle);
end.
Как проверить, имеем ли мы административные привилегии в системе?
Nomadicпишет:
// Routine: check if the user has administrator provileges
// Was converted from C source by Akzhan Abdulin. Not properly tested.
typePTOKEN_GROUPS = TOKEN_GROUPS^;
functionRunningAsAdministrator(): Boolean;
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
psidAdmin: PSID;
ptg: PTOKEN_GROUPS = nil;
htkThread: Integer; { HANDLE }
cbTokenGroups: Longint; { DWORD }
iGroup: Longint; { DWORD }
bAdmin: Boolean;
begin
Result := false;
if notOpenThreadToken(GetCurrentThread(), // get security token
TOKEN_QUERY, FALSE, htkThread) then
ifGetLastError() = ERROR_NO_TOKEN then begin
if notOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, htkThread) thenExit;
end elseExit;
ifGetTokenInformation(htkThread, // get #of groups
TokenGroups, nil, 0, cbTokenGroups) thenExit;
ifGetLastError() <> ERROR_INSUFFICIENT_BUFFER thenExit;
ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));
if notAssigned(ptg) thenExit;
if notGetTokenInformation(htkThread, // get groups
TokenGroups, ptg, cbTokenGroups, cbTokenGroups) thenExit;
if notAllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) thenExit;
iGroup := 0;
whileiGroup < ptg^.GroupCount do// check administrator group
begin
ifEqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then begin
Result := TRUE;
break;
end;
Inc(iGroup);
end;
FreeSid(psidAdmin);
end;
Два метода в одном флаконе:
#include
#include
#include
#pragma hdrstop
#pragma comment(lib, "netapi32.lib")
// My thanks to Jerry Coffin (jcoffin@taeus.com)
// for this much simpler method.
bool jerry_coffin_method() {
bool result;
DWORD rc;
wchar_t user_name[256];
USER_INFO_1 *info;
DWORD size = sizeof(user_name);
GetUserNameW(user_name, &size);
rc = NetUserGetInfo(NULL, user_name, 1, (byte **)&info);
if (rc != NERR_Success) return false;
result = info->usri1_priv == USER_PRIV_ADMIN;
NetApiBufferFree(info);
return result;
}
bool look_at_token_method() {
int found;
DWORD i, l;
HANDLE hTok;
PSID pAdminSid;
SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;
byte rawGroupList[4096];
TOKEN_GROUPS& groupList = *((TOKEN_GROUPS *)rawGroupList);
if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hTok)) {
printf( "Cannot open thread token, trying process token [%lu].\n", GetLastError());
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hTok)) {
printf("Cannot open process token, quitting [%lu].\n", GetLastError());
return 1;
}
}
// normally, I should get the size of the group list first, but ...
l = sizeof rawGroupList;
if (!GetTokenInformation(hTok, TokenGroups, &groupList, l, &l)) {
printf( "Cannot get group list from token [%lu].\n", GetLastError());
return 1;
}
// here, we cobble up a SID for the Administrators group, to compare to.
if (!AllocateAndInitializeSid(&ntAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid )) {
Читать дальше