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 PackUnix::pack3(OutputFile *fo, Filter &/*ft*/) { upx_byte *p = getLoader(); lsize = getLoaderSize(); updateLoader(fo); patchLoaderChecksum(); fo->write(p, lsize); }