diff --git a/.hgignore b/.hgignore index b1d114a7..0dd9f99b 100644 --- a/.hgignore +++ b/.hgignore @@ -45,7 +45,7 @@ stub/**.*-stamp stub/tmp*/* stub/**/tmp*/* -stub/tools/armpe/armpe_tester +stub/tools/armpe/armpe_tester{,.exe,.out} stub/tools/sstrip/amd64-linux-sstrip stub/tools/sstrip/i386-linux-sstrip diff --git a/src/conf.h b/src/conf.h index cb1c3485..fa107d88 100644 --- a/src/conf.h +++ b/src/conf.h @@ -307,22 +307,15 @@ #endif -#undef __attribute_packed #if (ACC_CC_INTELC && (__INTEL_COMPILER < 800)) #elif (0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386)) #elif (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE) -# define __attribute_packed __attribute__((__packed__,__aligned__(1))) # define __packed_struct(s) struct s { -# define __packed_struct_end() } __attribute_packed; +# define __packed_struct_end() } __attribute__((__packed__,__aligned__(1))); #elif (ACC_CC_WATCOMC) -# define __attribute_packed # define __packed_struct(s) _Packed struct s { # define __packed_struct_end() }; #endif - -#if !defined(__attribute_packed) -# define __attribute_packed -#endif #if !defined(__packed_struct) # define __packed_struct(s) struct s { # define __packed_struct_end() }; diff --git a/src/lefile.h b/src/lefile.h index 24feb329..10002bbf 100644 --- a/src/lefile.h +++ b/src/lefile.h @@ -49,8 +49,8 @@ public: protected: enum { FIXUP_EXTRA = 3 }; - struct le_header_t - { // 0x00 + __packed_struct(le_header_t) + // 0x00 char _[2]; // signature: 'LE' || 'LX' char byte_order; // 0 little endian char word_order; // 0 little endian @@ -117,28 +117,23 @@ protected: LE16 device_id; LE16 ddk_version; #endif - } - __attribute_packed; + __packed_struct_end() - struct le_object_table_entry_t - { + __packed_struct(le_object_table_entry_t) LE32 virtual_size; LE32 base_address; LE32 flags; LE32 pagemap_index; LE32 npages; LE32 reserved; - } - __attribute_packed; + __packed_struct_end() - struct le_pagemap_entry_t - { + __packed_struct(le_pagemap_entry_t) unsigned char h; unsigned char m; unsigned char l; unsigned char type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed - } - __attribute_packed; + __packed_struct_end() virtual void readObjectTable(); virtual void writeObjectTable(); diff --git a/src/p_armpe.cpp b/src/p_armpe.cpp index d986417a..06bf3db1 100644 --- a/src/p_armpe.cpp +++ b/src/p_armpe.cpp @@ -148,14 +148,12 @@ Linker* PackArmPe::newLinker() const // import handling **************************************************************************/ -struct import_desc -{ +__packed_struct(import_desc) LE32 oft; // orig first thunk char _[8]; LE32 dllname; LE32 iat; // import address table -} -__attribute_packed; +__packed_struct_end() void PackArmPe::processImports(unsigned myimport, unsigned iat_off) // pass 2 { diff --git a/src/p_djgpp2.h b/src/p_djgpp2.h index 92cefcd3..38f11c71 100644 --- a/src/p_djgpp2.h +++ b/src/p_djgpp2.h @@ -66,19 +66,16 @@ protected: long coff_offset; - struct external_scnhdr_t - { + __packed_struct(external_scnhdr_t) char _[12]; // name, paddr LE32 vaddr; LE32 size; LE32 scnptr; char misc[12]; // relptr, lnnoptr, nreloc, nlnno char __[4]; // flags - } - __attribute_packed; + __packed_struct_end() - struct coff_header_t - { + __packed_struct(coff_header_t) // ext_file_hdr LE16 f_magic; LE16 f_nscns; @@ -99,8 +96,7 @@ protected: // section headers external_scnhdr_t sh[3]; - } - __attribute_packed; + __packed_struct_end() coff_header_t coff_hdr; external_scnhdr_t *text,*data,*bss; diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 30a27660..4b6cc12c 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -145,26 +145,23 @@ protected: Elf32_Shdr const *sec_dynsym; Elf32_Shdr const *sec_dynstr; - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf32_Ehdr ehdr; Elf32_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf32_Ehdr ehdr; Elf32_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf32_Ehdr ehdr; Elf32_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; @@ -227,26 +224,23 @@ protected: Elf64_Phdr *phdri; // for input file acc_uint64l_t page_mask; // AND clears the offset-within-page - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf64_Ehdr ehdr; Elf64_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf64_Ehdr ehdr; Elf64_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf64_Ehdr ehdr; Elf64_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; diff --git a/src/p_lx_exc.h b/src/p_lx_exc.h index 479b6537..736262f9 100644 --- a/src/p_lx_exc.h +++ b/src/p_lx_exc.h @@ -87,26 +87,23 @@ protected: unsigned n_mru; - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; diff --git a/src/p_ps1.h b/src/p_ps1.h index 7b1b7f4a..9bf91912 100644 --- a/src/p_ps1.h +++ b/src/p_ps1.h @@ -67,8 +67,7 @@ protected: virtual int readFileHeader(); virtual bool checkFileHeader(); - struct ps1_exe_t - { + __packed_struct(ps1_exe_t) // ident string char id[8]; // is NULL @@ -91,33 +90,26 @@ protected: char origin[60]; // backup of the original header (epc - is_len) // id & the upx header ... - } - __attribute_packed; + __packed_struct_end() // for unpack - struct ps1_exe_hb_t - { + __packed_struct(ps1_exe_hb_t) LE32 ih_bkup[10]; // plus checksum for the backup LE32 ih_csum; - } - __attribute_packed; + __packed_struct_end() - struct ps1_exe_chb_t - { + __packed_struct(ps1_exe_chb_t) unsigned char id; unsigned char len; LE16 ih_csum; unsigned char ih_bkup; - } - __attribute_packed; + __packed_struct_end() - struct bss_nfo - { + __packed_struct(bss_nfo) LE16 hi1, op1, lo1, op2; LE16 hi2, op3, lo2, op4; - } - __attribute_packed; + __packed_struct_end() ps1_exe_t ih, oh; ps1_exe_hb_t bh; diff --git a/src/p_tos.h b/src/p_tos.h index fcca7216..445f6257 100644 --- a/src/p_tos.h +++ b/src/p_tos.h @@ -62,8 +62,7 @@ protected: virtual int readFileHeader(); virtual bool checkFileHeader(); - struct tos_header_t - { + __packed_struct(tos_header_t) BE16 fh_magic; BE32 fh_text; BE32 fh_data; @@ -72,8 +71,7 @@ protected: BE32 fh_reserved; BE32 fh_flag; BE16 fh_reloc; - } - __attribute_packed; + __packed_struct_end() tos_header_t ih, oh; diff --git a/src/p_unix.h b/src/p_unix.h index 2b1383ef..02ce461a 100644 --- a/src/p_unix.h +++ b/src/p_unix.h @@ -92,30 +92,28 @@ protected: unsigned b_len; // total length of b_info blocks // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block unsigned sz_unc; // uncompressed_size unsigned sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader LE32 l_checksum; LE32 l_magic; LE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header unsigned p_progid; unsigned p_filesize; unsigned p_blocksize; - } - __attribute_packed; + __packed_struct_end() struct l_info linfo; @@ -135,31 +133,28 @@ protected: PackUnixBe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; } // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block BE32 sz_unc; // uncompressed_size BE32 sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader BE32 l_checksum; BE32 l_magic; BE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header BE32 p_progid; BE32 p_filesize; BE32 p_blocksize; - } - __attribute_packed; - + __packed_struct_end() }; @@ -170,31 +165,28 @@ protected: PackUnixLe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; } // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block LE32 sz_unc; // uncompressed_size LE32 sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader LE32 l_checksum; LE32 l_magic; LE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header LE32 p_progid; LE32 p_filesize; LE32 p_blocksize; - } - __attribute_packed; - + __packed_struct_end() }; diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index 8f2e3e9b..33ef71b3 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -301,7 +301,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) if (UPX_E_OK!=r || len_unc<=len_cpr) // FIXME: allow no compression throwInternalError("Ehdr compression failed"); - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block unsigned sz_unc; // uncompressed_size unsigned sz_cpr; // compressed_size unsigned char b_method; // compression algorithm @@ -309,8 +309,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) unsigned char b_cto8; // filter parameter unsigned char b_unused; // FIXME: !=0 for partial-block unfilter // unsigned f_offset, f_len; // only if partial-block unfilter - } - __attribute_packed; + __packed_struct_end() struct b_info hdr_info; set_be32(&hdr_info.sz_unc, len_unc); diff --git a/src/p_vmlinz.h b/src/p_vmlinz.h index 89ef192d..7f8f72f9 100644 --- a/src/p_vmlinz.h +++ b/src/p_vmlinz.h @@ -64,8 +64,7 @@ protected: // virtual upx_byte *getLoader() const; // virtual int getLoaderSize() const; - struct boot_sect_t - { + __packed_struct(boot_sect_t) char _[0x1f1]; unsigned char setup_sects; char __[2]; @@ -86,11 +85,11 @@ protected: char _8[0x248 - (0x234 + 1)]; LE32 payload_offset; LE32 payload_length; - // some more uninteresting fields here ... // see /usr/src/linux/Documentation/i386/boot.txt - } - __attribute_packed h; + __packed_struct_end() + + boot_sect_t h; MemBuffer setup_buf; int setup_size; diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 640aaa78..5447ca34 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -173,14 +173,12 @@ int PackW32Pe::readFileHeader() // import handling **************************************************************************/ -struct import_desc -{ +__packed_struct(import_desc) LE32 oft; // orig first thunk char _[8]; LE32 dllname; LE32 iat; // import address table -} -__attribute_packed; +__packed_struct_end() void PackW32Pe::processImports(unsigned myimport, unsigned) // pass 2 { diff --git a/src/pefile.h b/src/pefile.h index 1e3f51b5..69f4c5f8 100644 --- a/src/pefile.h +++ b/src/pefile.h @@ -106,8 +106,7 @@ protected: unsigned crelocs; // rva of preprocessed fixups int big_relocs; - struct pe_header_t - { + __packed_struct(pe_header_t) // 0x0 char _[4]; // pemagic LE16 cpu; @@ -142,19 +141,15 @@ protected: // 0x74 LE32 ddirsentries; // usually 16 - struct ddirs_t - { + __packed_struct(ddirs_t) LE32 vaddr; LE32 size; - } - __attribute_packed; + __packed_struct_end() - struct ddirs_t ddirs[16]; - } - __attribute_packed; + ddirs_t ddirs[16]; + __packed_struct_end() - struct pe_section_t - { + __packed_struct(pe_section_t) char name[8]; LE32 vsize; LE32 vaddr; @@ -162,8 +157,7 @@ protected: LE32 rawdataptr; char _[12]; LE32 flags; - } - __attribute_packed; + __packed_struct_end() pe_header_t ih, oh; pe_section_t *isection; @@ -333,8 +327,7 @@ protected: class Export : private noncopyable { - struct export_dir_t - { + __packed_struct(export_dir_t) char _[12]; // flags, timedate, version LE32 name; char __[4]; // ordinal base @@ -343,8 +336,7 @@ protected: LE32 addrtable; LE32 nameptrtable; LE32 ordinaltable; - } - __attribute_packed; + __packed_struct_end() export_dir_t edir; char *ename; diff --git a/src/stub/tools/armpe/Makefile b/src/stub/tools/armpe/Makefile index 018d7812..2eecba10 100644 --- a/src/stub/tools/armpe/Makefile +++ b/src/stub/tools/armpe/Makefile @@ -1,29 +1,35 @@ # Makefile for armpe_tester MAKEFLAGS += -rR -SHELL = /bin/sh +.SUFFIXES: +.SECONDEXPANSION: +.NOTPARALLEL: +export LC_ALL = C +export SHELL = /bin/sh -# update path for our special stub build tools -ifneq ($(wildcard $(HOME)/local/bin/bin-upx),) +# update $PATH for our special stub build tools +ifneq ($(wildcard $(HOME)/local/bin/bin-upx/.),) export PATH := $(HOME)/local/bin/bin-upx:$(PATH) endif - -ifneq ($(wildcard $(HOME)/bin/bin-upx),) +ifneq ($(wildcard $(HOME)/bin/bin-upx/.),) export PATH := $(HOME)/bin/bin-upx:$(PATH) endif +CFLAGS_W = -Wall -W -Wcast-align -Wcast-qual -Wwrite-strings -all: armpe_tester wtest.exe -armpe_tester: armpe_tester.c - arm-9tdmi-linux-gnu-gcc -Wl,--section-start,.interp=0x1000 -g -Wall -W -o $@ $< +all: armpe_tester.out +#all: armpe_tester.exe -wtest.exe: armpe_tester.c - arm-wince-pe-gcc -Wl,--image-base,0x400000 -s -Wall -W -o $@ $< +armpe_tester.out: armpe_tester.c $(MAKEFILE_LIST) + arm-linux-gcc-4.1.0 -Wl,--section-start,.interp=0x1000 -g $(CFLAGS_W) -o $@ $< + +armpe_tester.exe: armpe_tester.c $(MAKEFILE_LIST) + arm-wince-pe-gcc -Wl,--image-base,0x400000 -s $(CFLAGS_W) -o $@ $< mostlyclean clean distclean maintainer-clean: rm -f *.d *.o *.obj - rm -f armpe_tester wtest.exe + rm -f armpe_tester.exe armpe_tester.out .PHONY: all mostlyclean clean distclean maintainer-clean diff --git a/src/stub/tools/armpe/armpe_tester.c b/src/stub/tools/armpe/armpe_tester.c index 081ab2d9..801f22cd 100644 --- a/src/stub/tools/armpe/armpe_tester.c +++ b/src/stub/tools/armpe/armpe_tester.c @@ -32,38 +32,46 @@ // arm-9tdmi-linux-gnu-gcc -Wl,--section-start,.interp=0x1000 // arm-wince-pe-gcc -Wl,--image-base,0x400000 +#include +#include +#include #include #include -#include -#include -#ifdef i386 -# define UPX_MMAP_ADDRESS 0x20000000 +#ifdef __i386__ +# define UPX_MMAP_ADDRESS 0x20000000 #else -# define UPX_MMAP_ADDRESS 0x10000 +# define UPX_MMAP_ADDRESS 0x10000 #endif -#ifdef linux -# include +#ifdef __linux__ +# include #else void *VirtualAlloc(void *address, unsigned size, unsigned type, unsigned protect); -# define MEM_COMMIT 0x1000 -# define PAGE_EXECUTE_READWRITE 0x0040 +# define MEM_COMMIT 0x1000 +# define PAGE_EXECUTE_READWRITE 0x0040 #endif -typedef unsigned short LE16; -typedef unsigned long LE32; -#define __attribute_packed +typedef size_t acc_uintptr_t; +typedef unsigned short LE16; +typedef unsigned int LE32; +#define get_le32(p) (* (const unsigned *) (p)) +#define set_le32(p,v) (* (unsigned *) (p) = (v)) +#define get_le16(p) (* (const unsigned short *) (p)) -struct ddirs_t -{ +#if !defined(__packed_struct) +# define __packed_struct(s) struct s { +# define __packed_struct_end() }; +#endif + + +__packed_struct(ddirs_t) LE32 vaddr; LE32 size; -} -__attribute_packed; +__packed_struct_end() -struct pe_header_t -{ + +__packed_struct(pe_header_t) // 0x0 char _[4]; LE16 cpu; @@ -97,13 +105,12 @@ struct pe_header_t char _____[20]; // 0x74 LE32 ddirsentries; - + // struct ddirs_t ddirs[16]; -} -__attribute_packed; +__packed_struct_end() -struct pe_section_t -{ + +__packed_struct(pe_section_t) char name[8]; LE32 vsize; LE32 vaddr; @@ -111,12 +118,10 @@ struct pe_section_t LE32 rawdataptr; char _[12]; LE32 flags; -} -__attribute_packed; +__packed_struct_end() -struct exe_header_t -{ +__packed_struct(exe_header_t) LE16 mz; LE16 m512; LE16 p512; @@ -124,8 +129,8 @@ struct exe_header_t LE16 relocoffs; char __[34]; LE32 nexepos; -} -__attribute_packed; +__packed_struct_end() + enum { PEDIR_EXPORT = 0, @@ -145,9 +150,6 @@ enum { PEDIR_COMRT = 14 }; -#define get_le32(p) (*(unsigned *) (p)) -#define set_le32(p, v) (*(unsigned *) (p) = (v)) -#define get_le16(p) (*(unsigned short *) (p)) static struct pe_header_t ih; static struct pe_section_t isections[4]; @@ -213,7 +215,7 @@ static int load(const char *file) static int read(void) { unsigned ic; -#ifdef linux +#ifdef __linux__ vaddr = mmap((void *) UPX_MMAP_ADDRESS, ih.imagesize, PROT_WRITE | PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); @@ -237,7 +239,7 @@ static int read(void) static void dump(char n) { char buf[100]; -#ifdef linux +#ifdef __linux__ snprintf(buf, sizeof(buf), "/tmp/a.dump%c", n); #else snprintf(buf, sizeof(buf), "/a.dump%c", n); @@ -247,7 +249,7 @@ static void dump(char n) fclose(f2); } -static int loadlibraryw(unsigned short *name) +static int loadlibraryw(const unsigned short *name) { return name[0] + name[1] * 0x100 + name[2] * 0x10000; } @@ -315,7 +317,7 @@ static void dump2(int c) static void call(void) { -#ifndef i386 +#ifndef __i386__ void (*entry)(void (*)(int), unsigned) = vaddr + ih.entry; entry(dump2, 1); dump('z'); @@ -346,10 +348,12 @@ static int main2(int argc, char **argv) int main(int argc, char **argv) { out = stdout; -#ifndef linux +#ifndef __linux__ out = fopen("/wtest.log", "wt"); #endif int ret = main2(argc, argv); fclose(out); return ret; } + +/* vim:set ts=4 sw=4 et: */