Check if ASLR is enabled
#1
السلام عليكم
إجراء للتحقق من 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(dwProcessIdULONGout bASLRBoolean): ULONG;

implementation

const
 
 PROCESS_QUERY_LIMITED_INFORMATION = $1000;

type
 TSectionImageInformation  
record
    TransferAddress
Pointer;
 
   ZeroBitsULONG;
 
   MaximumStackSizeULONG;
 
   CommittedStackSizeULONG;
 
   SubSystemTypeULONG;
 
   MinorSubsystemVersionWord;
 
   MajorSubsystemVersionWord;
 
   GpValueULONG;
 
   ImageCharacteristicsWord;
 
   DllCharacteristicsWord;
 
   MachineWord;
 
   ImageContainsCodeBoolean;
 
   ImageFlagsByte;
 
   LoaderFlagsULONG;
 
   ImageFileSizeULONG;
 
   CheckSumULONG;
 
 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(ProcessHandleTHandleProcessInformationClassPROCESSINFOCLASSProcessInformationPointerProcessInformationLengthULONGReturnLengthPULONG ): LongIntstdcallexternal 'ntdll.dll';
function 
RtlNtStatusToDosError(StatusNTSTATUS): Integerstdcallexternal 'ntdll.dll';

function 
CheckASLR(dwProcessIdULONGout bASLRBoolean): ULONG;
var
 
hProcessTHandle;
 
siiTSectionImageInformation;
 
statusNTSTATUS;
begin
  hProcess 
:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATIONFalsedwProcessId);
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUEthen
  begin
    status 
:= NtQueryInformationProcess(hProcessProcessImageInformation, @siiSizeOf(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


الملفات المرفقة
.zip   uCheckASLR.zip (الحجم : 1.28 KB / التحميلات : 26)
سبحان الله وبحمده سبحان الله العظيم
[-] كل من 2 users say قال شكرا ل Agmcz على المشاركة المفيدة
  • B.M.AbdelAziZ, h-farid
الرد
#2
مشكوور اخي
لكن ما فائدتها ! ممكن مثال عملي
الرد
#3
فحص هيدر PE وتحقق من ASLR

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

unit uCheckASLR;

interface

uses
  Windows
;

function 
CheckASLR(const FileNamestring): Boolean;

implementation

const
 
 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = $0040;
 
 IMAGE_DIRECTORY_ENTRY_BASERELOC 5;

function 
CheckASLR(const FileNamestring): Boolean;
var
 
 hFileTHandle;
 
 hMappingDWORD;
 
 pMapPointer;
 
 dwSizeDWORD;
 
 IDHPImageDosHeader;
 
 INHPImageNtHeaders;
 
 ISHPImageSectionHeader;
 
 nWord;
 
 dwRelocAddrdwRelocSizeDWORD;
begin
  Result 
:= False;
 
 hFile := CreateFile(PChar(FileName), GENERIC_READFILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING00);
 
 if hFile <> INVALID_HANDLE_VALUE then
  begin
    dwSize 
:= GetFileSize(hFilenil);
 
   hMapping := CreateFileMapping(hFilenilPAGE_READONLY0dwSizenil);
 
   if hMapping <> 0 then
    begin
      pMap 
:= MapViewOfFile(hMappingFILE_MAP_READ000);
 
     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 <> 0then
              begin
                for n 
:= 0 to INH.FileHeader.NumberOfSections do
 
               begin
                  if ISH
.VirtualAddress dwRelocAddr then
                  begin
                    if 
(ISH.Misc.VirtualSize <> 0) and  (ISH.PointerToRawData <> 0) and (ISH.SizeOfRawData <> 0then
                      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


الملفات المرفقة
.rar   ASLR Checker.rar (الحجم : 2.11 KB / التحميلات : 11)
سبحان الله وبحمده سبحان الله العظيم
[-] كل من 2 users say قال شكرا ل Agmcz على المشاركة المفيدة
  • B.M.AbdelAziZ, mobile
الرد
#4
السلام عليكم
بعض التصحيحات على الكود لأنه توجد أخطاء
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(dwProcessIdLongWordout bASLRBoolean): LongWord;

implementation

const
 
 PROCESS_QUERY_LIMITED_INFORMATION = $1000;

type
 TSectionImageInformation  
record
    TransferAddress
Pointer;
 
   ZeroBitsLongWord;
 
   MaximumStackSizeLongWord;
 
   CommittedStackSizeLongWord;
 
   SubSystemTypeLongWord;
 
   MinorSubsystemVersionWord;
 
   MajorSubsystemVersionWord;
 
   GpValueLongWord;
 
   ImageCharacteristicsWord;
 
   DllCharacteristicsWord;
 
   MachineWord;
 
   ImageContainsCodeBoolean;
 
   ImageFlagsByte;
 
   LoaderFlagsLongWord;
 
   ImageFileSizeLongWord;
 
   CheckSumLongWord;
 
 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(ProcessHandleTHandleProcessInformationClassPROCESSINFOCLASSProcessInformationPointerProcessInformationLengthULONGReturnLengthPULONG ): LongIntstdcallexternal 'ntdll.dll';
function 
RtlNtStatusToDosError(StatusNTSTATUS): Integerstdcallexternal 'ntdll.dll';

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

function 
CheckASLR(dwProcessIdLongWordout bASLRBoolean): LongWord;
var
 
hProcessTHandle;
 
siiTSectionImageInformation;
 
statusNTSTATUS;
begin
  hProcess 
:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATIONFalsedwProcessId);
 
 if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUEthen
  begin
    status 
:= NtQueryInformationProcess(hProcessProcessImageInformation, @siiSizeOf(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


الملفات المرفقة
.rar   Fix_uCheckASLR.rar (الحجم : 1.29 KB / التحميلات : 0)
سبحان الله وبحمده سبحان الله العظيم
[-] كل من 2 users say قال شكرا ل Agmcz على المشاركة المفيدة
  • AX302, B.M.AbdelAziZ
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف