upx-clang-format -i packhead.cpp
This commit is contained in:
@@ -129,6 +129,7 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
CLANG_FORMAT_FILES += packhead.cpp
|
||||||
CLANG_FORMAT_FILES += s_djgpp2.cpp s_object.cpp s_vcsa.cpp s_win32.cpp screen.h
|
CLANG_FORMAT_FILES += s_djgpp2.cpp s_object.cpp s_vcsa.cpp s_win32.cpp screen.h
|
||||||
CLANG_FORMAT_FILES += snprintf.cpp
|
CLANG_FORMAT_FILES += snprintf.cpp
|
||||||
CLANG_FORMAT_FILES += stdcxx.h stdcxx.cpp
|
CLANG_FORMAT_FILES += stdcxx.h stdcxx.cpp
|
||||||
|
|||||||
+58
-100
@@ -25,11 +25,9 @@
|
|||||||
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "packer.h"
|
#include "packer.h"
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// PackHeader
|
// PackHeader
|
||||||
//
|
//
|
||||||
@@ -37,54 +35,44 @@
|
|||||||
// least to detect older versions, so this is a little bit messy.
|
// least to detect older versions, so this is a little bit messy.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
PackHeader::PackHeader() :
|
PackHeader::PackHeader() : version(-1), format(-1) {}
|
||||||
version(-1), format(-1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// simple checksum for the header itself (since version 10)
|
// simple checksum for the header itself (since version 10)
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static unsigned char get_packheader_checksum(const upx_bytep buf, int len)
|
static unsigned char get_packheader_checksum(const upx_bytep buf, int len) {
|
||||||
{
|
|
||||||
assert(get_le32(buf) == UPX_MAGIC_LE32);
|
assert(get_le32(buf) == UPX_MAGIC_LE32);
|
||||||
//printf("1 %d\n", len);
|
// printf("1 %d\n", len);
|
||||||
buf += 4;
|
buf += 4;
|
||||||
len -= 4;
|
len -= 4;
|
||||||
unsigned c = 0;
|
unsigned c = 0;
|
||||||
while (len-- > 0)
|
while (len-- > 0)
|
||||||
c += *buf++;
|
c += *buf++;
|
||||||
c %= 251;
|
c %= 251;
|
||||||
//printf("2 %d\n", c);
|
// printf("2 %d\n", c);
|
||||||
return (unsigned char) c;
|
return (unsigned char) c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int PackHeader::getPackHeaderSize() const
|
int PackHeader::getPackHeaderSize() const {
|
||||||
{
|
|
||||||
if (format < 0 || version < 0)
|
if (format < 0 || version < 0)
|
||||||
throwInternalError("getPackHeaderSize");
|
throwInternalError("getPackHeaderSize");
|
||||||
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
if (version <= 3)
|
if (version <= 3)
|
||||||
n = 24;
|
n = 24;
|
||||||
else if (version <= 9)
|
else if (version <= 9) {
|
||||||
{
|
|
||||||
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
||||||
n = 20;
|
n = 20;
|
||||||
else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH)
|
else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH)
|
||||||
n = 25;
|
n = 25;
|
||||||
else
|
else
|
||||||
n = 28;
|
n = 28;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
||||||
n = 22;
|
n = 22;
|
||||||
else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH)
|
else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH)
|
||||||
@@ -97,17 +85,14 @@ int PackHeader::getPackHeaderSize() const
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// see stub/header.ash
|
// see stub/header.ash
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void PackHeader::putPackHeader(upx_bytep p)
|
void PackHeader::putPackHeader(upx_bytep p) {
|
||||||
{
|
|
||||||
assert(get_le32(p) == UPX_MAGIC_LE32);
|
assert(get_le32(p) == UPX_MAGIC_LE32);
|
||||||
if (get_le32(p+4) != UPX_MAGIC2_LE32)
|
if (get_le32(p + 4) != UPX_MAGIC2_LE32) {
|
||||||
{
|
// fprintf(stderr, "MAGIC2_LE32: %x %x\n", get_le32(p+4), UPX_MAGIC2_LE32);
|
||||||
//fprintf(stderr, "MAGIC2_LE32: %x %x\n", get_le32(p+4), UPX_MAGIC2_LE32);
|
|
||||||
throwBadLoader();
|
throwBadLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,53 +100,43 @@ void PackHeader::putPackHeader(upx_bytep p)
|
|||||||
int old_chksum = 0;
|
int old_chksum = 0;
|
||||||
|
|
||||||
// the new variable length header
|
// the new variable length header
|
||||||
if (format < 128)
|
if (format < 128) {
|
||||||
{
|
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS) {
|
||||||
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
|
||||||
{
|
|
||||||
size = 22;
|
size = 22;
|
||||||
old_chksum = get_packheader_checksum(p, size - 1);
|
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;
|
||||||
}
|
} else if (format == UPX_F_DOS_EXE) {
|
||||||
else if (format == UPX_F_DOS_EXE)
|
|
||||||
{
|
|
||||||
size = 27;
|
size = 27;
|
||||||
old_chksum = get_packheader_checksum(p, size - 1);
|
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;
|
||||||
}
|
} else if (format == UPX_F_DOS_EXEH) {
|
||||||
else if (format == UPX_F_DOS_EXEH)
|
|
||||||
{
|
|
||||||
throwInternalError("invalid format");
|
throwInternalError("invalid format");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
size = 32;
|
size = 32;
|
||||||
old_chksum = get_packheader_checksum(p, size - 1);
|
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;
|
||||||
assert(n_mru == 0 || (n_mru >= 2 && n_mru <= 256));
|
assert(n_mru == 0 || (n_mru >= 2 && n_mru <= 256));
|
||||||
p[30] = (unsigned char) (n_mru ? n_mru - 1 : 0);
|
p[30] = (unsigned char) (n_mru ? n_mru - 1 : 0);
|
||||||
}
|
}
|
||||||
set_le32(p+8,u_adler);
|
set_le32(p + 8, u_adler);
|
||||||
set_le32(p+12,c_adler);
|
set_le32(p + 12, c_adler);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
size = 32;
|
size = 32;
|
||||||
old_chksum = get_packheader_checksum(p, size - 1);
|
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);
|
||||||
set_be32(p+20,c_adler);
|
set_be32(p + 20, c_adler);
|
||||||
set_be32(p+24,u_file_size);
|
set_be32(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;
|
||||||
assert(n_mru == 0 || (n_mru >= 2 && n_mru <= 256));
|
assert(n_mru == 0 || (n_mru >= 2 && n_mru <= 256));
|
||||||
@@ -176,11 +151,9 @@ void PackHeader::putPackHeader(upx_bytep p)
|
|||||||
// header_checksum
|
// header_checksum
|
||||||
assert(size == getPackHeaderSize());
|
assert(size == getPackHeaderSize());
|
||||||
// check old header_checksum
|
// check old header_checksum
|
||||||
if (p[size - 1] != 0)
|
if (p[size - 1] != 0) {
|
||||||
{
|
if (p[size - 1] != old_chksum) {
|
||||||
if (p[size - 1] != old_chksum)
|
// printf("old_checksum: %d %d\n", p[size - 1], old_chksum);
|
||||||
{
|
|
||||||
//printf("old_checksum: %d %d\n", p[size - 1], old_chksum);
|
|
||||||
throwBadLoader();
|
throwBadLoader();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -188,13 +161,11 @@ void PackHeader::putPackHeader(upx_bytep p)
|
|||||||
p[size - 1] = get_packheader_checksum(p, size - 1);
|
p[size - 1] = get_packheader_checksum(p, size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
bool PackHeader::fillPackHeader(const upx_bytep buf, int blen)
|
bool PackHeader::fillPackHeader(const upx_bytep buf, int blen) {
|
||||||
{
|
|
||||||
int boff = find_le32(buf, blen, UPX_MAGIC_LE32);
|
int boff = find_le32(buf, blen, UPX_MAGIC_LE32);
|
||||||
if (boff < 0)
|
if (boff < 0)
|
||||||
return false;
|
return false;
|
||||||
@@ -219,41 +190,33 @@ bool PackHeader::fillPackHeader(const upx_bytep buf, int blen)
|
|||||||
//
|
//
|
||||||
|
|
||||||
int off_filter = 0;
|
int off_filter = 0;
|
||||||
if (format < 128)
|
if (format < 128) {
|
||||||
{
|
u_adler = get_le32(p + 8);
|
||||||
u_adler = get_le32(p+8);
|
c_adler = get_le32(p + 12);
|
||||||
c_adler = get_le32(p+12);
|
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS) {
|
||||||
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
u_len = get_le16(p + 16);
|
||||||
{
|
c_len = get_le16(p + 18);
|
||||||
u_len = get_le16(p+16);
|
|
||||||
c_len = get_le16(p+18);
|
|
||||||
u_file_size = u_len;
|
u_file_size = u_len;
|
||||||
off_filter = 20;
|
off_filter = 20;
|
||||||
}
|
} else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH) {
|
||||||
else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH)
|
u_len = get_le24(p + 16);
|
||||||
{
|
c_len = get_le24(p + 19);
|
||||||
u_len = get_le24(p+16);
|
u_file_size = get_le24(p + 22);
|
||||||
c_len = get_le24(p+19);
|
|
||||||
u_file_size = get_le24(p+22);
|
|
||||||
off_filter = 25;
|
off_filter = 25;
|
||||||
}
|
} else {
|
||||||
else
|
u_len = get_le32(p + 16);
|
||||||
{
|
c_len = get_le32(p + 20);
|
||||||
u_len = get_le32(p+16);
|
u_file_size = get_le32(p + 24);
|
||||||
c_len = get_le32(p+20);
|
|
||||||
u_file_size = get_le32(p+24);
|
|
||||||
off_filter = 28;
|
off_filter = 28;
|
||||||
filter_cto = p[29];
|
filter_cto = p[29];
|
||||||
n_mru = p[30] ? 1 + p[30] : 0;
|
n_mru = p[30] ? 1 + p[30] : 0;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
u_len = get_be32(p + 8);
|
||||||
{
|
c_len = get_be32(p + 12);
|
||||||
u_len = get_be32(p+8);
|
u_adler = get_be32(p + 16);
|
||||||
c_len = get_be32(p+12);
|
c_adler = get_be32(p + 20);
|
||||||
u_adler = get_be32(p+16);
|
u_file_size = get_be32(p + 24);
|
||||||
c_adler = get_be32(p+20);
|
|
||||||
u_file_size = get_be32(p+24);
|
|
||||||
off_filter = 28;
|
off_filter = 28;
|
||||||
filter_cto = p[29];
|
filter_cto = p[29];
|
||||||
n_mru = p[30] ? 1 + p[30] : 0;
|
n_mru = p[30] ? 1 + p[30] : 0;
|
||||||
@@ -263,8 +226,7 @@ bool PackHeader::fillPackHeader(const upx_bytep buf, int blen)
|
|||||||
filter = p[off_filter];
|
filter = p[off_filter];
|
||||||
else if ((level & 128) == 0)
|
else if ((level & 128) == 0)
|
||||||
filter = 0;
|
filter = 0;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// convert old flags to new filter id
|
// convert old flags to new filter id
|
||||||
level &= 127;
|
level &= 127;
|
||||||
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
if (format == UPX_F_DOS_COM || format == UPX_F_DOS_SYS)
|
||||||
@@ -286,7 +248,7 @@ bool PackHeader::fillPackHeader(const upx_bytep buf, int blen)
|
|||||||
if (p[size - 1] != get_packheader_checksum(p, size - 1))
|
if (p[size - 1] != get_packheader_checksum(p, size - 1))
|
||||||
throwCantUnpack("header corrupted 3");
|
throwCantUnpack("header corrupted 3");
|
||||||
|
|
||||||
if (c_len < 2 || u_len < 2 || c_len > 500000000 || u_len > 500000000)
|
if (c_len < 2 || u_len < 2 || !mem_size_valid_bytes(c_len) || !mem_size_valid_bytes(u_len))
|
||||||
throwCantUnpack("header corrupted 4");
|
throwCantUnpack("header corrupted 4");
|
||||||
//
|
//
|
||||||
// success
|
// success
|
||||||
@@ -296,8 +258,4 @@ bool PackHeader::fillPackHeader(const upx_bytep buf, int blen)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* vim:set ts=4 sw=4 et: */
|
||||||
/*
|
|
||||||
vi:ts=4:et:nowrap
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user