Compare commits

...

5 Commits

Author SHA1 Message Date
Markus F.X.J. Oberhumer adcb357242 Updated.
committer: mfx <mfx> 977342634 +0000
2000-12-20 20:03:54 +00:00
Markus F.X.J. Oberhumer 1e1a078808 Cleaned up Packer::readPackHeader().
committer: mfx <mfx> 977342419 +0000
2000-12-20 20:00:19 +00:00
Markus F.X.J. Oberhumer 7d652fa42b Increased precision of get_ratio() and swapped parameters.
committer: mfx <mfx> 977342070 +0000
2000-12-20 19:54:30 +00:00
László Molnár a42e72094a fixed CUTPOINT related stuff
committer: ml1050 <ml1050> 977333745 +0000
2000-12-20 17:35:45 +00:00
Markus F.X.J. Oberhumer 97ff8042b4 Added a note that this file is completely out of date. We really should
start a new TODO list.

committer: mfx <mfx> 977314954 +0000
2000-12-20 12:22:34 +00:00
18 changed files with 81 additions and 73 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
User visible changes for UPX
==================================================================
Changes in 1.10 beta (20 Dec 2000):
Changes in 1.11 beta (20 Dec 2000):
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING!!! REALLY.
* vmlinuz/386: new format - UPX now supports bootable linux kernels
* linux/386: added the new direct-to-memory executable formats - no
+3 -2
View File
@@ -1,5 +1,6 @@
- The UCL license is GPL, this will cause problems for the antivirus
programs which can't use the uncompressor because of this. Or am I wrong?
NOTE: this TODO list is completely out of date (~ Dec 1999)
===================================================================
- Rearrange this TODO list, sort by categories, add a priority (1-5)
+2 -2
View File
@@ -97,7 +97,7 @@ void PackCom::patchLoader(OutputFile *fo,
unsigned calls, unsigned overlapoh)
{
const int filter_id = ph.filter;
const int e_len = getLoaderSection("COMCUTPO");
const int e_len = getLoaderSectionStart("COMCUTPO");
const int d_len = lsize - e_len;
assert(e_len > 0 && e_len < 256);
assert(d_len > 0 && d_len < 256);
@@ -234,7 +234,7 @@ void PackCom::pack(OutputFile *fo)
int PackCom::canUnpack()
{
if (!readPackHeader(128, 0))
if (!readPackHeader(128))
return false;
if (file_size <= (off_t) ph.c_len)
return false;
+2 -1
View File
@@ -378,7 +378,8 @@ int PackDjgpp2::canUnpack()
return false;
if (is_dlm(fi,coff_offset))
throwCantUnpack("can't handle DLM");
return readPackHeader(1024, coff_offset) ? 1 : -1;
fi->seek(coff_offset, SEEK_SET);
return readPackHeader(1024) ? 1 : -1;
}
+5 -4
View File
@@ -264,7 +264,7 @@ void PackExe::pack(OutputFile *fo)
fi->seek(ih.headsize16*16,SEEK_SET);
fi->readx(ibuf,imagesize);
if (find_le32(ibuf, UPX_MAX(imagesize, 127u), UPX_MAGIC_LE32) >= 0)
if (find_le32(ibuf, UPX_MIN(imagesize, 127u), UPX_MAGIC_LE32) >= 0)
throwAlreadyPacked();
// relocations
@@ -413,7 +413,7 @@ void PackExe::pack(OutputFile *fo)
//OutputFile::dump("xxloader.dat", loader, lsize);
// patch loader
const unsigned e_len = getLoaderSection("EXECUTPO");
const unsigned e_len = getLoaderSectionStart("EXECUTPO");
const unsigned d_len = lsize - e_len;
assert((e_len&15) == 0);
@@ -531,8 +531,9 @@ int PackExe::canUnpack()
{
if (!readFileHeader())
return false;
const off_t off = ih.headsize16*16;
bool b = readPackHeader(128, off);
const off_t off = ih.headsize16 * 16;
fi->seek(off, SEEK_SET);
bool b = readPackHeader(128);
return b && (off + (off_t) ph.c_len <= file_size);
}
+2 -1
View File
@@ -69,7 +69,7 @@ void PackSys::patchLoader(OutputFile *fo,
unsigned calls, unsigned overlapoh)
{
const int filter_id = ph.filter;
const int e_len = getLoaderSection("SYSCUTPO");
const int e_len = getLoaderSectionStart("SYSCUTPO");
const int d_len = lsize - e_len;
assert(e_len > 0 && e_len < 256);
assert(d_len > 0 && d_len < 256);
@@ -88,6 +88,7 @@ void PackSys::patchLoader(OutputFile *fo,
assert(calls > 0);
patch_le16(loader,lsize,"CT",calls);
}
patchPackHeader(loader,e_len);
const unsigned jmp_pos = find_le16(loader,e_len,get_le16("JM"));
patch_le16(loader,e_len,"JM",ph.u_len+overlapoh+2-jmp_pos-2);
+3 -2
View File
@@ -217,7 +217,7 @@ void PackTmt::pack(OutputFile *fo)
memcpy(loader,getLoader(),lsize);
const unsigned s_point = getLoaderSection("TMTMAIN1");
int e_len = getLoaderSection("TMTCUTPO");
int e_len = getLoaderSectionStart("TMTCUTPO");
const unsigned d_len = lsize - e_len;
assert(e_len > 0 && s_point > 0);
@@ -265,7 +265,8 @@ int PackTmt::canUnpack()
{
if (!PackTmt::readFileHeader())
return false;
return readPackHeader(512,adam_offset) ? 1 : -1;
fi->seek(adam_offset, SEEK_SET);
return readPackHeader(512) ? 1 : -1;
}
+1 -1
View File
@@ -558,7 +558,7 @@ int PackTos::canUnpack()
{
if (!readFileHeader())
return false;
if (!readPackHeader(512, 0))
if (!readPackHeader(512))
return false;
// check header as set by packer
if ((ih.fh_text & 3) != 0 || (ih.fh_data & 3) != 0 || (ih.fh_bss & 3) != 0
+2 -1
View File
@@ -212,7 +212,8 @@ int PackUnix::canUnpack()
const int bufsize = sizeof(buf);
fi->seek(-bufsize, SEEK_END);
if (!readPackHeader(128, -1, buf))
fi->readx(buf, bufsize);
if (!getPackHeader(buf, bufsize))
return false;
int l = ph.buf_offset + ph.getPackHeaderSize();
+4 -1
View File
@@ -345,7 +345,10 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
int PackVmlinuzI386::canUnpack()
{
return readFileHeader() == getFormat();
if (readFileHeader() != getFormat())
return false;
fi->seek(setup_size, SEEK_SET);
return readPackHeader(1024) ? 1 : -1;
}
+9 -2
View File
@@ -1925,8 +1925,15 @@ int PackW32Pe::canUnpack()
bool found_ph = false;
if (memcmp(isection[0].name,"UPX",3) == 0)
{
found_ph = readPackHeader(1024, isection[1].rawdataptr - 64) // current version
|| readPackHeader(1024, isection[2].rawdataptr); // old versions
// current version
fi->seek(isection[1].rawdataptr - 64, SEEK_SET);
found_ph = readPackHeader(1024);
if (!found_ph)
{
// old versions
fi->seek(isection[2].rawdataptr, SEEK_SET);
found_ph = readPackHeader(1024);
}
}
if (is_packed && found_ph)
return true;
+3 -2
View File
@@ -481,7 +481,7 @@ void PackWcle::pack(OutputFile *fo)
const unsigned lsize = getLoaderSize();
neweip = getLoaderSection("WCLEMAIN");
int e_len = getLoaderSection("WCLECUTP");
int e_len = getLoaderSectionStart("WCLECUTP");
const unsigned d_len = lsize - e_len;
assert(e_len > 0);
@@ -745,8 +745,9 @@ int PackWcle::canUnpack()
{
if (!LeFile::readFileHeader())
return false;
fi->seek(exe_offset + ih.data_pages_offset, SEEK_SET);
// FIXME: 1024 could be too large for some files
return readPackHeader(1024, ih.data_pages_offset+exe_offset) ? 1 : -1;
return readPackHeader(1024) ? 1 : -1;
}
+13 -19
View File
@@ -594,26 +594,9 @@ int Packer::patchPackHeader(void *b, int blen)
}
bool Packer::readPackHeader(unsigned len, off_t seek_offset, upx_byte *buf)
bool Packer::getPackHeader(void *b, int blen)
{
assert((int)len > 0);
MemBuffer hbuf;
if (buf == NULL)
{
hbuf.alloc(len);
buf = hbuf;
}
memset(buf, 0, len);
if (seek_offset != -1)
{
if (seek_offset >= 0)
fi->seek(seek_offset, SEEK_SET);
}
len = fi->read(buf,len);
if (!ph.fillPackHeader(buf, len))
if (!ph.fillPackHeader((unsigned char *)b, blen))
return false;
if (ph.version > getVersion())
@@ -649,6 +632,17 @@ bool Packer::readPackHeader(unsigned len, off_t seek_offset, upx_byte *buf)
}
bool Packer::readPackHeader(int len)
{
assert((int)len > 0);
MemBuffer buf(len);
len = fi->read(buf, len);
if (len <= 0)
return false;
return getPackHeader(buf, len);
}
/*************************************************************************
// patch util for loader
**************************************************************************/
+2 -2
View File
@@ -180,8 +180,8 @@ protected:
// packheader handling
virtual int patchPackHeader(void *b, int blen);
virtual bool readPackHeader(unsigned len, off_t seek_offset,
upx_byte *buf=NULL);
virtual bool getPackHeader(void *b, int blen);
virtual bool readPackHeader(int len);
// filter handling
virtual bool isValidFilter(int filter_id) const;
+14 -14
View File
@@ -117,20 +117,15 @@ static const char *mkline(unsigned long fu_len, unsigned long fc_len,
char r[7+1];
const char *f;
#if 0
unsigned ratio = get_ratio(fc_len,fu_len);
upx_snprintf(r,sizeof(r)," %1d.%03d", ratio / 10000, (ratio % 10000) / 10);
#else
unsigned ratio = get_ratio(fc_len,fu_len, 1000);
upx_snprintf(r,sizeof(r),"%3d.%02d%%", ratio / 1000, (ratio % 1000) / 10);
UNUSED(u_len); UNUSED(c_len);
#endif
unsigned ratio = get_ratio(fu_len, fc_len);
upx_snprintf(r,sizeof(r),"%3d.%02d%%", ratio / 10000, (ratio % 10000) / 100);
if (decompress)
f = "%10ld <-%10ld %7s %13s %s";
else
f = "%10ld ->%10ld %7s %13s %s";
upx_snprintf(buf,sizeof(buf),f,
fu_len, fc_len, r, center_string(format_name,13), filename);
UNUSED(u_len); UNUSED(c_len);
return buf;
}
@@ -351,7 +346,7 @@ void __UPX_ENTRY UiPacker::callback(upx_uint isize, upx_uint osize, int state, v
void UiPacker::doCallback(unsigned isize, unsigned osize)
{
static const char spinner[] = "|\\-/";
static const char spinner[] = "|/-\\";
if (s->pass < 0) // no callback wanted
return;
@@ -373,8 +368,13 @@ void UiPacker::doCallback(unsigned isize, unsigned osize)
// compute progress position
int pos = -1;
if (isize > 0)
pos = get_ratio(isize,s->u_len) * s->bar_len / 10000;
if (isize >= s->u_len)
pos = s->bar_len;
else if (isize > 0)
{
pos = get_ratio(s->u_len, isize) * s->bar_len / 1000000;
assert(pos >= 0); assert(pos <= s->bar_len);
}
if (pos < s->pos)
return;
if (pos < 0 && pos == s->pos)
@@ -397,12 +397,12 @@ void UiPacker::doCallback(unsigned isize, unsigned osize)
*m++ = ']';
// compute current compression ratio
unsigned ratio = 100*100;
unsigned ratio = 1000000;
if (osize > 0)
ratio = get_ratio(osize,isize);
ratio = get_ratio(isize, osize);
sprintf(m," %3d.%1d%% %c ",
ratio / 100, (ratio % 100) / 10,
ratio / 10000, (ratio % 10000) / 1000,
spinner[s->counter]);
assert((int)strlen(s->msg_buf) < 1 + 80);
+12 -14
View File
@@ -443,23 +443,21 @@ bool isafile(int fd)
/*************************************************************************
//
// return compression ratio, where 100% == 1000*1000 == 1e6
**************************************************************************/
unsigned get_ratio (unsigned long packedsize, unsigned long size,
unsigned long scale)
unsigned get_ratio (unsigned u_len, unsigned c_len)
{
unsigned long n1, n2;
n1 = 100 * scale; n2 = 1;
if (size <= 0)
return (unsigned) n1;
while (n1 > 1 && packedsize > (ULONG_MAX / n1))
{
n1 /= 10;
n2 *= 10;
}
return (unsigned) ((packedsize * n1) / (size / n2)) + 5;
#if defined(__GNUC__)
const unsigned long long n = 1000000;
#elif defined(_MSC_VER)
const unsigned __int64 n = 1000000;
#else
#error
#endif
if (u_len <= 0)
return (unsigned) n;
return (unsigned) ((c_len * n) / u_len) + 5;
}
+1 -2
View File
@@ -48,8 +48,7 @@ bool maketempname(char *ofilename, const char *ifilename,
bool makebakname(char *ofilename, const char *ifilename, bool force=true);
bool isafile(int fd);
unsigned get_ratio(unsigned long packedsize, unsigned long size,
unsigned long scale=100);
unsigned get_ratio(unsigned u_len, unsigned c_len);
char *center_string(const char *name, size_t s);
+2 -2
View File
@@ -1,3 +1,3 @@
#define UPX_VERSION 0x011000 /* 01.10.00 */
#define UPX_VERSION_STRING "1.10"
#define UPX_VERSION 0x011100 /* 01.11.00 */
#define UPX_VERSION_STRING "1.11"
#define UPX_VERSION_DATE "Dec 20th 2000"