delphi4arab منتديات دلفي للعرب

نسخة كاملة : Check if ASLR is enabled
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم
إجراء للتحقق من Address space layout randomization مفعلة أم لا

PHP كود :
unit uCheckASLR;

// Original C++ Source: https://stackoverflow.com/questions/47105480/how-to-check-if-aslr-is-enabled-for-a-process
// Converted to Delphi by Agmcz 28-12-2017 2:25:32

interface

uses
  Windows
;

function 
CheckASLR(dwProcessId: ULONG; out bASLR: Boolean): ULONG;

implementation

const
 
 PROCESS_QUERY_LIMITED_INFORMATION = $1000;

type
 TSectionImageInformation  
= record
    TransferAddress
: Pointer;
 
   ZeroBits: ULONG;
 
   MaximumStackSize: ULONG;
 
   CommittedStackSize: ULONG;
 
   SubSystemType: ULONG;
 
   MinorSubsystemVersion: Word;
 
   MajorSubsystemVersion: Word;
 
   GpValue: ULONG;
 
   ImageCharacteristics: Word;
 
   DllCharacteristics: Word;
 
   Machine: Word;
 
   ImageContainsCode: Boolean;
 
   ImageFlags: Byte;
 
   LoaderFlags: ULONG;
 
   ImageFileSize: ULONG;
 
   CheckSum: ULONG;
 
 end;

 
 PROCESSINFOCLASS = (
 
   ProcessBasicInformation,
 
   ProcessQuotaLimits,
 
   ProcessIoCounters,
 
   ProcessVmCounters,
 
   ProcessTimes,
 
   ProcessBasePriority,
 
   ProcessRaisePriority,
 
   ProcessDebugPort,
 
   ProcessExceptionPort,
 
   ProcessAccessToken,
 
   ProcessLdtInformation,
 
   ProcessLdtSize,
 
   ProcessDefaultHardErrorMode,
 
   ProcessIoPortHandlers,
 
   ProcessPooledUsageAndLimits,
 
   ProcessWorkingSetWatch,
 
   ProcessUserModeIOPL,
 
   ProcessEnableAlignmentFaultFixup,
 
   ProcessPriorityClass,
 
   ProcessWx86Information,
 
   ProcessHandleCount,
 
   ProcessAffinityMask,
 
   ProcessPriorityBoost,
 
   ProcessDeviceMap,
 
   ProcessSessionInformation,
 
   ProcessForegroundInformation,
 
   ProcessWow64Information,
 
   ProcessImageFileName,
 
   ProcessLUIDDeviceMapsEnabled,
 
   ProcessBreakOnTermination,
 
   ProcessDebugObjectHandle,
 
   ProcessDebugFlags,
 
   ProcessHandleTracing,
 
   ProcessIoPriority,
 
   ProcessExecuteFlags,
 
   ProcessResourceManagement,
 
   ProcessCookie,
 
   ProcessImageInformation,
 
   MaxProcessInfoClass);

type
  NTSTATUS 
= LongWord;

function 
NtQueryInformationProcess(ProcessHandle: THandle; ProcessInformationClass: PROCESSINFOCLASS; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: PULONG ): LongInt; stdcall; external 'ntdll.dll';
function 
RtlNtStatusToDosError(Status: NTSTATUS): Integer; stdcall; external 'ntdll.dll';

function 
CheckASLR(dwProcessId: ULONG; out bASLR: Boolean): ULONG;
var
 
hProcess: THandle;
 
sii: TSectionImageInformation;
 
status: NTSTATUS;
begin
  hProcess 
:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, dwProcessId);
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then
  begin
    status 
:= NtQueryInformationProcess(hProcess, ProcessImageInformation, @sii, SizeOf(sii), 0);
 
   CloseHandle(hProcess);
 
   if 0 <= status then
    begin
      bASLR 
:= Boolean(sii.ImageFlags);
 
     Result := NOERROR;
 
     Exit;
 
   end;
 
   Result := RtlNtStatusToDosError(status);
 
   Exit;
 
 end;
 
 Result := GetLastError;
end;


end. 
مشكوور اخي
لكن ما فائدتها ! ممكن مثال عملي
فحص هيدر PE وتحقق من ASLR

PHP كود :
{************************************
* 
Coded by Agmcz                    *
* 
Hints by naquadria                *
* 
Date: 2018-01-07                  *
************************************}

