mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Updated from UPX 1.07 release.
committer: mfx <mfx> 982687495 +0000
This commit is contained in:
parent
401567f852
commit
6a95c11cf9
11
src/conf.h
11
src/conf.h
|
@ -439,15 +439,6 @@ enum {
|
||||||
CMD_HELP, CMD_LICENSE, CMD_VERSION
|
CMD_HELP, CMD_LICENSE, CMD_VERSION
|
||||||
};
|
};
|
||||||
|
|
||||||
// win32/pe resource types
|
|
||||||
enum {
|
|
||||||
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
|
|
||||||
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGE_TABLE,
|
|
||||||
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
|
|
||||||
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
|
|
||||||
RT_LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
|
|
||||||
|
@ -536,7 +527,7 @@ struct options_t {
|
||||||
int compress_exports;
|
int compress_exports;
|
||||||
int compress_icons;
|
int compress_icons;
|
||||||
int compress_resources;
|
int compress_resources;
|
||||||
signed char compress_rt[RT_LAST];
|
signed char compress_rt[24]; // 24 == RT_LAST
|
||||||
int strip_relocs;
|
int strip_relocs;
|
||||||
} w32pe;
|
} w32pe;
|
||||||
};
|
};
|
||||||
|
|
|
@ -67,7 +67,7 @@ void init_options(struct options_t *o)
|
||||||
o->w32pe.compress_exports = 1;
|
o->w32pe.compress_exports = 1;
|
||||||
o->w32pe.compress_icons = 2;
|
o->w32pe.compress_icons = 2;
|
||||||
o->w32pe.compress_resources = -1;
|
o->w32pe.compress_resources = -1;
|
||||||
for (int i = 0; i < RT_LAST; i++)
|
for (unsigned i = 0; i < HIGH(opt->w32pe.compress_rt); i++)
|
||||||
opt->w32pe.compress_rt[i] = -1;
|
opt->w32pe.compress_rt[i] = -1;
|
||||||
o->w32pe.strip_relocs = -1;
|
o->w32pe.strip_relocs = -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ PackW32Pe::PackW32Pe(InputFile *f) : super(f)
|
||||||
//printf("pe_section_t %d\n", (int) sizeof(pe_section_t));
|
//printf("pe_section_t %d\n", (int) sizeof(pe_section_t));
|
||||||
COMPILE_TIME_ASSERT(sizeof(pe_header_t) == 248);
|
COMPILE_TIME_ASSERT(sizeof(pe_header_t) == 248);
|
||||||
COMPILE_TIME_ASSERT(sizeof(pe_section_t) == 40);
|
COMPILE_TIME_ASSERT(sizeof(pe_section_t) == 40);
|
||||||
|
COMPILE_TIME_ASSERT(RT_LAST == HIGH(opt->w32pe.compress_rt));
|
||||||
|
|
||||||
isection = NULL;
|
isection = NULL;
|
||||||
oimport = NULL;
|
oimport = NULL;
|
||||||
|
@ -922,8 +923,19 @@ void PackW32Pe::processTls(Interval *iv) // pass 1
|
||||||
|
|
||||||
const tls * const tlsp = (const tls*) (ibuf + IDADDR(PEDIR_TLS));
|
const tls * const tlsp = (const tls*) (ibuf + IDADDR(PEDIR_TLS));
|
||||||
// note: TLS callbacks are not implemented in Windows 95/98/ME
|
// note: TLS callbacks are not implemented in Windows 95/98/ME
|
||||||
if (tlsp->callbacks && get_le32(ibuf + tlsp->callbacks - ih.imagebase))
|
if (tlsp->callbacks)
|
||||||
|
{
|
||||||
|
if (tlsp->callbacks < ih.imagebase)
|
||||||
|
throwCantPack("invalid TLS callback");
|
||||||
|
else if (tlsp->callbacks - ih.imagebase + 4 >= ih.imagesize)
|
||||||
|
throwCantPack("invalid TLS callback");
|
||||||
|
unsigned v = get_le32(ibuf + tlsp->callbacks - ih.imagebase);
|
||||||
|
if (v != 0)
|
||||||
|
{
|
||||||
|
//fprintf(stderr, "TLS callbacks: 0x%0x -> 0x%0x\n", (int)tlsp->callbacks, v);
|
||||||
throwCantPack("TLS callbacks are not supported");
|
throwCantPack("TLS callbacks are not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const unsigned tlsdatastart = tlsp->datastart - ih.imagebase;
|
const unsigned tlsdatastart = tlsp->datastart - ih.imagebase;
|
||||||
const unsigned tlsdataend = tlsp->dataend - ih.imagebase;
|
const unsigned tlsdataend = tlsp->dataend - ih.imagebase;
|
||||||
|
@ -1258,6 +1270,24 @@ void PackW32Pe::processResources(Resource *res)
|
||||||
const unsigned vaddr = IDADDR(PEDIR_RESOURCE);
|
const unsigned vaddr = IDADDR(PEDIR_RESOURCE);
|
||||||
if ((soresources = IDSIZE(PEDIR_RESOURCE)) == 0)
|
if ((soresources = IDSIZE(PEDIR_RESOURCE)) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// setup default options for resource compression
|
||||||
|
if (opt->w32pe.compress_resources < 0)
|
||||||
|
opt->w32pe.compress_resources = true;
|
||||||
|
if (!opt->w32pe.compress_resources)
|
||||||
|
{
|
||||||
|
opt->w32pe.compress_icons = false;
|
||||||
|
for (int i = 0; i < RT_LAST; i++)
|
||||||
|
opt->w32pe.compress_rt[i] = false;
|
||||||
|
}
|
||||||
|
if (opt->w32pe.compress_rt[RT_STRING] < 0)
|
||||||
|
{
|
||||||
|
// by default, don't compress RT_STRINGs of screensavers (".scr")
|
||||||
|
opt->w32pe.compress_rt[RT_STRING] = true;
|
||||||
|
if (fn_has_ext(fi->getName(),"scr"))
|
||||||
|
opt->w32pe.compress_rt[RT_STRING] = false;
|
||||||
|
}
|
||||||
|
|
||||||
res->init(ibuf + vaddr);
|
res->init(ibuf + vaddr);
|
||||||
|
|
||||||
for (soresources = res->dirsize(); res->next(); soresources += 4 + res->size())
|
for (soresources = res->dirsize(); res->next(); soresources += 4 + res->size())
|
||||||
|
@ -1268,7 +1298,7 @@ void PackW32Pe::processResources(Resource *res)
|
||||||
unsigned iconsin1stdir = 0;
|
unsigned iconsin1stdir = 0;
|
||||||
if (opt->w32pe.compress_icons == 2)
|
if (opt->w32pe.compress_icons == 2)
|
||||||
while (res->next()) // there is no rewind() in Resource
|
while (res->next()) // there is no rewind() in Resource
|
||||||
if (res->itype() == 14 && iconsin1stdir == 0)
|
if (res->itype() == RT_GROUP_ICON && iconsin1stdir == 0)
|
||||||
iconsin1stdir = get_le16(ibuf + res->offs() + 4);
|
iconsin1stdir = get_le16(ibuf + res->offs() + 4);
|
||||||
|
|
||||||
bool compress_icon = false, compress_idir = false;
|
bool compress_icon = false, compress_idir = false;
|
||||||
|
@ -1284,25 +1314,28 @@ void PackW32Pe::processResources(Resource *res)
|
||||||
{
|
{
|
||||||
const unsigned rtype = res->itype();
|
const unsigned rtype = res->itype();
|
||||||
bool do_compress = true;
|
bool do_compress = true;
|
||||||
if (rtype == 16) // version info
|
if (!opt->w32pe.compress_resources)
|
||||||
do_compress = false;
|
do_compress = false;
|
||||||
else if (rtype == 3) // icon
|
else if (rtype == RT_VERSION) // version info
|
||||||
|
do_compress = false;
|
||||||
|
else if (rtype == RT_ICON) // icon
|
||||||
do_compress = compress_icon && opt->w32pe.compress_icons;
|
do_compress = compress_icon && opt->w32pe.compress_icons;
|
||||||
else if (rtype == 14) // icon directory
|
else if (rtype == RT_GROUP_ICON) // icon directory
|
||||||
do_compress = compress_idir && opt->w32pe.compress_icons;
|
do_compress = compress_idir && opt->w32pe.compress_icons;
|
||||||
|
else if (rtype > 0 && rtype < RT_LAST)
|
||||||
|
do_compress = opt->w32pe.compress_rt[rtype] ? true : false;
|
||||||
else if (res->ntype()) // named resource type
|
else if (res->ntype()) // named resource type
|
||||||
if (0 == memcmp(res->ntype(),"\x7\x0T\x0Y\x0P\x0""E\x0L\x0I\x0""B\x0",16)
|
if (0 == memcmp(res->ntype(),"\x7\x0T\x0Y\x0P\x0""E\x0L\x0I\x0""B\x0",16)
|
||||||
|| 0 == memcmp(res->ntype(),"\x8\x0R\x0""E\x0G\x0I\x0S\x0T\x0R\x0Y\x0",18))
|
|| 0 == memcmp(res->ntype(),"\x8\x0R\x0""E\x0G\x0I\x0S\x0T\x0R\x0Y\x0",18))
|
||||||
do_compress = false; // typelib or registry
|
do_compress = false; // typelib or registry
|
||||||
|
|
||||||
if (!opt->w32pe.compress_resources)
|
|
||||||
do_compress = false;
|
|
||||||
if (do_compress)
|
if (do_compress)
|
||||||
{
|
{
|
||||||
csize += res->size();
|
csize += res->size();
|
||||||
cnum++;
|
cnum++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
usize += res->size();
|
usize += res->size();
|
||||||
unum++;
|
unum++;
|
||||||
|
|
||||||
|
@ -1311,9 +1344,9 @@ void PackW32Pe::processResources(Resource *res)
|
||||||
memcpy(ores,ibuf + res->offs(),res->size());
|
memcpy(ores,ibuf + res->offs(),res->size());
|
||||||
memset(ibuf + res->offs(),FILLVAL,res->size());
|
memset(ibuf + res->offs(),FILLVAL,res->size());
|
||||||
res->newoffs() = ptr_diff(ores,oresources);
|
res->newoffs() = ptr_diff(ores,oresources);
|
||||||
if (rtype == 3)
|
if (rtype == RT_ICON)
|
||||||
compress_icon = (++iconcnt >= iconsin1stdir || opt->w32pe.compress_icons == 1);
|
compress_icon = (++iconcnt >= iconsin1stdir || opt->w32pe.compress_icons == 1);
|
||||||
else if (rtype == 14)
|
else if (rtype == RT_GROUP_ICON)
|
||||||
{
|
{
|
||||||
if (opt->w32pe.compress_icons == 1)
|
if (opt->w32pe.compress_icons == 1)
|
||||||
{
|
{
|
||||||
|
@ -1507,7 +1540,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
||||||
throwCantPack("filealign < 0x200 is not yet supported");
|
throwCantPack("filealign < 0x200 is not yet supported");
|
||||||
|
|
||||||
handleStub(fi,fo,pe_offset);
|
handleStub(fi,fo,pe_offset);
|
||||||
unsigned usize = ih.imagesize;
|
const unsigned usize = ih.imagesize;
|
||||||
const unsigned xtrasize = 65536+IDSIZE(PEDIR_IMPORT)+IDSIZE(PEDIR_BOUNDIM)+IDSIZE(PEDIR_IAT)+IDSIZE(PEDIR_DELAYIMP)+IDSIZE(PEDIR_RELOC);
|
const unsigned xtrasize = 65536+IDSIZE(PEDIR_IMPORT)+IDSIZE(PEDIR_BOUNDIM)+IDSIZE(PEDIR_IAT)+IDSIZE(PEDIR_DELAYIMP)+IDSIZE(PEDIR_RELOC);
|
||||||
ibuf.alloc(usize + xtrasize);
|
ibuf.alloc(usize + xtrasize);
|
||||||
|
|
||||||
|
@ -1538,8 +1571,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
||||||
if (!opt->force)
|
if (!opt->force)
|
||||||
throwCantPack("writeable shared sections not supported (try --force)");
|
throwCantPack("writeable shared sections not supported (try --force)");
|
||||||
if (jc && isection[ic].rawdataptr - jc > ih.filealign)
|
if (jc && isection[ic].rawdataptr - jc > ih.filealign)
|
||||||
if (!opt->force)
|
throwCantPack("superfluous data between sections");
|
||||||
throwCantPack("superfluous data between sections (try --force)");
|
|
||||||
fi->seek(isection[ic].rawdataptr,SEEK_SET);
|
fi->seek(isection[ic].rawdataptr,SEEK_SET);
|
||||||
jc = isection[ic].size;
|
jc = isection[ic].size;
|
||||||
if (jc > isection[ic].vsize)
|
if (jc > isection[ic].vsize)
|
||||||
|
@ -1842,14 +1874,8 @@ void PackW32Pe::pack(OutputFile *fo)
|
||||||
oh.database = osection[2].vaddr;
|
oh.database = osection[2].vaddr;
|
||||||
oh.codesize = osection[1].vsize;
|
oh.codesize = osection[1].vsize;
|
||||||
oh.codebase = osection[1].vaddr;
|
oh.codebase = osection[1].vaddr;
|
||||||
oh.headersize = osection[0].rawdataptr;
|
// oh.headersize = osection[0].rawdataptr;
|
||||||
|
|
||||||
if (((oh.headersize + oam1) &~ oam1) < rvamin)
|
|
||||||
{
|
|
||||||
if (!opt->force)
|
|
||||||
throwCantPack("untested branch (try --force)");
|
|
||||||
oh.headersize = rvamin;
|
oh.headersize = rvamin;
|
||||||
}
|
|
||||||
|
|
||||||
if (opt->w32pe.strip_relocs && !isdll)
|
if (opt->w32pe.strip_relocs && !isdll)
|
||||||
oh.flags |= RELOCS_STRIPPED;
|
oh.flags |= RELOCS_STRIPPED;
|
||||||
|
@ -2168,7 +2194,7 @@ void PackW32Pe::rebuildResources(upx_byte *& extrainfo)
|
||||||
unsigned origoffs = get_le32(r + res.offs() - 4);
|
unsigned origoffs = get_le32(r + res.offs() - 4);
|
||||||
res.newoffs() = origoffs;
|
res.newoffs() = origoffs;
|
||||||
memcpy(obuf + origoffs - rvamin,r + res.offs(),res.size());
|
memcpy(obuf + origoffs - rvamin,r + res.offs(),res.size());
|
||||||
if (icondir_count && res.itype() == 14)
|
if (icondir_count && res.itype() == RT_GROUP_ICON)
|
||||||
{
|
{
|
||||||
set_le16(obuf + origoffs - rvamin + 4,icondir_count);
|
set_le16(obuf + origoffs - rvamin + 4,icondir_count);
|
||||||
icondir_count = 0;
|
icondir_count = 0;
|
||||||
|
@ -2241,8 +2267,10 @@ void PackW32Pe::unpack(OutputFile *fo)
|
||||||
ODSIZE(PEDIR_IAT) = 0;
|
ODSIZE(PEDIR_IAT) = 0;
|
||||||
ODADDR(PEDIR_BOUNDIM) = 0;
|
ODADDR(PEDIR_BOUNDIM) = 0;
|
||||||
ODSIZE(PEDIR_BOUNDIM) = 0;
|
ODSIZE(PEDIR_BOUNDIM) = 0;
|
||||||
|
|
||||||
// oh.headersize = osection[0].rawdataptr;
|
// oh.headersize = osection[0].rawdataptr;
|
||||||
oh.headersize = ALIGN_UP(pe_offset + sizeof(oh) + sizeof(pe_section_t) * objs, oh.filealign);
|
// oh.headersize = ALIGN_UP(pe_offset + sizeof(oh) + sizeof(pe_section_t) * objs, oh.filealign);
|
||||||
|
oh.headersize = rvamin;
|
||||||
oh.chksum = 0;
|
oh.chksum = 0;
|
||||||
|
|
||||||
// FIXME: ih.flags is checked here because of a bug in UPX 0.92
|
// FIXME: ih.flags is checked here because of a bug in UPX 0.92
|
||||||
|
@ -2286,6 +2314,7 @@ void PackW32Pe::unpack(OutputFile *fo)
|
||||||
<offset of extra info 4>
|
<offset of extra info 4>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et
|
vi:ts=4:et
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -224,6 +224,15 @@ protected:
|
||||||
DLL_FLAG = 0x2000,
|
DLL_FLAG = 0x2000,
|
||||||
FBIG_ENDIAN = 0x8000
|
FBIG_ENDIAN = 0x8000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// resource types
|
||||||
|
enum {
|
||||||
|
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
|
||||||
|
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGE_TABLE,
|
||||||
|
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
|
||||||
|
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
|
||||||
|
RT_LAST
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#define UPX_VERSION 0x011103 /* 01.11.03 */
|
#define UPX_VERSION 0x011104 /* 01.11.04 */
|
||||||
#define UPX_VERSION_STRING "1.11.3"
|
#define UPX_VERSION_STRING "1.11.4"
|
||||||
#define UPX_VERSION_STRING4 "1.11"
|
#define UPX_VERSION_STRING4 "1.11"
|
||||||
#define UPX_VERSION_DATE "Jan 4th 2001"
|
#define UPX_VERSION_DATE "Feb 20th 2001"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user