Disabled compressWithFilters() for now.
committer: mfx <mfx> 974490371 +0000
This commit is contained in:
parent
e2326eabcf
commit
3be1f60c59
131
src/p_w32pe.cpp
131
src/p_w32pe.cpp
@ -79,6 +79,7 @@ PackW32Pe::PackW32Pe(InputFile *f) : super(f)
|
|||||||
importbyordinal = false;
|
importbyordinal = false;
|
||||||
kernel32ordinal = false;
|
kernel32ordinal = false;
|
||||||
tlsindex = 0;
|
tlsindex = 0;
|
||||||
|
big_relocs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -380,8 +381,10 @@ void PackW32Pe::processRelocs(Reloc *rel) // pass2
|
|||||||
soxrelocs = 0;
|
soxrelocs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PackW32Pe::processRelocs() // pass1
|
void PackW32Pe::processRelocs() // pass1
|
||||||
{
|
{
|
||||||
|
big_relocs = 0;
|
||||||
|
|
||||||
Reloc rel(ibuf + IDADDR(PEDIR_RELOC),IDSIZE(PEDIR_RELOC));
|
Reloc rel(ibuf + IDADDR(PEDIR_RELOC),IDSIZE(PEDIR_RELOC));
|
||||||
const unsigned *counts = rel.getcounts();
|
const unsigned *counts = rel.getcounts();
|
||||||
const unsigned rnum = counts[1] + counts[2] + counts[3];
|
const unsigned rnum = counts[1] + counts[2] + counts[3];
|
||||||
@ -391,7 +394,8 @@ int PackW32Pe::processRelocs() // pass1
|
|||||||
if (IDSIZE(PEDIR_RELOC))
|
if (IDSIZE(PEDIR_RELOC))
|
||||||
memset(ibuf + IDADDR(PEDIR_RELOC),FILLVAL,IDSIZE(PEDIR_RELOC));
|
memset(ibuf + IDADDR(PEDIR_RELOC),FILLVAL,IDSIZE(PEDIR_RELOC));
|
||||||
orelocs = new upx_byte [1];
|
orelocs = new upx_byte [1];
|
||||||
return sorelocs = 0;
|
sorelocs = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned ic;
|
unsigned ic;
|
||||||
@ -415,9 +419,8 @@ int PackW32Pe::processRelocs() // pass1
|
|||||||
fix[3] -= counts[3];
|
fix[3] -= counts[3];
|
||||||
|
|
||||||
memset(ibuf + IDADDR(PEDIR_RELOC),FILLVAL,IDSIZE(PEDIR_RELOC));
|
memset(ibuf + IDADDR(PEDIR_RELOC),FILLVAL,IDSIZE(PEDIR_RELOC));
|
||||||
int big = 0;
|
|
||||||
orelocs = new upx_byte [rnum * 4 + 1024]; // 1024 - safety
|
orelocs = new upx_byte [rnum * 4 + 1024]; // 1024 - safety
|
||||||
sorelocs = ptr_diff(optimizeReloc32((upx_byte*) fix[3],counts[3],orelocs,ibuf + rvamin,1,&big),orelocs);
|
sorelocs = ptr_diff(optimizeReloc32((upx_byte*) fix[3],counts[3],orelocs,ibuf + rvamin,1,&big_relocs),orelocs);
|
||||||
|
|
||||||
// append relocs type "LOW" then "HIGH"
|
// append relocs type "LOW" then "HIGH"
|
||||||
for (ic = 2; ic ; ic--)
|
for (ic = 2; ic ; ic--)
|
||||||
@ -431,12 +434,11 @@ int PackW32Pe::processRelocs() // pass1
|
|||||||
if (counts[ic])
|
if (counts[ic])
|
||||||
{
|
{
|
||||||
sorelocs += 4;
|
sorelocs += 4;
|
||||||
big |= 2 * ic;
|
big_relocs |= 2 * ic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete [] fix[3];
|
delete [] fix[3];
|
||||||
info("Relocations: original size: %u bytes, preprocessed size: %u bytes",(unsigned) IDSIZE(PEDIR_RELOC),sorelocs);
|
info("Relocations: original size: %u bytes, preprocessed size: %u bytes",(unsigned) IDSIZE(PEDIR_RELOC),sorelocs);
|
||||||
return big;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1401,6 +1403,61 @@ bool PackW32Pe::canPack()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PackW32Pe::buildLoader(const Filter *ft)
|
||||||
|
{
|
||||||
|
// prepare loader
|
||||||
|
initLoader(nrv_loader,sizeof(nrv_loader));
|
||||||
|
addLoader(isdll ? "PEISDLL1" : "",
|
||||||
|
"PEMAIN01",
|
||||||
|
icondir_count > 1 ? (icondir_count == 2 ? "PEICONS1" : "PEICONS2") : "",
|
||||||
|
tlsindex ? "PETLSHAK" : "",
|
||||||
|
"PEMAIN02",
|
||||||
|
getDecompressor(),
|
||||||
|
/*multipass ? "PEMULTIP" : */ "",
|
||||||
|
"PEMAIN10",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (ft->id)
|
||||||
|
{
|
||||||
|
const unsigned texv = ih.codebase - rvamin;
|
||||||
|
assert(ft->calls > 0);
|
||||||
|
addLoader(texv ? "PECTTPOS" : "PECTTNUL",NULL);
|
||||||
|
addFilter32(ft->id);
|
||||||
|
}
|
||||||
|
if (soimport)
|
||||||
|
addLoader("PEIMPORT",
|
||||||
|
importbyordinal ? "PEIBYORD" : "",
|
||||||
|
kernel32ordinal ? "PEK32ORD" : "",
|
||||||
|
importbyordinal ? "PEIMORD1" : "",
|
||||||
|
"PEIMPOR2",
|
||||||
|
isdll ? "PEIERDLL" : "PEIEREXE",
|
||||||
|
"PEIMDONE",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (sorelocs)
|
||||||
|
{
|
||||||
|
addLoader(soimport == 0 || soimport + cimports != crelocs ? "PERELOC1" : "PERELOC2",
|
||||||
|
"PERELOC3""RELOC320",
|
||||||
|
big_relocs ? "REL32BIG" : "",
|
||||||
|
"RELOC32J",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
//FIXME: the following should be moved out of the above if
|
||||||
|
addLoader(big_relocs&6 ? "PERLOHI0" : "",
|
||||||
|
big_relocs&4 ? "PERELLO0" : "",
|
||||||
|
big_relocs&2 ? "PERELHI0" : "",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
addLoader("PEMAIN20",
|
||||||
|
ih.entry ? "PEDOJUMP" : "PERETURN",
|
||||||
|
"IDENTSTR""UPX1HEAD",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
return getLoaderSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PackW32Pe::pack(OutputFile *fo)
|
void PackW32Pe::pack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
unsigned objs = ih.objects;
|
unsigned objs = ih.objects;
|
||||||
@ -1518,7 +1575,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
processTls(&tlsiv); // call before processRelocs!!
|
processTls(&tlsiv); // call before processRelocs!!
|
||||||
processResources(&res);
|
processResources(&res);
|
||||||
processExports(&xport);
|
processExports(&xport);
|
||||||
const int big = processRelocs();
|
processRelocs();
|
||||||
|
|
||||||
//FILE *f1=fopen("x1","wb");
|
//FILE *f1=fopen("x1","wb");
|
||||||
//fwrite(ibuf,1,usize,f1);
|
//fwrite(ibuf,1,usize,f1);
|
||||||
@ -1545,8 +1602,8 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
memcpy(ibuf+newvsize,oimport,soimport);
|
memcpy(ibuf+newvsize,oimport,soimport);
|
||||||
memcpy(ibuf+newvsize+soimport,orelocs,sorelocs);
|
memcpy(ibuf+newvsize+soimport,orelocs,sorelocs);
|
||||||
|
|
||||||
const unsigned cimports = newvsize - rvamin; // rva of preprocessed imports
|
cimports = newvsize - rvamin; // rva of preprocessed imports
|
||||||
const unsigned crelocs = cimports + soimport; // rva of preprocessed fixups
|
crelocs = cimports + soimport; // rva of preprocessed fixups
|
||||||
|
|
||||||
ph.u_len = newvsize + soimport + sorelocs;
|
ph.u_len = newvsize + soimport + sorelocs;
|
||||||
|
|
||||||
@ -1566,7 +1623,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
if (sorelocs)
|
if (sorelocs)
|
||||||
{
|
{
|
||||||
set_le32(p1 + s,crelocs);
|
set_le32(p1 + s,crelocs);
|
||||||
p1[s + 4] = (unsigned char) (big & 6);
|
p1[s + 4] = (unsigned char) (big_relocs & 6);
|
||||||
s += 5;
|
s += 5;
|
||||||
}
|
}
|
||||||
if (soresources)
|
if (soresources)
|
||||||
@ -1596,6 +1653,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
|
|
||||||
// verify filter
|
// verify filter
|
||||||
ft.verifyUnfilter();
|
ft.verifyUnfilter();
|
||||||
|
buildLoader(&ft);
|
||||||
#else
|
#else
|
||||||
// new version using compressWithFilters()
|
// new version using compressWithFilters()
|
||||||
|
|
||||||
@ -1627,56 +1685,6 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
if (tlsindex && ((newvsize - ph.c_len - 1024 + oam1) &~ oam1) > tlsindex + 4)
|
if (tlsindex && ((newvsize - ph.c_len - 1024 + oam1) &~ oam1) > tlsindex + 4)
|
||||||
tlsindex = 0;
|
tlsindex = 0;
|
||||||
|
|
||||||
// prepare loader
|
|
||||||
initLoader(nrv_loader,sizeof(nrv_loader));
|
|
||||||
addLoader(isdll ? "PEISDLL1" : "",
|
|
||||||
"PEMAIN01",
|
|
||||||
icondir_count > 1 ? (icondir_count == 2 ? "PEICONS1" : "PEICONS2") : "",
|
|
||||||
tlsindex ? "PETLSHAK" : "",
|
|
||||||
"PEMAIN02",
|
|
||||||
getDecompressor(),
|
|
||||||
/*multipass ? "PEMULTIP" : */ "",
|
|
||||||
"PEMAIN10",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
const unsigned texv = ih.codebase - rvamin;
|
|
||||||
if (ft.id)
|
|
||||||
{
|
|
||||||
assert(ft.calls > 0);
|
|
||||||
addLoader(texv ? "PECTTPOS" : "PECTTNUL",NULL);
|
|
||||||
addFilter32(ft.id);
|
|
||||||
}
|
|
||||||
if (soimport)
|
|
||||||
addLoader("PEIMPORT",
|
|
||||||
importbyordinal ? "PEIBYORD" : "",
|
|
||||||
kernel32ordinal ? "PEK32ORD" : "",
|
|
||||||
importbyordinal ? "PEIMORD1" : "",
|
|
||||||
"PEIMPOR2",
|
|
||||||
isdll ? "PEIERDLL" : "PEIEREXE",
|
|
||||||
"PEIMDONE",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
if (sorelocs)
|
|
||||||
{
|
|
||||||
addLoader(soimport == 0 || soimport + cimports != crelocs ? "PERELOC1" : "PERELOC2",
|
|
||||||
"PERELOC3""RELOC320",
|
|
||||||
big ? "REL32BIG" : "",
|
|
||||||
"RELOC32J",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
//FIXME: the following should be moved out of the above if
|
|
||||||
addLoader(big&6 ? "PERLOHI0" : "",
|
|
||||||
big&4 ? "PERELLO0" : "",
|
|
||||||
big&2 ? "PERELHI0" : "",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
addLoader("PEMAIN20",
|
|
||||||
ih.entry ? "PEDOJUMP" : "PERETURN",
|
|
||||||
"IDENTSTR""UPX1HEAD",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
MemBuffer loader(lsize);
|
MemBuffer loader(lsize);
|
||||||
memcpy(loader,getLoader(),lsize);
|
memcpy(loader,getLoader(),lsize);
|
||||||
@ -1720,7 +1728,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
jmp_pos = ptr_diff(find_le32(loader,codesize + 4,get_le32("JMPO")),loader);
|
jmp_pos = ptr_diff(find_le32(loader,codesize + 4,get_le32("JMPO")),loader);
|
||||||
patch_le32(loader,codesize + 4,"JMPO",ih.entry - upxsection - jmp_pos - 4);
|
patch_le32(loader,codesize + 4,"JMPO",ih.entry - upxsection - jmp_pos - 4);
|
||||||
}
|
}
|
||||||
if (big & 6)
|
if (big_relocs & 6)
|
||||||
patch_le32(loader,codesize,"DELT", 0u -ih.imagebase - rvamin);
|
patch_le32(loader,codesize,"DELT", 0u -ih.imagebase - rvamin);
|
||||||
if (sorelocs && (soimport == 0 || soimport + cimports != crelocs))
|
if (sorelocs && (soimport == 0 || soimport + cimports != crelocs))
|
||||||
patch_le32(loader,codesize,"BREL",crelocs);
|
patch_le32(loader,codesize,"BREL",crelocs);
|
||||||
@ -1742,6 +1750,7 @@ void PackW32Pe::pack(OutputFile *fo)
|
|||||||
patch_le16(loader,codesize,"??",'?' + (ft.cto << 8));
|
patch_le16(loader,codesize,"??",'?' + (ft.cto << 8));
|
||||||
patch_le32(loader,lsize,"TEXL",(ft.id & 0xf) % 3 == 0 ? ft.calls :
|
patch_le32(loader,lsize,"TEXL",(ft.id & 0xf) % 3 == 0 ? ft.calls :
|
||||||
ft.lastcall - ft.calls * 4);
|
ft.lastcall - ft.calls * 4);
|
||||||
|
const unsigned texv = ih.codebase - rvamin;
|
||||||
if (texv)
|
if (texv)
|
||||||
patch_le32(loader,codesize,"TEXV",texv);
|
patch_le32(loader,codesize,"TEXV",texv);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,6 +65,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool testUnpackVersion(int version) const;
|
virtual bool testUnpackVersion(int version) const;
|
||||||
|
virtual int buildLoader(const Filter *ft);
|
||||||
|
|
||||||
unsigned pe_offset;
|
unsigned pe_offset;
|
||||||
bool isrtm;
|
bool isrtm;
|
||||||
@ -78,7 +79,7 @@ protected:
|
|||||||
upx_byte *oimpdlls;
|
upx_byte *oimpdlls;
|
||||||
unsigned soimpdlls;
|
unsigned soimpdlls;
|
||||||
|
|
||||||
int processRelocs();
|
void processRelocs();
|
||||||
void processRelocs(PackW32Pe_Reloc *);
|
void processRelocs(PackW32Pe_Reloc *);
|
||||||
void rebuildRelocs(upx_byte *&);
|
void rebuildRelocs(upx_byte *&);
|
||||||
upx_byte *orelocs;
|
upx_byte *orelocs;
|
||||||
@ -113,18 +114,21 @@ protected:
|
|||||||
bool kernel32ordinal;
|
bool kernel32ordinal;
|
||||||
unsigned tlsindex;
|
unsigned tlsindex;
|
||||||
unsigned rvamin;
|
unsigned rvamin;
|
||||||
|
unsigned cimports; // rva of preprocessed imports
|
||||||
|
unsigned crelocs; // rva of preprocessed fixups
|
||||||
|
int big_relocs;
|
||||||
|
|
||||||
struct pe_header_t
|
struct pe_header_t
|
||||||
{
|
{
|
||||||
// 0x0
|
// 0x0
|
||||||
char _[4]; // pemagic
|
char _[4]; // pemagic
|
||||||
LE16 cpu;
|
LE16 cpu;
|
||||||
LE16 objects;
|
LE16 objects;
|
||||||
char __[12]; // timestamp + reserved
|
char __[12]; // timestamp + reserved
|
||||||
LE16 opthdrsize;
|
LE16 opthdrsize;
|
||||||
LE16 flags;
|
LE16 flags;
|
||||||
// optional header
|
// optional header
|
||||||
char ___[4]; // coffmagic + linkerversion
|
char ___[4]; // coffmagic + linkerversion
|
||||||
LE32 codesize;
|
LE32 codesize;
|
||||||
// 0x20
|
// 0x20
|
||||||
LE32 datasize;
|
LE32 datasize;
|
||||||
@ -136,19 +140,19 @@ protected:
|
|||||||
// nt specific fields
|
// nt specific fields
|
||||||
LE32 imagebase;
|
LE32 imagebase;
|
||||||
LE32 objectalign;
|
LE32 objectalign;
|
||||||
LE32 filealign; // should set to 0x200 ?
|
LE32 filealign; // should set to 0x200 ?
|
||||||
// 0x40
|
// 0x40
|
||||||
char ____[16]; // versions
|
char ____[16]; // versions
|
||||||
// 0x50
|
// 0x50
|
||||||
LE32 imagesize;
|
LE32 imagesize;
|
||||||
LE32 headersize;
|
LE32 headersize;
|
||||||
LE32 chksum; // should set to 0
|
LE32 chksum; // should set to 0
|
||||||
LE16 subsystem;
|
LE16 subsystem;
|
||||||
LE16 dllflags;
|
LE16 dllflags;
|
||||||
// 0x60
|
// 0x60
|
||||||
char _____[20]; // stack + heap sizes
|
char _____[20]; // stack + heap sizes
|
||||||
// 0x74
|
// 0x74
|
||||||
LE32 ddirsentries; // usually 16
|
LE32 ddirsentries; // usually 16
|
||||||
|
|
||||||
struct ddirs_t
|
struct ddirs_t
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user