unit uCheckASLR;

interface

uses
  Windows
;

function 
CheckASLR(const FileName: string): Boolean;

implementation

const
 
 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = $0040;
 
 IMAGE_DIRECTORY_ENTRY_BASERELOC = 5;

function 
CheckASLR(const FileName: string): Boolean;
var
 
 hFile: THandle;
 
 hMapping: DWORD;
 
 pMap: Pointer;
 
 dwSize: DWORD;
 
 IDH: PImageDosHeader;
 
 INH: PImageNtHeaders;
 
 ISH: PImageSectionHeader;
 
 n: Word;
 
 dwRelocAddr, dwRelocSize: DWORD;
begin
  Result 
:= False;
 
 hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 
 if hFile <> INVALID_HANDLE_VALUE then
  begin
    dwSize 
:= GetFileSize(hFile, nil);
 
   hMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, dwSize, nil);
 
   if hMapping <> 0 then
    begin
      pMap 
:= MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
 
     if pMap <> nil then
      begin
        IDH 
:= PImageDosHeader(pMap);
 
       if IDH.e_magic = IMAGE_DOS_SIGNATURE then
        begin
          INH 
:= PImageNtHeaders(DWORD(pMap) + LongWord(IDH._lfanew));
 
         if INH.Signature = IMAGE_NT_SIGNATURE then
          begin
            if 
(INH.OptionalHeader.DllCharacteristics and IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) = IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE then
            begin
              ISH 
:= PImageSectionHeader(DWORD(pMap) + LongWord(IDH._lfanew) + SizeOf(DWORD) + SizeOf(INH.FileHeader) + INH.FileHeader.SizeOfOptionalHeader);
 
             dwRelocAddr := INH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
 
             dwRelocSize := INH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
 
             if (dwRelocAddr <> 0) and (dwRelocSize <> 0) then
              begin
                for n 
:= 0 to INH.FileHeader.NumberOfSections - 1 do
 
               begin
                  if ISH
.VirtualAddress = dwRelocAddr then
                  begin
                    if 
(ISH.Misc.VirtualSize <> 0) and  (ISH.PointerToRawData <> 0) and (ISH.SizeOfRawData <> 0) then
                      Result 
:= True;
 
                   Break;
 
                 end;
 
                 Inc(ISH);
 
               end;
 
             end;
 
           end;
 
         end;
 
       end;
 
       UnmapViewOfFile(pMap);
 
     end;
 
     CloseHandle(hMapping);
 
   end;
 
   CloseHandle(hFile);
 
 end;
end;

end. 

