From ca2369f1c1765c83af4f4b0d34fa21092a6a5aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Moln=C3=A1r?= Date: Wed, 5 Mar 2014 23:40:24 +0100 Subject: [PATCH] pe: win32/win64 pack/unpack seems to work again --- src/p_w32pe.cpp | 17 +++++++---------- src/p_w64pep.cpp | 6 +----- src/p_w64pep.h | 4 ---- src/pefile.cpp | 5 +++++ 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 3f992e69..beff26a3 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -107,11 +107,7 @@ static void xcheck(size_t poff, size_t plen, const void *b, size_t blen) **************************************************************************/ PackW32Pe::PackW32Pe(InputFile *f) : super(f) -{ - isrtm = false; - use_dep_hack = true; - use_clear_dirty_stack = true; -} +{} PackW32Pe::~PackW32Pe() @@ -297,17 +293,18 @@ void PackW32Pe::defineSymbols(unsigned ncsection, unsigned upxsection, linker->defineSymbol("vp_size", ((addr & 0xfff) + 0x28 >= 0x1000) ? 0x2000 : 0x1000); // 2 pages or 1 page linker->defineSymbol("vp_base", addr &~ 0xfff); // page mask - linker->defineSymbol("VirtualProtect", myimport + + linker->defineSymbol("VirtualProtect", -rvamin + ilinkerGetAddress("kernel32.dll", "VirtualProtect")); } linker->defineSymbol("reloc_delt", 0u - (unsigned) ih.imagebase - rvamin); linker->defineSymbol("start_of_relocs", crelocs); - linker->defineSymbol("ExitProcess", myimport + - ilinkerGetAddress("kernel32.dll", "ExitProcess")); - linker->defineSymbol("GetProcAddress", myimport + + if (!isdll) + linker->defineSymbol("ExitProcess", -rvamin + + ilinkerGetAddress("kernel32.dll", "ExitProcess")); + linker->defineSymbol("GetProcAddress", -rvamin + ilinkerGetAddress("kernel32.dll", "GetProcAddress")); linker->defineSymbol("kernel32_ordinals", myimport); - linker->defineSymbol("LoadLibraryA", myimport + + linker->defineSymbol("LoadLibraryA", -rvamin + ilinkerGetAddress("kernel32.dll", "LoadLibraryA")); linker->defineSymbol("start_of_imports", myimport); linker->defineSymbol("compressed_imports", cimports); diff --git a/src/p_w64pep.cpp b/src/p_w64pep.cpp index f27c0d5c..f33cda2c 100644 --- a/src/p_w64pep.cpp +++ b/src/p_w64pep.cpp @@ -112,11 +112,7 @@ static void xcheck(size_t poff, size_t plen, const void *b, size_t blen) **************************************************************************/ PackW64Pep::PackW64Pep(InputFile *f) : super(f) -{ - isrtm = false; - use_dep_hack = true; - use_clear_dirty_stack = true; -} +{} PackW64Pep::~PackW64Pep() diff --git a/src/p_w64pep.h b/src/p_w64pep.h index 979fc658..f3bcc461 100644 --- a/src/p_w64pep.h +++ b/src/p_w64pep.h @@ -59,10 +59,6 @@ public: protected: virtual void buildLoader(const Filter *ft); virtual Linker* newLinker() const; - - bool isrtm; - bool use_dep_hack; - bool use_clear_dirty_stack; }; diff --git a/src/pefile.cpp b/src/pefile.cpp index 32e8a5be..0864f4c9 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -139,6 +139,10 @@ PeFile::PeFile(InputFile *f) : super(f) use_tls_callbacks = false; oloadconf = NULL; soloadconf = 0; + + use_dep_hack = true; + use_clear_dirty_stack = true; + isrtm = false; } @@ -763,6 +767,7 @@ public: for (unsigned ic = 0; ic < nsections; ic++) osize += sections[ic]->size; output = new upx_byte[osize]; + outputlen = 0; // sort the sections by name before adding them all qsort(sections, nsections, sizeof (Section*), ImportLinker::compare);