mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Cleaned up Packer::readPackHeader().
committer: mfx <mfx> 977342419 +0000
This commit is contained in:
parent
7d652fa42b
commit
1e1a078808
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -532,7 +532,8 @@ int PackExe::canUnpack()
|
|||
if (!readFileHeader())
|
||||
return false;
|
||||
const off_t off = ih.headsize16 * 16;
|
||||
bool b = readPackHeader(128, off);
|
||||
fi->seek(off, SEEK_SET);
|
||||
bool b = readPackHeader(128);
|
||||
return b && (off + (off_t) ph.c_len <= file_size);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
**************************************************************************/
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user