(07-01-2018, 02:17 PM)مبرمج حر كتب : [ -> ]مشكوور اخي
لكن ما فائدتها ! ممكن مثال عملي
(مقتبس من حل تمرين chimera#01 من منتدى AT4RE)
هي نوع من أنواع الحماية قامت شركة مايكروسوفت بإضافتها في أنظمة التشغيل خاصتها منذ صدور نظام التشغيل فيستا كمحاولة لمنع التنبؤ بعناوين الذاكرة التي يتم فيها تحميل البرامج التنفيذية, هذه الطريقة كان هدفها جعل لودر نظام التشغيل يحمل البرنامج التنفيدي في عنوان عشوائي في كل مرة يتم فيها تشغيله وعند إعادة التشغيل للجهاز.

يعني عند عدم تفعيل ASLR  يكون عنوان ImageBase ثابت موقعه
على غرار تفعيل والذي سيكون متغير.
ألق نظرة هنا
How can I enable DEP/NX and ASLR on a Delphi 2006 or earlier executable?
يتم إستعمال التوجيه SetPEOptFlags
كود :
//{$SetPEOptFlags $100} //to set the ASLR flag //{$SetPEOptFlags $40} //to set the DEP flag {$SetPEOptFlags $140} //to set both DEP + ASLR in one line
السلام عليكم
بعض التصحيحات على الكود لأنه توجد أخطاء
PHP كود :
unit uCheckASLR;

// Original C++ Source: https://stackoverflow.com/questions/47105480/how-to-check-if-aslr-is-enabled-for-a-process
// Ported to Delphi by Agmcz 28-12-2017 2:25:32
// Fix 04-08-2018 10:56:25

interface

uses
  Windows
;

function 
CheckASLR(dwProcessId: LongWord; out bASLR: Boolean): LongWord;

implementation

const
 
 PROCESS_QUERY_LIMITED_INFORMATION = $1000;

type
 TSectionImageInformation  
= record
    TransferAddress
: Pointer;
 
   ZeroBits: LongWord;
 
   MaximumStackSize: LongWord;
 
   CommittedStackSize: LongWord;
 
   SubSystemType: LongWord;
 
   MinorSubsystemVersion: Word;
 
   MajorSubsystemVersion: Word;
 
   GpValue: LongWord;
 
   ImageCharacteristics: Word;
 
   DllCharacteristics: Word;
 
   Machine: Word;
 
   ImageContainsCode: Boolean;
 
   ImageFlags: Byte;
 
   LoaderFlags: LongWord;
 
   ImageFileSize: LongWord;
 
   CheckSum: LongWord;
 
 end;

 
 PROCESSINFOCLASS = (
 
   ProcessBasicInformation,
 
   ProcessQuotaLimits,
 
   ProcessIoCounters,
 
   ProcessVmCounters,
 
   ProcessTimes,
 
   ProcessBasePriority,
 
   ProcessRaisePriority,
 
   ProcessDebugPort,
 
   ProcessExceptionPort,
 
   ProcessAccessToken,
 
   ProcessLdtInformation,
 
   ProcessLdtSize,
 
   ProcessDefaultHardErrorMode,
 
   ProcessIoPortHandlers,
 
   ProcessPooledUsageAndLimits,
 
   ProcessWorkingSetWatch,
 
   ProcessUserModeIOPL,
 
   ProcessEnableAlignmentFaultFixup,
 
   ProcessPriorityClass,
 
   ProcessWx86Information,
 
   ProcessHandleCount,
 
   ProcessAffinityMask,
 
   ProcessPriorityBoost,
 
   ProcessDeviceMap,
 
   ProcessSessionInformation,
 
   ProcessForegroundInformation,
 
   ProcessWow64Information,
 
   ProcessImageFileName,
 
   ProcessLUIDDeviceMapsEnabled,
 
   ProcessBreakOnTermination,
 
   ProcessDebugObjectHandle,
 
   ProcessDebugFlags,
 
   ProcessHandleTracing,
 
   ProcessIoPriority,
 
   ProcessExecuteFlags,
 
   ProcessResourceManagement,
 
   ProcessCookie,
 
   ProcessImageInformation,
 
   MaxProcessInfoClass);

type
  NTSTATUS 
= LongWord;

function 
NtQueryInformationProcess(ProcessHandle: THandle; ProcessInformationClass: PROCESSINFOCLASS; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: PULONG ): LongInt; stdcall; external 'ntdll.dll';
function 
RtlNtStatusToDosError(Status: NTSTATUS): Integer; stdcall; external 'ntdll.dll';

function 
ImageDynamicallyRelocated(sii: TSectionImageInformation): Boolean;
begin
  Result 
:= (sii.ImageFlags and (1 shl 2)) = 1;
end;

function 
CheckASLR(dwProcessId: LongWord; out bASLR: Boolean): LongWord;
var
 
hProcess: THandle;
 
sii: TSectionImageInformation;
 
status: NTSTATUS;
begin
  hProcess 
:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, dwProcessId);
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then
  begin
    status 
:= NtQueryInformationProcess(hProcess, ProcessImageInformation, @sii, SizeOf(sii), 0);
 
   CloseHandle(hProcess);
 
   if 0 <= status then
    begin
      bASLR 
:= ImageDynamicallyRelocated(sii);
 
     Result := NOERROR;
 
     Exit;
 
   end;
 
   Result := RtlNtStatusToDosError(status);
 
   Exit;
 
 end;
 
 Result := GetLastError;
end;

end. 
مشكل في دالة ImageDynamicallyRelocated تم إصلاحه

PHP كود :
unit uCheckASLR;

// Original C++ Source: https://stackoverflow.com/questions/47105480/how-to-check-if-aslr-is-enabled-for-a-process
// Ported to Delphi by Agmcz 28-12-2017 2:25:32
// Fix 08-04-2018 10:56:25
// Fix2 01-05-2018 2:28:15

interface

uses
  Windows
;

function 
CheckASLR(dwProcessId: LongWord; out bASLR: Boolean): LongWord;

