Added UPX_MAGIC2_LE32 as an additional magic number for the original

packheader as stored in the stubs.

committer: mfx <mfx> 979754722 +0000
This commit is contained in:
Markus F.X.J. Oberhumer
2001-01-17 18:05:22 +00:00
parent ad4bf703f0
commit 4322931d97
4 changed files with 49 additions and 19 deletions
+34 -13
View File
@@ -99,7 +99,7 @@ int PackHeader::getPackHeaderSize() const
/************************************************************************* /*************************************************************************
// // see stub/header.ash
**************************************************************************/ **************************************************************************/
void PackHeader::putPackHeader(upx_bytep p) void PackHeader::putPackHeader(upx_bytep p)
@@ -108,32 +108,34 @@ void PackHeader::putPackHeader(upx_bytep p)
throwBadLoader(); throwBadLoader();
#else #else
assert(get_le32(p) == UPX_MAGIC_LE32); 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; int size = 0;
p[5] = (unsigned char) format; int old_chksum = 0;
p[6] = (unsigned char) method;
p[7] = (unsigned char) level;
// the new variable length header // the new variable length header
if (format < 128) 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) 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+16,u_len);
set_le16(p+18,c_len); set_le16(p+18,c_len);
p[20] = (unsigned char) filter; p[20] = (unsigned char) filter;
size = 22;
} }
else if (format == UPX_F_DOS_EXE) 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+16,u_len);
set_le24(p+19,c_len); set_le24(p+19,c_len);
set_le24(p+22,u_file_size); set_le24(p+22,u_file_size);
p[25] = (unsigned char) filter; p[25] = (unsigned char) filter;
size = 27;
} }
else if (format == UPX_F_DOS_EXEH) else if (format == UPX_F_DOS_EXEH)
{ {
@@ -141,17 +143,22 @@ void PackHeader::putPackHeader(upx_bytep p)
} }
else else
{ {
size = 32;
old_chksum = get_packheader_checksum(p, size - 1);
set_le32(p+16,u_len); set_le32(p+16,u_len);
set_le32(p+20,c_len); set_le32(p+20,c_len);
set_le32(p+24,u_file_size); set_le32(p+24,u_file_size);
p[28] = (unsigned char) filter; p[28] = (unsigned char) filter;
p[29] = (unsigned char) filter_cto; p[29] = (unsigned char) filter_cto;
p[30] = 0; p[30] = 0;
size = 32;
} }
set_le32(p+8,u_adler);
set_le32(p+12,c_adler);
} }
else else
{ {
size = 32;
old_chksum = get_packheader_checksum(p, size - 1);
set_be32(p+8,u_len); set_be32(p+8,u_len);
set_be32(p+12,c_len); set_be32(p+12,c_len);
set_be32(p+16,u_adler); set_be32(p+16,u_adler);
@@ -160,11 +167,25 @@ void PackHeader::putPackHeader(upx_bytep p)
p[28] = (unsigned char) filter; p[28] = (unsigned char) filter;
p[29] = (unsigned char) filter_cto; p[29] = (unsigned char) filter_cto;
p[30] = 0; 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()); 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); p[size - 1] = get_packheader_checksum(p, size - 1);
#endif /* UNUPX */ #endif /* UNUPX */
} }
+9 -4
View File
@@ -28,11 +28,16 @@
; ------------- HEADER ------------- ; __UPX1HEAD__ ; ------------- HEADER ------------- ; __UPX1HEAD__
db 'UPX!' ; 0 magic db 85,80,88,33 ; 0 UPX_MAGIC_LE32
%if 0
db 0 ; 4 version db 0 ; 4 version
db 0 ; 5 type (com,sys,...) db 0 ; 5 format
db 0 ; 6 compression method db 0 ; 6 compression method
db 0 ; 7 compression level 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 ; 8 uncompressed adler32
dd 0 ; 12 compressed adler32 dd 0 ; 12 compressed adler32
@@ -52,9 +57,9 @@
dd 0 ; 20 compressed len dd 0 ; 20 compressed len
dd 0 ; 24 original file size dd 0 ; 24 original file size
db 0 ; 28 filter id db 0 ; 28 filter id
db 0 ; 29 cto (for filters 0x21..0x29) db 0 ; 29 filter cto
db 0 ; unsused db 0 ; unsused
db 0 ; 31 header checksum db 45 ; 31 header checksum
%endif %endif
+5 -2
View File
@@ -288,8 +288,11 @@ clear_bss_end:
align4 align4
dc.b 'UPX!' ; magic ; 32 bytes - #include "header.ash"
dc.l 0,0,0,0,0,0,0 ; 28 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 ; end of text segment - size is a multiple of 4
+1
View File
@@ -88,6 +88,7 @@ typedef unsigned upx_uint32;
#define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */ #define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */
#define UPX_MAGIC2_LE32 0xD5D0D8A1
/************************************************************************* /*************************************************************************