mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
PeFile: better checking for import descriptors
modified: pefile.cpp
This commit is contained in:
parent
5d9dcb634b
commit
58771ecca6
|
@ -555,37 +555,49 @@ void PeFile64::processRelocs() // pass1
|
||||||
//__packed_struct_end()
|
//__packed_struct_end()
|
||||||
|
|
||||||
LE32& PeFile::IDSIZE(unsigned x) {
|
LE32& PeFile::IDSIZE(unsigned x) {
|
||||||
if ((file_size - sizeof(import_desc)) < iddirs[x].size) {
|
unsigned const z = iddirs[x].size + iddirs[x].vaddr;
|
||||||
char buf[52];
|
if (z < iddirs[x].size // wrap-around
|
||||||
snprintf(buf,sizeof(buf),"bad import[%d].size %#x",
|
|| file_size < z // overrun
|
||||||
(unsigned)x, (unsigned)iddirs[x].size);
|
) {
|
||||||
|
char buf[60];
|
||||||
|
snprintf(buf,sizeof(buf),"bad import[%d]{%#x, %#x}",
|
||||||
|
(unsigned)x, (unsigned)iddirs[x].vaddr, (unsigned)iddirs[x].size);
|
||||||
throwCantPack(buf);
|
throwCantPack(buf);
|
||||||
}
|
}
|
||||||
return iddirs[x].size;
|
return iddirs[x].size;
|
||||||
}
|
}
|
||||||
LE32& PeFile::IDADDR(unsigned x) {
|
LE32& PeFile::IDADDR(unsigned x) {
|
||||||
if ((file_size - sizeof(import_desc)) < iddirs[x].vaddr) {
|
unsigned const z = iddirs[x].size + iddirs[x].vaddr;
|
||||||
char buf[52];
|
if (z < iddirs[x].vaddr // wrap-around
|
||||||
snprintf(buf,sizeof(buf),"bad import[%d].vaddr %#x",
|
|| file_size < z // overrun
|
||||||
(unsigned)x, (unsigned)iddirs[x].vaddr);
|
) {
|
||||||
|
char buf[60];
|
||||||
|
snprintf(buf,sizeof(buf),"bad import[%d]{%#x, %#x}",
|
||||||
|
(unsigned)x, (unsigned)iddirs[x].vaddr, (unsigned)iddirs[x].size);
|
||||||
throwCantPack(buf);
|
throwCantPack(buf);
|
||||||
}
|
}
|
||||||
return iddirs[x].vaddr;
|
return iddirs[x].vaddr;
|
||||||
}
|
}
|
||||||
LE32& PeFile::ODSIZE(unsigned x) {
|
LE32& PeFile::ODSIZE(unsigned x) {
|
||||||
if ((file_size - sizeof(import_desc)) < oddirs[x].size) {
|
unsigned const z = oddirs[x].size + oddirs[x].vaddr;
|
||||||
char buf[52];
|
if (z < oddirs[x].size // wrap-around
|
||||||
snprintf(buf,sizeof(buf),"bad export[%d].size %#x",
|
|| file_size < z // overrun
|
||||||
(unsigned)x, (unsigned)oddirs[x].size);
|
) {
|
||||||
|
char buf[60];
|
||||||
|
snprintf(buf,sizeof(buf),"bad export[%d]{%#x, %#x}",
|
||||||
|
(unsigned)x, (unsigned)oddirs[x].vaddr, (unsigned)oddirs[x].size);
|
||||||
throwCantPack(buf);
|
throwCantPack(buf);
|
||||||
}
|
}
|
||||||
return oddirs[x].size;
|
return oddirs[x].size;
|
||||||
}
|
}
|
||||||
LE32& PeFile::ODADDR(unsigned x) {
|
LE32& PeFile::ODADDR(unsigned x) {
|
||||||
if ((file_size - sizeof(import_desc)) < oddirs[x].vaddr) {
|
unsigned const z = oddirs[x].size + oddirs[x].vaddr;
|
||||||
char buf[52];
|
if (z < oddirs[x].vaddr // wrap-around
|
||||||
snprintf(buf,sizeof(buf),"bad export[%d].vaddr %#x",
|
|| file_size < z // overrun
|
||||||
(unsigned)x, (unsigned)oddirs[x].vaddr);
|
) {
|
||||||
|
char buf[60];
|
||||||
|
snprintf(buf,sizeof(buf),"bad export[%d]{%#x, %#x}",
|
||||||
|
(unsigned)x, (unsigned)oddirs[x].vaddr, (unsigned)oddirs[x].size);
|
||||||
throwCantPack(buf);
|
throwCantPack(buf);
|
||||||
}
|
}
|
||||||
return oddirs[x].vaddr;
|
return oddirs[x].vaddr;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user