implementation

const
 
 PROCESS_QUERY_LIMITED_INFORMATION = $1000;

type
 TSectionImageInformation  
= record
    TransferAddress
: Pointer;
 
   ZeroBits: LongWord;
 
   MaximumStackSize: LongWord;
 
   CommittedStackSize: LongWord;
 
   SubSystemType: LongWord;
 
   MinorSubsystemVersion: Word;
 
   MajorSubsystemVersion: Word;
 
   GpValue: LongWord;
 
   ImageCharacteristics: Word;
 
   DllCharacteristics: Word;
 
   Machine: Word;
 
   ImageContainsCode: Boolean;
 
   ImageFlags: Byte;
 
   LoaderFlags: LongWord;
 
   ImageFileSize: LongWord;
 
   CheckSum: LongWord;
 
 end;

 
 PROCESSINFOCLASS = (
 
   ProcessBasicInformation,
 
   ProcessQuotaLimits,
 
   ProcessIoCounters,
 
   ProcessVmCounters,
 
   ProcessTimes,
 
   ProcessBasePriority,
 
   ProcessRaisePriority,
 
   ProcessDebugPort,
 
   ProcessExceptionPort,
 
   ProcessAccessToken,
 
   ProcessLdtInformation,
 
   ProcessLdtSize,
 
   ProcessDefaultHardErrorMode,
 
   ProcessIoPortHandlers,
 
   ProcessPooledUsageAndLimits,
 
   ProcessWorkingSetWatch,
 
   ProcessUserModeIOPL,
 
   ProcessEnableAlignmentFaultFixup,
 
   ProcessPriorityClass,
 
   ProcessWx86Information,
 
   ProcessHandleCount,
 
   ProcessAffinityMask,
 
   ProcessPriorityBoost,
 
   ProcessDeviceMap,
 
   ProcessSessionInformation,
 
   ProcessForegroundInformation,
 
   ProcessWow64Information,
 
   ProcessImageFileName,
 
   ProcessLUIDDeviceMapsEnabled,
 
   ProcessBreakOnTermination,
 
   ProcessDebugObjectHandle,
 
   ProcessDebugFlags,
 
   ProcessHandleTracing,
 
   ProcessIoPriority,
 
   ProcessExecuteFlags,
 
   ProcessTlsInformation,
 
   ProcessCookie,
 
   ProcessImageInformation,
 
   ProcessCycleTime,
 
   ProcessPagePriority,
 
   ProcessInstrumentationCallback,
 
   ProcessThreadStackAllocation,
 
   ProcessWorkingSetWatchEx,
 
   ProcessImageFileNameWin32,
 
   ProcessImageFileMapping,
 
   ProcessAffinityUpdateMode,
 
   ProcessMemoryAllocationMode,
 
   ProcessGroupInformation,
 
   ProcessTokenVirtualizationEnabled,
 
   ProcessConsoleHostProcess,
 
   ProcessWindowInformation,
 
   MaxProcessInfoClass);

type
  NTSTATUS 
= LongWord;

function 
NtQueryInformationProcess(ProcessHandle: THandle; ProcessInformationClass: PROCESSINFOCLASS; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: PULONG ): LongInt; stdcall; external 'ntdll.dll';
function 
RtlNtStatusToDosError(Status: NTSTATUS): Integer; stdcall; external 'ntdll.dll';

function 
ImageDynamicallyRelocated(sii: TSectionImageInformation): Boolean;
asm
  MOVZX EAX
, BYTE PTR SS:[sii.ImageFlags]
 
 SHR AL, 2
  AND EAX
, 1
end
;

function 
CheckASLR(dwProcessId: LongWord; out bASLR: Boolean): LongWord;
var
 
hProcess: THandle;
 
sii: TSectionImageInformation;
 
status: NTSTATUS;
begin
  hProcess 
:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, dwProcessId);
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then
  begin
    status 
:= NtQueryInformationProcess(hProcess, ProcessImageInformation, @sii, SizeOf(sii), 0);
 
   CloseHandle(hProcess);
 
   if 0 <= status then
    begin
      bASLR 
:= ImageDynamicallyRelocated(sii);
 
     Result := NOERROR;
 
     Exit;
 
   end;
 
   Result := RtlNtStatusToDosError(status);
 
   Exit;
 
 end;
 
 Result := GetLastError;
