pe: loadconf handling moved to PeFile
This commit is contained in:
@@ -111,12 +111,9 @@ static void xcheck(size_t poff, size_t plen, const void *b, size_t blen)
|
|||||||
|
|
||||||
PackW32Pe::PackW32Pe(InputFile *f) : super(f)
|
PackW32Pe::PackW32Pe(InputFile *f) : super(f)
|
||||||
{
|
{
|
||||||
oloadconf = NULL;
|
|
||||||
soloadconf = 0;
|
|
||||||
isrtm = false;
|
isrtm = false;
|
||||||
use_dep_hack = true;
|
use_dep_hack = true;
|
||||||
use_clear_dirty_stack = true;
|
use_clear_dirty_stack = true;
|
||||||
use_tls_callbacks = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -162,52 +159,6 @@ int PackW32Pe::readFileHeader()
|
|||||||
return super::readFileHeader();
|
return super::readFileHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Load Configuration handling
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
void PackW32Pe::processLoadConf(Interval *iv) // pass 1
|
|
||||||
{
|
|
||||||
if (IDSIZE(PEDIR_LOADCONF) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const unsigned lcaddr = IDADDR(PEDIR_LOADCONF);
|
|
||||||
const upx_byte * const loadconf = ibuf + lcaddr;
|
|
||||||
soloadconf = get_le32(loadconf);
|
|
||||||
if (soloadconf == 0)
|
|
||||||
return;
|
|
||||||
if (soloadconf > 256)
|
|
||||||
throwCantPack("size of Load Configuration directory unexpected");
|
|
||||||
|
|
||||||
// if there were relocation entries referring to the load config table
|
|
||||||
// then we need them for the copy of the table too
|
|
||||||
unsigned pos,type;
|
|
||||||
Reloc rel(ibuf + IDADDR(PEDIR_RELOC), IDSIZE(PEDIR_RELOC));
|
|
||||||
while (rel.next(pos, type))
|
|
||||||
if (pos >= lcaddr && pos < lcaddr + soloadconf)
|
|
||||||
{
|
|
||||||
iv->add(pos - lcaddr, type);
|
|
||||||
// printf("loadconf reloc detected: %x\n", pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
oloadconf = new upx_byte[soloadconf];
|
|
||||||
memcpy(oloadconf, loadconf, soloadconf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PackW32Pe::processLoadConf(Reloc *rel, const Interval *iv,
|
|
||||||
unsigned newaddr) // pass2
|
|
||||||
{
|
|
||||||
// now we have the address of the new load config table
|
|
||||||
// so we can create the new relocation entries
|
|
||||||
for (unsigned ic = 0; ic < iv->ivnum; ic++)
|
|
||||||
{
|
|
||||||
rel->add(iv->ivarr[ic].start + newaddr, iv->ivarr[ic].len);
|
|
||||||
//printf("loadconf reloc added: %x %d\n",
|
|
||||||
// iv->ivarr[ic].start + newaddr, iv->ivarr[ic].len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// pack
|
// pack
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -58,18 +58,9 @@ protected:
|
|||||||
virtual void buildLoader(const Filter *ft);
|
virtual void buildLoader(const Filter *ft);
|
||||||
virtual Linker* newLinker() const;
|
virtual Linker* newLinker() const;
|
||||||
|
|
||||||
void processLoadConf(Reloc *, const Interval *, unsigned);
|
|
||||||
void processLoadConf(Interval *);
|
|
||||||
upx_byte *oloadconf;
|
|
||||||
unsigned soloadconf;
|
|
||||||
|
|
||||||
unsigned tlscb_ptr; //NEW: TLS callback handling - Stefan Widmann
|
|
||||||
unsigned tls_handler_offset;
|
|
||||||
|
|
||||||
bool isrtm;
|
bool isrtm;
|
||||||
bool use_dep_hack;
|
bool use_dep_hack;
|
||||||
bool use_clear_dirty_stack;
|
bool use_clear_dirty_stack;
|
||||||
bool use_tls_callbacks; //NEW: TLS callback handling - Stefan Widmann
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ PeFile::PeFile(InputFile *f) : super(f)
|
|||||||
isdll = false;
|
isdll = false;
|
||||||
ilinker = NULL;
|
ilinker = NULL;
|
||||||
use_tls_callbacks = false;
|
use_tls_callbacks = false;
|
||||||
|
oloadconf = NULL;
|
||||||
|
soloadconf = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1275,6 +1277,50 @@ void PeFile::processTls2(Reloc *rel,const Interval *iv,unsigned newaddr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// Load Configuration handling
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
void PeFile::processLoadConf(Interval *iv) // pass 1
|
||||||
|
{
|
||||||
|
if (IDSIZE(PEDIR_LOADCONF) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const unsigned lcaddr = IDADDR(PEDIR_LOADCONF);
|
||||||
|
const upx_byte * const loadconf = ibuf + lcaddr;
|
||||||
|
soloadconf = get_le32(loadconf);
|
||||||
|
if (soloadconf == 0)
|
||||||
|
return;
|
||||||
|
if (soloadconf > 256)
|
||||||
|
throwCantPack("size of Load Configuration directory unexpected");
|
||||||
|
|
||||||
|
// if there were relocation entries referring to the load config table
|
||||||
|
// then we need them for the copy of the table too
|
||||||
|
unsigned pos,type;
|
||||||
|
Reloc rel(ibuf + IDADDR(PEDIR_RELOC), IDSIZE(PEDIR_RELOC));
|
||||||
|
while (rel.next(pos, type))
|
||||||
|
if (pos >= lcaddr && pos < lcaddr + soloadconf)
|
||||||
|
{
|
||||||
|
iv->add(pos - lcaddr, type);
|
||||||
|
// printf("loadconf reloc detected: %x\n", pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
oloadconf = new upx_byte[soloadconf];
|
||||||
|
memcpy(oloadconf, loadconf, soloadconf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeFile::processLoadConf(Reloc *rel, const Interval *iv,
|
||||||
|
unsigned newaddr) // pass2
|
||||||
|
{
|
||||||
|
// now we have the address of the new load config table
|
||||||
|
// so we can create the new relocation entries
|
||||||
|
for (unsigned ic = 0; ic < iv->ivnum; ic++)
|
||||||
|
{
|
||||||
|
rel->add(iv->ivarr[ic].start + newaddr, iv->ivarr[ic].len);
|
||||||
|
//printf("loadconf reloc added: %x %d\n",
|
||||||
|
// iv->ivarr[ic].start + newaddr, iv->ivarr[ic].len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// resource handling
|
// resource handling
|
||||||
|
|||||||
@@ -116,6 +116,11 @@ protected:
|
|||||||
unsigned tls_handler_offset;
|
unsigned tls_handler_offset;
|
||||||
bool use_tls_callbacks;
|
bool use_tls_callbacks;
|
||||||
|
|
||||||
|
void processLoadConf(Reloc *, const Interval *, unsigned);
|
||||||
|
void processLoadConf(Interval *);
|
||||||
|
upx_byte *oloadconf;
|
||||||
|
unsigned soloadconf;
|
||||||
|
|
||||||
unsigned stripDebug(unsigned);
|
unsigned stripDebug(unsigned);
|
||||||
|
|
||||||
unsigned icondir_offset;
|
unsigned icondir_offset;
|
||||||
|
|||||||
Reference in New Issue
Block a user