void PackLinuxElf32x86interp::pack3(OutputFile *fo, Filter &/*ft*/) { unsigned base = getbase(phdri, ehdri.e_phnum); unsigned sz = PAGE_MASK & (~PAGE_MASK + elfout.phdr[0].p_filesz); if (base < (0x11000 + sz)) { base = 0x11000 + sz; } if (opt->o_unix.make_ptinterp) { base = 0x10000; } elfout.phdr[0].p_paddr = elfout.phdr[0].p_vaddr = base - sz; if (opt->o_unix.make_ptinterp) { initLoader(stub_i386_linux_elf_interp_entry, sizeof(stub_i386_linux_elf_interp_entry)); linker->addSection("FOLDEXEC", stub_i386_linux_elf_interp_fold, sizeof(stub_i386_linux_elf_interp_fold), 0); addLoader("LXPTI000", NULL); addLoader("LXPTI040", NULL); ph.method = M_NRV2B_LE32; addLoader(getDecompressorSections(), NULL); addLoader("LXPTI090", NULL); addLoader("LXPTI041", NULL); ph.method = M_NRV2D_LE32; addLoader(getDecompressorSections(), NULL); addLoader("LXPTI090", NULL); addLoader("LXPTI042", NULL); ph.method = M_NRV2E_LE32; addLoader(getDecompressorSections(), NULL); addLoader("LXPTI090", NULL); //addLoader("LXPTI043", NULL); //ph.method = M_CL1B_LE32; addLoader(getDecompressorSections(), NULL); //addLoader("LXPTI090", NULL); addLoader("LXPTI091", NULL); addLoader("LXPTI140", NULL); addLoader("LXUNF002,LXUNF008,LXUNF010", NULL); addFilter32(0x46); addLoader("LXUNF042,LXUNF035", NULL); addLoader("LXUNF002,LXUNF008,LXUNF010", NULL); addFilter32(0x49); addLoader("LXUNF042,LXUNF035", NULL); addLoader("LXPTI200", NULL); addLoader("FOLDEXEC", NULL); upx_byte const *p = getLoader(); lsize = getLoaderSize(); updateLoader(fo); fo->write(p, lsize); elfout.phdr[0].p_filesz = fo->getBytesWritten(); } else { updateLoader(fo); } }
void PackTmt::buildLoader(const Filter *ft) { // prepare loader initLoader(stub_i386_dos32_tmt, sizeof(stub_i386_dos32_tmt)); addLoader("IDENTSTR,TMTMAIN1", ph.first_offset_found == 1 ? "TMTMAIN1A" : "", "TMTMAIN1B", ft->id ? "TMTCALT1" : "", "TMTMAIN2,UPX1HEAD,TMTCUTPO", NULL); // fake alignment for the start of the decompressor linker->defineSymbol("TMTCUTPO", 0x1000); addLoader(getDecompressorSections(), "TMTMAIN5", NULL); if (ft->id) { assert(ft->calls > 0); addLoader("TMTCALT2",NULL); addFilter32(ft->id); } addLoader("TMTRELOC,RELOC320", big_relocs ? "REL32BIG" : "", "RELOC32J,TMTJUMP1", NULL ); }
void PackWcle::buildLoader(const Filter *ft) { // prepare loader initLoader(stub_i386_dos32_watcom_le, sizeof(stub_i386_dos32_watcom_le)); addLoader("IDENTSTR,WCLEMAIN", ph.first_offset_found == 1 ? "WCLEMAIN02" : "", "WCLEMAIN03,UPX1HEAD,WCLECUTP", NULL); // fake alignment for the start of the decompressor linker->defineSymbol("WCLECUTP", 0x1000); addLoader(getDecompressorSections(), "WCLEMAI2", NULL); if (ft->id) { assert(ft->calls > 0); addLoader(ft->addvalue ? "WCCTTPOS" : "WCCTTNUL", NULL); addFilter32(ft->id); } #if 1 // FIXME: if (has_relocation) { addLoader("WCRELOC1,RELOC320", big_relocs ? "REL32BIG" : "", "RELOC32J", NULL ); } #endif addLoader(has_extra_code ? "WCRELSEL" : "", "WCLEMAI4", NULL ); }
void PackVmlinuzI386::buildLoader(const Filter *ft) { // prepare loader initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz)); addLoader("LINUZ000", ph.first_offset_found == 1 ? "LINUZ010" : "", ft->id ? "LZCALLT1" : "", "LZIMAGE0", getDecompressorSections(), NULL ); if (ft->id) { assert(ft->calls > 0); addLoader("LZCALLT9", NULL); addFilter32(ft->id); } addLoader("LINUZ990,IDENTSTR,UPX1HEAD", NULL); }
void PackBvmlinuzI386::buildLoader(const Filter *ft) { // prepare loader initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz)); if (0!=page_offset) { // relocatable kernel assert(0==ft->id || 0x40==(0xf0 & ft->id)); // others assume fixed buffer address addLoader("LINUZ000,LINUZ001,LINUZVGA,LINUZ101,LINUZ110", ((0!=config_physical_align) ? "LINUZ120" : "LINUZ130"), "LINUZ140,LZCUTPOI,LINUZ141", (ft->id ? "LINUZ145" : ""), (ph.first_offset_found == 1 ? "LINUZ010" : ""), NULL); } else { addLoader("LINUZ000,LINUZ001,LINUZVGA,LINUZ005", ph.first_offset_found == 1 ? "LINUZ010" : "", (0x40==(0xf0 & ft->id)) ? "LZCKLLT1" : (ft->id ? "LZCALLT1" : ""), "LBZIMAGE,IDENTSTR", "+40", // align the stuff to 4 byte boundary "UPX1HEAD", // 32 byte "LZCUTPOI", NULL); // fake alignment for the start of the decompressor //linker->defineSymbol("LZCUTPOI", 0x1000); } addLoader(getDecompressorSections(), NULL); if (ft->id) { assert(ft->calls > 0); if (0x40==(0xf0 & ft->id)) { addLoader("LZCKLLT9", NULL); } else { addLoader("LZCALLT9", NULL); } addFilter32(ft->id); } if (0!=page_offset) { addLoader("LINUZ150,IDENTSTR,+40,UPX1HEAD", NULL); unsigned const l_len = getLoaderSize(); unsigned const c_len = ALIGN_UP(ph.c_len, 4u); unsigned const e_len = getLoaderSectionStart("LINUZ141") - getLoaderSectionStart("LINUZ110"); linker->defineSymbol("compressed_length", c_len); linker->defineSymbol("load_physical_address", physical_start); // FIXME if (0!=config_physical_align) { linker->defineSymbol("neg_config_physical_align", 0u - config_physical_align); } linker->defineSymbol("neg_length_mov", 0u - ALIGN_UP(c_len + l_len, 4u)); linker->defineSymbol("neg_page_offset", 0u - page_offset); //linker->defineSymbol("physical_start", physical_start); linker->defineSymbol("unc_length", ph.u_len); linker->defineSymbol("dec_offset", ph.overlap_overhead + e_len); linker->defineSymbol("unc_offset", ph.overlap_overhead + ph.u_len - c_len); } else { addLoader("LINUZ990", NULL); } }