BinaryNinja - Analyzers - LoadConfiguration

This analyzer enhances the representation and underlying data of the PE LoadConfiguration structure within BinaryNinja.

140011b20  struct Load_Configuration_Directory_Table __load_configuration_directory_table = 140011b20  { 140011b20      uint32_t characteristics = 0x140 140011b24      uint32_t timeDateStamp = 0x0 140011b28      uint16_t majorVersion = 0x0 140011b2a      uint16_t minorVersion = 0x0 140011b2c      uint32_t globalFlagsClear = 0x0 140011b30      uint32_t globalFlagsSet = 0x0 140011b34      uint32_t criticalSectionDefaultTimeout = 0x0 140011b38      uint64_t deCommitFreeBlockThreshold = 0x0 140011b40      uint64_t deCommitTotalFreeThreshold = 0x0 140011b48      uint64_t lockPrefixTable = 0x0 140011b50      uint64_t maximumAllocationSize = 0x0 140011b58      uint64_t virtualMemoryThreshold = 0x0 140011b60      uint64_t processAffinityMask = 0x0 140011b68      uint32_t processHeapFlags = 0x0 140011b6c      uint16_t csdVersion = 0x0 140011b6e      uint16_t reserved = 0x0 140011b70      uint64_t editList = 0x0 140011b78      uint64_t securityCookie = 0x140016040 140011b80      uint64_t seHandlerTable = 0x0 140011b88      uint64_t seHandlerCount = 0x0 140011b90      uint64_t guardCFCheckFunctionPointer = 0x140011070 140011b98      uint64_t guardCFDispatchFunctionPointer = 0x140011080 140011ba0      uint64_t guardCFFunctionTable = 0x0 140011ba8      uint64_t guardCFFunctionCount = 0x0 140011bb0      uint32_t guardFlags = 0x100 140011bb4      uint16_t Flags = 0x0 140011bb6      uint16_t Catalog = 0x0 140011bb8      uint32_t CatalogOffset = 0x0 140011bbc      uint32_t Reserved = 0x0 140011bc0      uint64_t guardAddressTakenIatEntryTable = 0x0 140011bc8      uint64_t guardAddressTakenIatEntryCount = 0x0 140011bd0      uint64_t guardLongJumpTargetTable = 0x0 140011bd8      uint64_t guardLongJumpTargetCount = 0x0 140011be0      uint64_t dynamicValueRelocTable = 0x0 140011be8      uint64_t CHPEMetadataPointer = 0x1400111f8 140011bf0      uint64_t guardRFFailureRoutine = 0x0 140011bf8      uint64_t guardRFFailureRoutineFunctionPointer = 0x0 140011c00      uint32_t dynamicValueRelocTableOffset = 0x0 140011c04      uint16_t dynamicValueRelocTableSection = 0x0 140011c06      uint16_t reserved2 = 0x0 140011c08      uint64_t guardRFVerifyStackPointerFunctionPointer = 0x0 140011c10      uint32_t hotPatchTableOffset = 0x0 140011c14      uint32_t reserved3 = 0x0 140011c18      uint64_t enclaveConfigurationPointer = 0x0 140011c20      uint64_t volatileMetadataPointer = 0x0 140011c28      uint64_t guardEHContinuationTable = 0x0 140011c30      uint64_t guardEHContinuationCount = 0x0 140011c38      uint64_t guardXFGCheckFunctionPointer = 0x140011078 140011c40      uint64_t guardXFGDispatchFunctionPointer = 0x140011088 140011c48      uint64_t guardXFGTableDispatchFunctionPointer = 0x140011090 140011c50  }
140011b20  struct _LIEF_IMAGE_LOAD_CONFIG_DIRECTORY64 __load_configuration_directory_table = 140011b20  { 140011b20      uint32_t Size = 0x140 140011b24      uint32_t TimeDateStamp = 0x0 140011b28      uint16_t MajorVersion = 0x0 140011b2a      uint16_t MinorVersion = 0x0 140011b2c      uint32_t GlobalFlagsClear = 0x0 140011b30      uint32_t GlobalFlagsSet = 0x0 140011b34      uint32_t CriticalSectionDefaultTimeout = 0x0 140011b38      uintptr_t DeCommitFreeBlockThreshold = 0x0 140011b40      uintptr_t DeCommitTotalFreeThreshold = 0x0 140011b48      void* LockPrefixTable = 0x0 140011b50      uintptr_t MaximumAllocationSize = 0x0 140011b58      uintptr_t VirtualMemoryThreshold = 0x0 140011b60      uintptr_t ProcessHeapFlags = 0x0 140011b68      uint32_t ProcessAffinityMask = 0x0 140011b6c      uint16_t CSDVersion = 0x0 140011b6e      uint16_t DependentLoadFlags = 0x0 140011b70      void* EditList = 0x0 140011b78      void* SecurityCookie = __security_cookie 140011b80      uintptr_t* SEHandlerTable = 0x0 140011b88      uintptr_t SEHandlerCount = 0x0 140011b90      void (** GuardCFCheckFunctionPointer)() = __guard_check_icall_fptr 140011b98      void (** GuardCFDispatchFunctionPointer)() = __guard_dispatch_icall_fptr 140011ba0      uint32_t* SEHandlerTable = 0x0 140011ba8      uintptr_t GuardCFFunctionCount = 0x0 140011bb0      enum GuardFlags = IMAGE_GUARD_CF_INSTRUMENTED 140011bb4      struct CodeIntegrity = 140011bb4      { 140011bb4          uint16_t Flags = 0x0 140011bb6          uint16_t Catalog = 0x0 140011bb8          uint32_t CatalogOffset = 0x0 140011bbc          uint32_t Reserved = 0x0 140011bc0      } 140011bc0      void* GuardAddressTakenIatEntryTable = 0x0 140011bc8      uintptr_t GuardAddressTakenIatEntryCount = 0x0 140011bd0      void* GuardLongJumpTargetTable = 0x0 140011bd8      uintptr_t GuardLongJumpTargetCount = 0x0 140011be0      void* DynamicValueRelocTable = 0x0 140011be8      struct _LIEF_IMAGE_ARM64EC_METADATA_V2* const CHPEMetadataPointer = __image_arm64ec_metadata 140011bf0      void (** GuardRFFailureRoutine)() = 0x0 140011bf8      void (** GuardRFFailureRoutineFunctionPointer)() = 0x0 140011c00      uint32_t DynamicValueRelocTableOffset = 0x0 140011c04      uint16_t DynamicValueRelocTableSection = 0x0 140011c06      uint16_t Reserved2 = 0x0 140011c08      void (** GuardRFVerifyStackPointerFunctionPointer)() = 0x0 140011c10      uint32_t HotPatchTableOffset = 0x0 140011c14      uint32_t Reserved3 = 0x0 140011c18      void* EnclaveConfigurationPointer = 0x0 140011c20      void* VolatileMetadataPointer = 0x0 140011c28      void* GuardEHContinuationTable = 0x0 140011c30      void* GuardEHContinuationCount = 0x0 140011c38      void (** GuardXFGCheckFunctionPointer)() = data_140011078 140011c40      void (** GuardXFGDispatchFunctionPointer)() = data_140011088 140011c48      void (** GuardXFGTableDispatchFunctionPointer)() = data_140011090 140011c50      void (** CastGuardOsDeterminedFailureMode)() = 0x140011098 140011c58      void (** GuardMemcpyFunctionPointer)() = data_1400110a0 140011c60  }
The layout of this structure – exposed in LIEF through the interface – evolves frequently across new Windows releases. By running this analyzer, you obtain a more complete and accurate representation of these attributes along with their correct data types.
Beyond the Load Configuration, the analyzer also defines additional structures, such as , which provide valuable context for analyzing ARM64EC binaries. These definitions make it easier to interpret the purpose of certain functions and pointers, leading to deeper insights during reverse engineering.
1400111e0  00 00 00 00 01 00 00 00 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0a 00 00 00 02 00 00 00 00 1e 01 00  ........Hello World!............ 140011200  02 00 00 00 b4 1c 01 00 00 90 01 00 00 10 01 00 08 10 01 00 18 10 01 00 10 10 01 00 20 10 01 00  ............................ ... 140011220  00 00 00 00 00 50 01 00 01 00 00 00 01 00 00 00 28 10 01 00 30 10 01 00 00 70 01 00 38 0d 00 00  .....P..........(...0....p..8... 140011240  38 10 01 00 48 3e 01 00 00 00 00 00 00 00 00 00 00 00 00 00 40 10 01 00 48 10 01 00 50 10 01 00  8...H>..............@...H...P... 140011260  58 10 01 00 60 10 01 00 68 10 01 00 00 00 00 00                                                  X...`...h.......
1400111e8  char const data_1400111e8[0xe] = "Hello World!\n", 0 1400111f6                                                                    00 00                                                .. 1400111f8  struct _LIEF_IMAGE_ARM64EC_METADATA_V2 __image_arm64ec_metadata = 1400111f8  { 1400111f8      uint32_t Version = 0x2 1400111fc      uint32_t CodeMap = 0x11e00 140011200      uint32_t CodeMapCount = 0x2 140011204      uint32_t CodeRangesToEntryPoints = 0x11cb4 140011208      uint32_t RedirectionMetadata = 0x19000 14001120c      uint32_t __os_arm64x_dispatch_call_no_redirect = 0x11000 140011210      uint32_t __os_arm64x_dispatch_ret = 0x11008 140011214      uint32_t __os_arm64x_dispatch_call = 0x11018 140011218      uint32_t __os_arm64x_dispatch_icall = 0x11010 14001121c      uint32_t __os_arm64x_dispatch_icall_cfg = 0x11020 140011220      uint32_t AlternateEntryPoint = 0x0 140011224      uint32_t AuxiliaryIAT = 0x15000 140011228      uint32_t CodeRangesToEntryPointsCount = 0x1 14001122c      uint32_t RedirectionMetadataCount = 0x1 140011230      uint32_t GetX64InformationFunctionPointer = 0x11028 140011234      uint32_t SetX64InformationFunctionPointer = 0x11030 140011238      uint32_t ExtraRFETable = 0x17000 14001123c      uint32_t ExtraRFETableSize = 0xd38 140011240      uint32_t __os_arm64x_dispatch_fptr = 0x11038 140011244      uint32_t AuxiliaryIATCopy = 0x13e48 140011248      uint32_t AuxDelayloadIAT = 0x0 14001124c      uint32_t AuxDelayloadIATCopy = 0x0 140011250      uint32_t ReservedBitField = 0x0 140011254  }