end;

end. 
Check ASLR from Remote PEB
PHP كود :
unit uCheckASLR;

{************************************
* 
Coded by Agmcz                    *
* 
Date: 01-05-2018                  *
************************************}

interface

uses
  Windows
;

function 
CheckASLRPEB32(hProcess: THandle): Boolean;

implementation

type
  PProcessBasicInformation 
= ^TProcessBasicInformation;
 
 TProcessBasicInformation = record
    ExitStatus
: LongInt;
 
   PebBaseAddress: Pointer;
 
   AffinityMask: Cardinal;
 
   BasePriority: LongInt;
 
   UniqueProcessId: Cardinal;
 
   InheritedFromUniqueProcessId: Cardinal;
 
 end;

function 
NtQueryInformationProcess(ProcessHandle: THandle; ProcessInformationClass: DWORD {PROCESSINFOCLASS}; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: PULONG): LongInt; stdcall; external 'ntdll.dll';
function 
NtReadVirtualMemory(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer; BufferLength: ULONG; ReturnLength: PULONG): Longint; stdcall; external 'ntdll.dll';

function 
ImageDynamicallyRelocated(BitField: Byte): Boolean;
asm
  SHR AL
, 2
  AND AL
, 1
end
;

function 
CheckASLRPEB32(hProcess: THandle): Boolean;
var
 
 PBI: TProcessBasicInformation;
 
 BitField: Byte;
begin
  Result 
:= False;
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then
  begin
    if NtQueryInformationProcess
(hProcess, 0{ProcessBasicInformation = 0}, @PBI, SizeOf(TProcessBasicInformation), 0) = 0 then
    begin
      if NtReadVirtualMemory
(hProcess, Pointer(DWORD(PBI.PebBaseAddress) + 3), @BitField{Peb.BitField}, SizeOf(Byte), 0) = 0 then
        Result 
:= ImageDynamicallyRelocated(BitField);
 
   end;
 
 end;
end;

end. 
دعم كل من النظامين 32 و 64 بت
PHP كود :
unit uCheckASLR;

{************************************
* 
Coded by Agmcz                    *
* 
Date: 08-05-2018                  *
************************************}

interface

uses
  Windows
;

function 
CheckASLRPEB(hProcess: THandle): Boolean;

implementation

type
  PProcessBasicInformation 
= ^TProcessBasicInformation;
 
 TProcessBasicInformation = record
    ExitStatus
: LongInt;
 
   PebBaseAddress: Pointer;
 
   AffinityMask: Cardinal;
 
   BasePriority: LongInt;
 
   UniqueProcessId: Cardinal;
 
   InheritedFromUniqueProcessId: Cardinal;
 
 end;

type
  PProcessBasicInformation64 
= ^TProcessBasicInformation64;
 
 TProcessBasicInformation64 = record
    ExitStatus
: Cardinal;
 
   Pad1: Cardinal;
 
   PebBaseAddress: UInt64;
 
   AffinityMask: UInt64;
 
   BasePriority: Cardinal;
 
   Pad2: Cardinal;
 
   UniqueProcessId: UInt64;
 
   InheritedFromUniqueProcessId: UInt64;
 
 end;

type
  TNtQueryInformationProcess 
= function(ProcessHandle: THandle; ProcessInformationClass: DWORD {PROCESSINFOCLASS}; ProcessInformation: Pointer; ProcessInformationLength: ULONG; ReturnLength: Pointer): LongInt; stdcall;
 
 TNtReadVirtualMemory = function(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer; BufferLength: ULONG; ReturnLength: PULONG): Longint; stdcall;
 
 TNtWow64ReadVirtualMemory64 = function(ProcessHandle: THandle; BaseAddress: UInt64; Buffer: Pointer; BufferLength: UInt64; ReturnLength: Pointer): LongInt; stdcall;

function 
Is64OS: LongBool;
asm
  XOR EAX
, EAX
  MOV EAX
, FS:[$C0]
end;

function 
ImageDynamicallyRelocated(BitField: Byte): Boolean;
asm
  CMP AL
, 4
  JNE 
@Else
 
 SHR AL, 2
  JMP 
@EndIF
 
 @Else:
 
 SHR AL, 3
  
@EndIF:
 
 AND AL, 1
end
;

function 
CheckASLRPEB(hProcess: THandle): Boolean;
var
 
 PBI: TProcessBasicInformation;
 
 PBI64: TProcessBasicInformation64;
 
 BitField: Byte;
 
 hntdll: HMODULE;
 
 NtQueryInformationProcess: TNtQueryInformationProcess;
 
 NtReadVirtualMemory: TNtReadVirtualMemory;
 
 NtWow64QueryInformationProcess64: TNtQueryInformationProcess;
 
 NtWow64ReadVirtualMemory64: TNtWow64ReadVirtualMemory64;
begin
  Result 
:= False;
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then
  begin
    hntdll 
:= LoadLibrary('ntdll.dll');
 
   if hntdll <> 0 then
    begin
      if Is64OS then
      begin
        
@NtWow64QueryInformationProcess64 := GetProcAddress(hntdll, 'NtWow64QueryInformationProcess64');
 
       @NtWow64ReadVirtualMemory64 := GetProcAddress(hntdll, 'NtWow64ReadVirtualMemory64');
 
       if NtWow64QueryInformationProcess64(hProcess, 0{ProcessBasicInformation = 0}, @PBI64, SizeOf(TProcessBasicInformation64), 0) = 0 then
        begin
          if NtWow64ReadVirtualMemory64
(hProcess, PBI64.PebBaseAddress + 3, @BitField{Peb.BitField}, SizeOf(Byte), 0) = 0 then
            Result 
:= ImageDynamicallyRelocated(BitField);
 
       end;
 
     end
      else
      begin
        
@NtQueryInformationProcess := GetProcAddress(hntdll, 'NtQueryInformationProcess');
 
       @NtReadVirtualMemory := GetProcAddress(hntdll, 'NtReadVirtualMemory');
 
       if NtQueryInformationProcess(hProcess, 0{ProcessBasicInformation = 0}, @PBI, SizeOf(TProcessBasicInformation), 0) = 0 then
        begin
          if NtReadVirtualMemory
(hProcess, Pointer(DWORD(PBI.PebBaseAddress) + 3), @BitField{Peb.BitField}, SizeOf(Byte), nil) = 0 then
            Result 
:= ImageDynamicallyRelocated(BitField);
 
       end;
 
     end;
 
     FreeLibrary(hntdll);
 
   end;
 
 end;
end;

end. 
Original C++ Source:

Check ASLR from file 2
PHP كود :
unit uCheckASLR; 
PHP كود :
interface

uses
  Windows
;

type
  NTSTATUS 
= ULONG;
 
 SIZE_T = Cardinal;
 
 PVOID = Pointer;
 
 PLARGE_INTEGER = ^LARGE_INTEGER;
 
 HANDLE = THANDLE;

function 
CheckASLR(const FileName: WideString; out bASLR: Boolean): NTSTATUS;

implementation

const
 
 FILE_READ_DATA            = $0001; // file & pipe
 
 FILE_READ_EA              = $0008; // file & directory
 
 FILE_READ_ATTRIBUTES      = $0080; // all
 
 FILE_GENERIC_READ    = STANDARD_RIGHTS_READ or FILE_READ_DATA or
 
   FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE;

 
 FILE_SHARE_VALID_FLAGS = $00000007;
 
 FILE_SYNCHRONOUS_IO_NONALERT     = $00000020;

 
 OBJ_CASE_INSENSITIVE = $00000040;

type
  _SECTION_INFORMATION_CLASS 
= (
 
   SectionBasicInformation,
 
   SectionImageInformation);
 
 SECTION_INFORMATION_CLASS = _SECTION_INFORMATION_CLASS;
 
 TSectionInformationClass = SECTION_INFORMATION_CLASS;

 
TSectionImageInformation  = record
    TransferAddress
: Pointer;
 
   ZeroBits: LongWord;
 
   MaximumStackSize: LongWord;
 
   CommittedStackSize: LongWord;
 
   SubSystemType: LongWord;
 
   MinorSubsystemVersion: Word;
 
   MajorSubsystemVersion: Word;
 
   GpValue: LongWord;
 
   ImageCharacteristics: Word;
 
   DllCharacteristics: Word;
 
   Machine: Word;
 
   ImageContainsCode: Boolean;
 
   ImageFlags: Byte;
 
   LoaderFlags: LongWord;
 
   ImageFileSize: LongWord;
 
   CheckSum: LongWord;
 
 end;

 
 TIoStatusBlock = packed record
    Status      
