From 1d9c211eedd75087fa3a110b2daf972031e29be4 Mon Sep 17 00:00:00 2001 From: Kornel Pal Date: Wed, 22 Dec 2021 03:00:17 +0100 Subject: [PATCH] PE: Make imports in decompressor stub optional --- src/p_w32pe.cpp | 25 ++++++++++++++----------- src/p_w64pep.cpp | 25 ++++++++++++++----------- src/pefile.cpp | 5 ++++- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 6a346935..8003ac5f 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -168,7 +168,7 @@ void PackW32Pe::buildLoader(const Filter *ft) addLoader("CLEARSTACK", nullptr); addLoader("PEMAIN21", nullptr); //NEW: last loader sections split up to insert TLS callback handler - Stefan Widmann - addLoader(ih.entry ? "PEDOJUMP" : "PERETURN", nullptr); + addLoader(ih.entry || !ilinker ? "PEDOJUMP" : "PERETURN", nullptr); //NEW: TLS callback support PART 2, the callback handler - Stefan Widmann if(use_tls_callbacks) @@ -232,16 +232,19 @@ void PackW32Pe::defineSymbols(unsigned ncsection, unsigned upxsection, } linker->defineSymbol("reloc_delt", 0u - (unsigned) ih.imagebase - rvamin); linker->defineSymbol("start_of_relocs", crelocs); - if (!isdll) - linker->defineSymbol("ExitProcess", 0u-rvamin + - ilinkerGetAddress("kernel32.dll", "ExitProcess")); - linker->defineSymbol("GetProcAddress", 0u-rvamin + - ilinkerGetAddress("kernel32.dll", "GetProcAddress")); - linker->defineSymbol("kernel32_ordinals", myimport); - linker->defineSymbol("LoadLibraryA", 0u-rvamin + - ilinkerGetAddress("kernel32.dll", "LoadLibraryA")); - linker->defineSymbol("start_of_imports", myimport); - linker->defineSymbol("compressed_imports", cimports); + + if (ilinker) { + if (!isdll) + linker->defineSymbol("ExitProcess", 0u-rvamin + + ilinkerGetAddress("kernel32.dll", "ExitProcess")); + linker->defineSymbol("GetProcAddress", 0u-rvamin + + ilinkerGetAddress("kernel32.dll", "GetProcAddress")); + linker->defineSymbol("kernel32_ordinals", myimport); + linker->defineSymbol("LoadLibraryA", 0u-rvamin + + ilinkerGetAddress("kernel32.dll", "LoadLibraryA")); + linker->defineSymbol("start_of_imports", myimport); + linker->defineSymbol("compressed_imports", cimports); + } defineDecompressorSymbols(); linker->defineSymbol("filter_buffer_start", ih.codebase - rvamin); diff --git a/src/p_w64pep.cpp b/src/p_w64pep.cpp index bb509a9e..8a36d5e8 100644 --- a/src/p_w64pep.cpp +++ b/src/p_w64pep.cpp @@ -167,7 +167,7 @@ void PackW64Pep::buildLoader(const Filter *ft) if (ih.entry && isdll) addLoader("PEISDLL9"); - addLoader(ih.entry ? "PEDOJUMP" : "PERETURN", nullptr); + addLoader(ih.entry || !ilinker ? "PEDOJUMP" : "PERETURN", nullptr); //NEW: TLS callback support PART 2, the callback handler - Stefan Widmann if(use_tls_callbacks) @@ -227,16 +227,19 @@ void PackW64Pep::defineSymbols(unsigned ncsection, unsigned upxsection, ilinkerGetAddress("kernel32.dll", "VirtualProtect")); } linker->defineSymbol("start_of_relocs", crelocs); - if (!isdll) - linker->defineSymbol("ExitProcess", - ilinkerGetAddress("kernel32.dll", "ExitProcess")); - linker->defineSymbol("GetProcAddress", - ilinkerGetAddress("kernel32.dll", "GetProcAddress")); - linker->defineSymbol("kernel32_ordinals", myimport); - linker->defineSymbol("LoadLibraryA", - ilinkerGetAddress("kernel32.dll", "LoadLibraryA")); - linker->defineSymbol("start_of_imports", myimport); - linker->defineSymbol("compressed_imports", cimports); + + if (ilinker) { + if (!isdll) + linker->defineSymbol("ExitProcess", + ilinkerGetAddress("kernel32.dll", "ExitProcess")); + linker->defineSymbol("GetProcAddress", + ilinkerGetAddress("kernel32.dll", "GetProcAddress")); + linker->defineSymbol("kernel32_ordinals", myimport); + linker->defineSymbol("LoadLibraryA", + ilinkerGetAddress("kernel32.dll", "LoadLibraryA")); + linker->defineSymbol("start_of_imports", myimport); + linker->defineSymbol("compressed_imports", cimports); + } if (M_IS_LZMA(ph.method)) { diff --git a/src/pefile.cpp b/src/pefile.cpp index 86ebdd62..9a27d425 100644 --- a/src/pefile.cpp +++ b/src/pefile.cpp @@ -867,6 +867,9 @@ void PeFile::processImports2(unsigned myimport, unsigned) // pass 2 { COMPILE_TIME_ASSERT(sizeof(import_desc) == 20); + if (!ilinker) + return; + ilinker->relocate_import(myimport); int len; oimpdlls = ilinker->getLoader(&len); @@ -2540,7 +2543,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh, callProcessRelocs(rel, ic); processImports2(ic, getProcessImportParam(upxsection)); - ODADDR(PEDIR_IMPORT) = ic; + ODADDR(PEDIR_IMPORT) = soimpdlls ? ic : 0; ODSIZE(PEDIR_IMPORT) = soimpdlls; ic += soimpdlls;