From 4322931d979bb7c417569b7118b4a2561aedf71b Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Wed, 17 Jan 2001 18:05:22 +0000 Subject: [PATCH] Added UPX_MAGIC2_LE32 as an additional magic number for the original packheader as stored in the stubs. committer: mfx 979754722 +0000 --- src/packhead.cpp | 47 ++++++++++++++++++++++++++++++++------------- src/stub/header.ash | 13 +++++++++---- src/stub/l_tos.s | 7 +++++-- src/unupx.h | 1 + 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/packhead.cpp b/src/packhead.cpp index 76a44de9..eb125466 100644 --- a/src/packhead.cpp +++ b/src/packhead.cpp @@ -99,7 +99,7 @@ int PackHeader::getPackHeaderSize() const /************************************************************************* -// +// see stub/header.ash **************************************************************************/ void PackHeader::putPackHeader(upx_bytep p) @@ -108,32 +108,34 @@ void PackHeader::putPackHeader(upx_bytep p) throwBadLoader(); #else assert(get_le32(p) == UPX_MAGIC_LE32); - int size = 0; + if (get_le32(p+4) != UPX_MAGIC2_LE32) + { + printf("%x %x\n", get_le32(p+4), UPX_MAGIC2_LE32); + throwBadLoader(); + } - p[4] = (unsigned char) version; - p[5] = (unsigned char) format; - p[6] = (unsigned char) method; - p[7] = (unsigned char) level; + int size = 0; + int old_chksum = 0; // the new variable length header if (format < 128) { - set_le32(p+8,u_adler); - set_le32(p+12,c_adler); if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS) { + size = 22; + old_chksum = get_packheader_checksum(p, size - 1); set_le16(p+16,u_len); set_le16(p+18,c_len); p[20] = (unsigned char) filter; - size = 22; } else if (format == UPX_F_DOS_EXE) { + size = 27; + old_chksum = get_packheader_checksum(p, size - 1); set_le24(p+16,u_len); set_le24(p+19,c_len); set_le24(p+22,u_file_size); p[25] = (unsigned char) filter; - size = 27; } else if (format == UPX_F_DOS_EXEH) { @@ -141,17 +143,22 @@ void PackHeader::putPackHeader(upx_bytep p) } else { + size = 32; + old_chksum = get_packheader_checksum(p, size - 1); set_le32(p+16,u_len); set_le32(p+20,c_len); set_le32(p+24,u_file_size); p[28] = (unsigned char) filter; p[29] = (unsigned char) filter_cto; p[30] = 0; - size = 32; } + set_le32(p+8,u_adler); + set_le32(p+12,c_adler); } else { + size = 32; + old_chksum = get_packheader_checksum(p, size - 1); set_be32(p+8,u_len); set_be32(p+12,c_len); set_be32(p+16,u_adler); @@ -160,11 +167,25 @@ void PackHeader::putPackHeader(upx_bytep p) p[28] = (unsigned char) filter; p[29] = (unsigned char) filter_cto; p[30] = 0; - size = 32; } - // store header_checksum + p[4] = (unsigned char) version; + p[5] = (unsigned char) format; + p[6] = (unsigned char) method; + p[7] = (unsigned char) level; + + // header_checksum assert(size == getPackHeaderSize()); + // check old header_checksum + if (p[size - 1] != 0) + { + if (p[size - 1] != old_chksum) + { + printf("old_checksum: %d %d\n", p[size - 1], old_chksum); + throwBadLoader(); + } + } + // store new header_checksum p[size - 1] = get_packheader_checksum(p, size - 1); #endif /* UNUPX */ } diff --git a/src/stub/header.ash b/src/stub/header.ash index 28ba8b5b..e0d0fea1 100644 --- a/src/stub/header.ash +++ b/src/stub/header.ash @@ -28,11 +28,16 @@ ; ------------- HEADER ------------- ; __UPX1HEAD__ - db 'UPX!' ; 0 magic + db 85,80,88,33 ; 0 UPX_MAGIC_LE32 + %if 0 db 0 ; 4 version - db 0 ; 5 type (com,sys,...) + db 0 ; 5 format db 0 ; 6 compression method db 0 ; 7 compression level + %else + ; another magic for PackHeader::putPackHeader + db 161,216,208,213 ; UPX_MAGIC2_LE32 + %endif dd 0 ; 8 uncompressed adler32 dd 0 ; 12 compressed adler32 @@ -52,9 +57,9 @@ dd 0 ; 20 compressed len dd 0 ; 24 original file size db 0 ; 28 filter id - db 0 ; 29 cto (for filters 0x21..0x29) + db 0 ; 29 filter cto db 0 ; unsused - db 0 ; 31 header checksum + db 45 ; 31 header checksum %endif diff --git a/src/stub/l_tos.s b/src/stub/l_tos.s index c8155cf3..e51b3422 100644 --- a/src/stub/l_tos.s +++ b/src/stub/l_tos.s @@ -288,8 +288,11 @@ clear_bss_end: align4 - dc.b 'UPX!' ; magic - dc.l 0,0,0,0,0,0,0 ; 28 bytes - #include "header.ash" + ; 32 bytes - #include "header.ash" + dc.b 85,80,88,33 ; UPX_MAGIC_LE32 + dc.b 161,216,208,213 ; UPX_MAGIC2_LE32 + dc.l 0,0,0,0,0 ; 20 bytes + dc.b 0,0,0,45 ; end of text segment - size is a multiple of 4 diff --git a/src/unupx.h b/src/unupx.h index 69c2d8c4..5e7e7c8c 100644 --- a/src/unupx.h +++ b/src/unupx.h @@ -88,6 +88,7 @@ typedef unsigned upx_uint32; #define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */ +#define UPX_MAGIC2_LE32 0xD5D0D8A1 /*************************************************************************