all: canonicalize win32 and win64 file names

This commit is contained in:
Markus F.X.J. Oberhumer
2023-02-10 09:49:29 +01:00
parent b8d9c2b755
commit f584c91386
38 changed files with 1061 additions and 326 deletions
+56 -46
View File
@@ -26,8 +26,6 @@
*/
#pragma once
#ifndef UPX_PEFILE_H__
#define UPX_PEFILE_H__ 1
#include "util/membuffer.h"
@@ -58,7 +56,7 @@ protected:
unsigned handleStripRelocs(upx_uint64_t ih_imagebase, upx_uint64_t default_imagebase,
LE16 &dllflags);
virtual bool handleForceOption() = 0;
virtual bool needForceOption() const = 0;
virtual void callCompressWithFilters(Filter &, int filter_strategy, unsigned ih_codebase);
virtual void defineSymbols(unsigned ncsection, unsigned upxsection, unsigned sizeof_oh,
unsigned isize_isplit, unsigned s1addr) = 0;
@@ -149,12 +147,12 @@ protected:
unsigned tlsindex;
unsigned tlscb_ptr;
unsigned tls_handler_offset;
bool use_tls_callbacks;
bool use_tls_callbacks = false;
void processLoadConf(Reloc *, const Interval *, unsigned);
void processLoadConf(Interval *);
MemBuffer mb_oloadconf;
upx_byte *oloadconf;
upx_byte *oloadconf = nullptr;
unsigned soloadconf;
unsigned stripDebug(unsigned);
@@ -162,8 +160,8 @@ protected:
unsigned icondir_offset;
int icondir_count;
bool importbyordinal;
bool kernel32ordinal;
bool importbyordinal = false;
bool kernel32ordinal = false;
unsigned rvamin;
unsigned cimports; // rva of preprocessed imports
unsigned crelocs; // rva of preprocessed fixups
@@ -173,8 +171,15 @@ protected:
LE32 vaddr;
LE32 size;
};
ddirs_t *iddirs;
ddirs_t *oddirs;
ddirs_t *iddirs = nullptr;
ddirs_t *oddirs = nullptr;
LE32 &IDSIZE(unsigned x);
LE32 &IDADDR(unsigned x);
LE32 &ODSIZE(unsigned x);
LE32 &ODADDR(unsigned x);
const LE32 &IDSIZE(unsigned x) const;
const LE32 &IDADDR(unsigned x) const;
struct alignas(1) import_desc {
LE32 oft; // orig first thunk
@@ -183,11 +188,6 @@ protected:
LE32 iat; // import address table
};
LE32 &IDSIZE(unsigned x);
LE32 &IDADDR(unsigned x);
LE32 &ODSIZE(unsigned x);
LE32 &ODADDR(unsigned x);
struct alignas(1) pe_section_t {
char name[8];
LE32 vsize;
@@ -200,16 +200,26 @@ protected:
MemBuffer mb_isection;
SPAN_0(pe_section_t) isection = nullptr;
bool isdll;
bool isrtm;
bool isefi;
bool use_dep_hack;
bool use_clear_dirty_stack;
bool use_stub_relocs;
bool isdll = false;
bool isrtm = false;
bool isefi = false;
bool use_dep_hack = true;
bool use_clear_dirty_stack = true;
bool use_stub_relocs = true;
static unsigned virta2objnum(unsigned, SPAN_0(pe_section_t), unsigned);
unsigned tryremove(unsigned, unsigned);
enum {
IMAGE_FILE_MACHINE_UNKNOWN = 0x0,
IMAGE_FILE_MACHINE_AMD64 = 0x8664, // win64/pe (amd64)
IMAGE_FILE_MACHINE_ARM = 0x1c0, // win32/arm
IMAGE_FILE_MACHINE_ARM64 = 0xaa64, // win64/arm64
IMAGE_FILE_MACHINE_ARM64EC = 0xa641, // win64/arm64ec
IMAGE_FILE_MACHINE_I386 = 0x14c, // win32/pe (i386)
IMAGE_FILE_MACHINE_THUMB = 0x1c2, // win32/arm
};
enum {
PEDIR_EXPORT = 0,
PEDIR_IMPORT = 1,
@@ -259,7 +269,6 @@ protected:
FBIG_ENDIAN = 0x8000,
};
// NEW: DLL characteristics definition for ASLR, ... - Stefan Widmann
enum {
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020,
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040,
@@ -268,8 +277,9 @@ protected:
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200,
IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400,
IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800,
IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000,
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000,
IMAGE_DLLCHARACTERISTICS_CONTROL_FLOW_GUARD = 0x4000,
IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000,
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000,
};
@@ -470,14 +480,15 @@ protected:
virtual void processTls(Reloc *, const Interval *, unsigned) override;
struct alignas(1) pe_header_t {
// 0x0
// 0x00
char _[4]; // pemagic
LE16 cpu;
LE16 objects; // number of sections
char __[12]; // timestamp + reserved
LE16 opthdrsize;
LE16 flags; // characteristics
// optional header
// 0x04 IMAGE_FILE_HEADER
LE16 cpu; // IMAGE_FILE_MACHINE_xxx
LE16 objects; // NumberOfSections
char __[12]; // timestamp + reserved
LE16 opthdrsize; // SizeOfOptionalHeader
LE16 flags; // Characteristics
// 0x18 IMAGE_OPTIONAL_HEADER32
LE16 coffmagic; // NEW: Stefan Widmann
char ___[2]; // linkerversion
LE32 codesize;
@@ -497,14 +508,14 @@ protected:
// 0x50
LE32 imagesize;
LE32 headersize;
LE32 chksum; // should set to 0
LE16 subsystem;
LE16 dllflags;
LE32 chksum; // should set to 0
LE16 subsystem; // IMAGE_SUBSYSTEM_xxx
LE16 dllflags; // IMAGE_DLLCHARACTERISTICS_xxx
// 0x60
char _____[20]; // stack + heap sizes
// 0x74
LE32 ddirsentries; // usually 16
// 0x78
ddirs_t ddirs[16];
};
@@ -530,14 +541,15 @@ protected:
virtual void processTls(Reloc *, const Interval *, unsigned) override;
struct alignas(1) pe_header_t {
// 0x0
// 0x00
char _[4]; // pemagic
LE16 cpu;
LE16 objects; // number of sections
char __[12]; // timestamp + reserved
LE16 opthdrsize;
LE16 flags; // characteristics
// optional header
// 0x04 IMAGE_FILE_HEADER
LE16 cpu; // IMAGE_FILE_MACHINE_xxx
LE16 objects; // NumberOfSections
char __[12]; // timestamp + reserved
LE16 opthdrsize; // SizeOfOptionalHeader
LE16 flags; // Characteristics
// 0x18 IMAGE_OPTIONAL_HEADER64
LE16 coffmagic; // NEW: Stefan Widmann
char ___[2]; // linkerversion
LE32 codesize;
@@ -557,20 +569,18 @@ protected:
// 0x50
LE32 imagesize;
LE32 headersize;
LE32 chksum; // should set to 0
LE16 subsystem;
LE16 dllflags;
LE32 chksum; // should set to 0
LE16 subsystem; // IMAGE_SUBSYSTEM_xxx
LE16 dllflags; // IMAGE_DLLCHARACTERISTICS_xxx
// 0x60
char _____[36]; // stack + heap sizes + loader flag
// 0x84
LE32 ddirsentries; // usually 16
// 0x88
ddirs_t ddirs[16];
};
pe_header_t ih, oh;
};
#endif /* already included */
/* vim:set ts=4 sw=4 et: */