: NTSTATUS;
 
   Information : ULONG;
 
 end;
 
 IO_STATUS_BLOCK = TIoStatusBlock;
 
 P_IO_STATUS_BLOCK = ^TIoStatusBlock;

 
 TUnicodeString = packed record
    Length
: WORD;
 
   MaximumLength: WORD;
 
   Buffer: PWideChar;
 
 end;
 
 PUnicodeString = ^TUnicodeString;
 
 TUNICODE_STRING = TUnicodeString;
 
 UNICODE_STRING = TUnicodeString;
 
 PUNICODE_STRING = PUnicodeString;

 
 POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
 
 OBJECT_ATTRIBUTES = packed record
    Length
: ULONG;
 
   RootDirectory: THandle;
 
   ObjectName: PUNICODE_STRING;
 
   Attributes: ULONG;
 
   SecurityDescriptor: PVOID;        // Points to type SECURITY_DESCRIPTOR
 
   SecurityQualityOfService: PVOID;  // Points to type SECURITY_QUALITY_OF_SERVICE
 
 end;

function 
NtOpenFile(FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: P_IO_STATUS_BLOCK; ShareAccess: ULONG; OpenOptions: ULONG): LongInt; stdcall; external  'ntdll.dll';
function 
NtCreateSection(SectionHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; SectionSize: PLARGE_INTEGER; Protect: ULONG; Attributes: ULONG; FileHandle: THandle): LongInt; stdcall; external  'ntdll.dll';
function 
NtClose(Handle : THandle): LongInt; stdcall; external  'ntdll.dll';
function 
ZwQuerySection(SectionHandle : THandle; SectionInformationClass : SECTION_INFORMATION_CLASS; SectionInformation: PVOID; SectionInformationLength: ULONG; ResultLength: PULONG): LongInt; stdcall; external  'ntdll.dll';
procedure RtlInitUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar); stdcall; external 'ntdll.dll';

procedure InitializeObjectAttributes(p: POBJECT_ATTRIBUTES; n: PUNICODE_STRING;
 
 a: ULONG; r: HANDLE; s: PVOID{PSECURITY_DESCRIPTOR});
begin
  p
^.Length := SizeOf(OBJECT_ATTRIBUTES);
 
 p^.RootDirectory := r;
 
 p^.Attributes := a;
 
 p^.ObjectName := n;
 
 p^.SecurityDescriptor := s;
 
 p^.SecurityQualityOfService := nil;
end;

function 
ImageDynamicallyRelocated(sii: TSectionImageInformation): Boolean;
asm
  MOVZX EAX
, BYTE PTR SS:[sii.ImageFlags]
 
 SHR AL, 2
  AND EAX
, 1
end
;

function 
CheckASLR(const FileName: WideString; out bASLR: Boolean): NTSTATUS;
var
 
 status: NTSTATUS;
 
 hFile, hSection: THandle;
 
 iosb: IO_STATUS_BLOCK;
 
 oa: OBJECT_ATTRIBUTES;
 
 us: TUnicodeString;
 
 sii: TSectionImageInformation;
begin
  RtlInitUnicodeString
(@us, PWideChar('\??\' + FileName));
  InitializeObjectAttributes(@oa, @us, OBJ_CASE_INSENSITIVE, 0, nil);
  status := NtOpenFile(@hFile, FILE_GENERIC_READ, @oa, @iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT);
  if 0 <= status then
  begin
    status := NtCreateSection(@hSection, SECTION_QUERY, 0, 0, PAGE_READONLY, SEC_IMAGE, hFile);
    NtClose(hFile);
    if 0 <= status then
    begin
      status := ZwQuerySection(hSection, SectionImageInformation, @sii, sizeof(sii), 0);
      NtClose(hSection);
      if 0 <= status then
      begin
        bASLR := ImageDynamicallyRelocated(sii);
      end;
    end;
  end;
  Result := status;
end;

end. 
السلام عليكم
تم جمع كل الدوال في وحدة واحدة ونشرها على GitHup
PHP كود :
https://github.com/Agmcz/CheckASLR 
السلام عليكم
عمل جميل ...فقط كملاحظة عدل كلمة written في الوصف
الصفحات : 1 2