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:
+34
-13
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user