From ee3f1292d0e7cb90e2cbf8a57088bc738ac0f79b Mon Sep 17 00:00:00 2001 From: John Reiser Date: Thu, 11 Jan 2018 11:33:15 -0800 Subject: [PATCH 1/5] fix editing rot for mach-o .dylib https://github.com/upx/upx/issues/57 modified: p_mach.cpp --- src/p_mach.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 010fa74d..ff0e1a98 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -1366,7 +1366,6 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e unsigned const sz_threado = threado_size(); MemBuffer space(sz_threado); memset(space, 0, sz_threado); fo->write(space, sz_threado); - sz_mach_headers = fo->getBytesWritten(); } else if (my_filetype == Mach_header::MH_DYLIB) { Mach_command const *ptr = (Mach_command const *)rawmseg; @@ -1398,13 +1397,10 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e } memset(&linkitem, 0, sizeof(linkitem)); fo->write(&linkitem, sizeof(linkitem)); - fo->write(rawmseg, mhdri.sizeofcmds); - - gap = secTEXT.offset - sz_mach_headers; } sz_mach_headers = fo->getBytesWritten(); - MemBuffer filler(gap); - memset(filler, 0, gap); + gap = secTEXT.offset - sz_mach_headers; + MemBuffer filler(gap); filler.clear(); fo->write(filler, gap); sz_mach_headers += gap; From 969efe687db7c14effbded52967d474b1c2935f5 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Thu, 11 Jan 2018 12:01:00 -0800 Subject: [PATCH 2/5] MSVC pecadillos modified: p_lx_elf.cpp modified: pefile.cpp --- src/p_lx_elf.cpp | 2 +- src/pefile.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 2b73823d..feed84da 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -3843,7 +3843,7 @@ PackLinuxElf64::check_pt_dynamic(Elf64_Phdr const *const phdr) { upx_uint64_t t = get_te64(&phdr->p_offset), s = sizeof(Elf64_Dyn) + t; upx_uint64_t filesz = get_te64(&phdr->p_filesz), memsz = get_te64(&phdr->p_memsz); - if (s < t || (uint64_t)file_size < s + if (s < t || (upx_uint64_t)file_size < s || (7 & t) || (0xf & (filesz | memsz)) // .balign 8; 16==sizeof(Elf64_Dyn) || filesz < sizeof(Elf64_Dyn) || memsz < sizeof(Elf64_Dyn) diff --git a/src/pefile.cpp b/src/pefile.cpp index a9bb2ab8..3a9e942d 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -167,7 +167,7 @@ int PeFile::readFileHeader() : (h.p512*512+h.m512 - h.m512 ? 512 : 0); if ((pe_offset + delta) < delta // wrap-around - || (pe_offset + delta) > file_size) { + || (pe_offset + delta) > (unsigned)file_size) { char buf[64]; snprintf(buf, sizeof(buf), "bad PE delta %#x at offset %#x", delta, pe_offset); throwCantPack(buf); From df94f4288a9faaddd2436002d753023e8d012a6e Mon Sep 17 00:00:00 2001 From: John Reiser Date: Thu, 11 Jan 2018 12:09:43 -0800 Subject: [PATCH 3/5] picky, picky modified: p_lx_elf.cpp --- src/p_lx_elf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index feed84da..e5871d77 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -3772,7 +3772,7 @@ PackLinuxElf32::check_pt_dynamic(Elf32_Phdr const *const phdr) { unsigned t = get_te32(&phdr->p_offset), s = sizeof(Elf32_Dyn) + t; unsigned filesz = get_te32(&phdr->p_filesz), memsz = get_te32(&phdr->p_memsz); - if (s < t || file_size < s + if (s < t || file_size < (off_t)s || (3 & t) || (7 & (filesz | memsz)) // .balign 4; 8==sizeof(Elf32_Dyn) || filesz < sizeof(Elf32_Dyn) || memsz < sizeof(Elf32_Dyn) From 900926c0edca3b0606b72b4f8fc5c9584c855955 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Fri, 12 Jan 2018 10:18:29 +0100 Subject: [PATCH 4/5] Avoid a MSVC warning. --- src/p_mach.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index ff0e1a98..407240a9 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -1974,7 +1974,7 @@ bool PackMachBase::canPack() strncpy(fsm.segZERO.segname, "__PAGEZERO", sizeof(fsm.segZERO.segname)); fsm.segZERO.vmaddr = 0; fsm.segZERO.vmsize = (4<<16); - if (8==sizeof(void *)) fsm.segZERO.vmsize <<= (32 - 18); + if __acc_cte(8==sizeof(void *)) fsm.segZERO.vmsize <<= (32 - 18); fsm.segZERO.fileoff = 0; fsm.segZERO.filesize = 0; fsm.segZERO.maxprot = 0; From f3a7620ae83135ee84706b7a558138b43ad50711 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Fri, 12 Jan 2018 08:42:34 -0800 Subject: [PATCH 5/5] ARM: recognize R_ARM_CALL and R_ARM_JUMP24 as equivalent to R_ARM_PC24 modified: linker.cpp --- src/linker.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/linker.cpp b/src/linker.cpp index ee769a6a..0f262a4f 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -594,7 +594,9 @@ void ElfLinkerAMD64::relocate1(const Relocation *rel, upx_byte *location, upx_ui void ElfLinkerArmBE::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value, const char *type) { - if (strcmp(type, "R_ARM_PC24") == 0) { + if (!strcmp(type, "R_ARM_PC24") + || !strcmp(type, "R_ARM_CALL") + || !strcmp(type, "R_ARM_JUMP24")) { value -= rel->section->offset + rel->offset; set_be24(1 + location, get_be24(1 + location) + value / 4); } else if (strcmp(type, "R_ARM_ABS32") == 0) { @@ -618,7 +620,9 @@ void ElfLinkerArmBE::relocate1(const Relocation *rel, upx_byte *location, upx_ui void ElfLinkerArmLE::relocate1(const Relocation *rel, upx_byte *location, upx_uint64_t value, const char *type) { - if (strcmp(type, "R_ARM_PC24") == 0) { + if (!strcmp(type, "R_ARM_PC24") + || !strcmp(type, "R_ARM_CALL") + || !strcmp(type, "R_ARM_JUMP24")) { value -= rel->section->offset + rel->offset; set_le24(location, get_le24(location) + value / 4); } else if (strcmp(type, "R_ARM_ABS32") == 0) {