From e3e6ee73bc98757a6179ba22b65f1bd6688c9ccc Mon Sep 17 00:00:00 2001 From: anders_k Date: Tue, 28 Nov 2017 18:15:44 +0000 Subject: [PATCH] Force HEASLR DllCharacteristics when ASLR bit is set for 64-bit targets git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6953 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/Platform.h | 7 +++++-- Source/build.cpp | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Source/Platform.h b/Source/Platform.h index 8fac3f2f..02c0be23 100644 --- a/Source/Platform.h +++ b/Source/Platform.h @@ -789,10 +789,10 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; # define IMAGE_SIZEOF_SHORT_NAME 8 #endif #ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE -#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 +#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // ASLR #endif #ifndef IMAGE_DLLCHARACTERISTICS_NX_COMPAT -#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 +#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // DEP #endif #ifndef IMAGE_DLLCHARACTERISTICS_NO_SEH #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 @@ -800,6 +800,9 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; #ifndef IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 #endif +#ifndef IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA +#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020 // HEASLR +#endif // structures diff --git a/Source/build.cpp b/Source/build.cpp index 353f1958..d8c22e46 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -2414,7 +2414,9 @@ int CEXEBuild::UpdatePEHeader() *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, MinorSubsystemVersion) = FIX_ENDIAN_INT16(PESubsysVerMin); } // DllCharacteristics - *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, DllCharacteristics) = FIX_ENDIAN_INT16(PEDllCharacteristics); + WORD dc = PEDllCharacteristics; + if ((dc & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && is_target_64bit()) dc |= IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA; + *GetCommonMemberFromPEOptHdr(headers->OptionalHeader, DllCharacteristics) = FIX_ENDIAN_INT16(dc); } catch (std::runtime_error& err) { ERROR_MSG(_T("Error updating PE headers: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR;