visuel c ++ - Hvordan kan jeg afgøre, om Windows anvender ASLR uden genstart?

Indlæg af Hanne Mølgaard Plasc

Problem



Så vidt jeg forstår, vil ASLR Adgang til rumlayout Randomization kun gøre tilfældig flytning pr. Systemstart (pr. Genstart). [10]



  

Adresseomr. Randomisering (ASLR)


  
  ASLR flytter eksekverbare billeder til tilfældige steder, når et system
  støvler, hvilket gør det sværere at udnytte
  kode for at fungere forudsigeligt. (...)



Hvis dette er tilfældet, hvordan kan jeg så 'teste' eller hellere kontrollere, at ASLR sker for mit C ++-modul eller til et systemmodul (siger kernel32.dll) uden gentagne gange genstart Windows og håber tilfældigheden sparker ind?

Bedste reference


Dette er hvad jeg ville prøve:


Husk at et modul s HMODULE håndtag er faktisk basisadressen til modulets billede. Du kan bruge GetModuleHandle for at opnå denne værdi. Hvis du sammenligner det med basisadressen i billedets valgfri header-værdier, ville vi forvente disse to værdier være forskellige, når ASLR er tændt. [11]


Husk, at dette kun ville være en klar indikator for ASLR, når GetModuleHandle bruges på visse system DLL'er; det ville arbejde for kernel32, fordi det ikke er en typisk kandidat til billedflytning:



  1. Microsoft system DLL'er er alle givet unikke anbefalede basisadresser; og

  2. Det er en af ​​de første DLL'er kortlagt i procesadresserummet.



Da kernel32 ikke ville blive flyttet, hvis ASLR blev slukket, ville det være rimeligt at forvente, at det blev indlæst på den anbefalede basisadresse.


Hvordan får du den anbefalede basisadresse fra billedoverskrifterne? Den nemmeste måde er at bruge værktøjet DUMPBIN med Visual C ++. Hvis du vil gøre det programatisk, skal du lave noget spilunking gennem de eksekverbare billeder, så du finder feltet IMAGE\_OPTIONAL\_HEADER strukturens ImageBase. For mere information om PE-overskrifter, jeg 'd anbefaler' En dybde kig ind i Win32 Portable Executable File Format 'af Matt Pietrek. [12]