Fix unpacking of ASLR enabled PE files
This commit is contained in:
committed by
Markus F.X.J. Oberhumer
parent
740b4ff865
commit
1ce6f0e6f4
+12
-12
@@ -2933,6 +2933,18 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh,
|
|||||||
ft.unfilter(obuf + oh.codebase - rvamin, oh.codesize);
|
ft.unfilter(obuf + oh.codebase - rvamin, oh.codesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//NEW: disable reloc stripping if ASLR is enabled
|
||||||
|
if(ih.dllflags & IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE)
|
||||||
|
opt->win32_pe.strip_relocs = false;
|
||||||
|
|
||||||
|
// FIXME: ih.flags is checked here because of a bug in UPX 0.92
|
||||||
|
if ((opt->win32_pe.strip_relocs && !isdll) || (ih.flags & RELOCS_STRIPPED))
|
||||||
|
{
|
||||||
|
oh.flags |= RELOCS_STRIPPED;
|
||||||
|
ODADDR(PEDIR_RELOC) = 0;
|
||||||
|
ODSIZE(PEDIR_RELOC) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
rebuildImports<LEXX>(extrainfo, ord_mask, set_oft);
|
rebuildImports<LEXX>(extrainfo, ord_mask, set_oft);
|
||||||
rebuildRelocs(extrainfo, sizeof(ih.imagebase) * 8, oh.flags, oh.imagebase);
|
rebuildRelocs(extrainfo, sizeof(ih.imagebase) * 8, oh.flags, oh.imagebase);
|
||||||
rebuildTls();
|
rebuildTls();
|
||||||
@@ -2966,18 +2978,6 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh,
|
|||||||
oh.headersize = rvamin;
|
oh.headersize = rvamin;
|
||||||
oh.chksum = 0;
|
oh.chksum = 0;
|
||||||
|
|
||||||
//NEW: disable reloc stripping if ASLR is enabled
|
|
||||||
if(ih.dllflags & IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE)
|
|
||||||
opt->win32_pe.strip_relocs = false;
|
|
||||||
|
|
||||||
// FIXME: ih.flags is checked here because of a bug in UPX 0.92
|
|
||||||
if ((opt->win32_pe.strip_relocs && !isdll) || (ih.flags & RELOCS_STRIPPED))
|
|
||||||
{
|
|
||||||
oh.flags |= RELOCS_STRIPPED;
|
|
||||||
ODADDR(PEDIR_RELOC) = 0;
|
|
||||||
ODSIZE(PEDIR_RELOC) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// write decompressed file
|
// write decompressed file
|
||||||
if (fo)
|
if (fo)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user