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 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 sqlDeleterAddAcc(struct sqlDeleter* sd, char* acc) /* Add an accession to list to to delete. */ { if (sd->deletesDone) errAbort("sqlDeleter: can't add accessions after a delete has been done"); #ifdef COPY_TO_DELETE_HACK /* always use direct if no tmp dir */ if ((sd->accCount < sd->directMax) || (sd->tmpDir[0] == '\0')) { struct slName* accRec = lmAlloc(sd->lm, sizeof(struct slName)+strlen(acc)); strcpy(accRec->name, acc); slAddHead(&sd->accs, accRec); } else { if (sd->accLoader == NULL) initLoader(sd); sqlUpdaterAddRow(sd->accLoader, "%s", acc); } #else { struct slName* accRec = lmAlloc(sd->lm, sizeof(struct slName)+strlen(acc)); strcpy(accRec->name, acc); slAddHead(&sd->accs, accRec); } #endif sd->accCount++; }
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); } }
bool Surface::init(HWND /*io_hWnd*/) { if (initLoader() == false) return false; return true; }
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 PackArmPe::buildLoader(const Filter *ft) { const unsigned char *loader = use_thumb_stub ? stub_arm_v4t_wince_pe : stub_arm_v4a_wince_pe; unsigned size = use_thumb_stub ? sizeof(stub_arm_v4t_wince_pe) : sizeof(stub_arm_v4a_wince_pe); // prepare loader initLoader(loader, size); if (isdll) addLoader("DllStart", NULL); addLoader("ExeStart", NULL); if (ph.method == M_NRV2E_8) addLoader("Call2E", NULL); else if (ph.method == M_NRV2B_8) addLoader("Call2B", NULL); else if (ph.method == M_NRV2D_8) addLoader("Call2D", NULL); else if (M_IS_LZMA(ph.method)) addLoader("+40C,CallLZMA", NULL); if (ft->id == 0x50) addLoader("+40C,Unfilter_0x50", NULL); if (sorelocs) addLoader("+40C,Relocs", NULL); addLoader("+40C,Imports", NULL); addLoader("ProcessEnd", NULL); if (ph.method == M_NRV2E_8) addLoader(".ucl_nrv2e_decompress_8", NULL); else if (ph.method == M_NRV2B_8) addLoader(".ucl_nrv2b_decompress_8", NULL); else if (ph.method == M_NRV2D_8) addLoader(".ucl_nrv2d_decompress_8", NULL); else if (M_IS_LZMA(ph.method)) addLoader("+40C,LZMA_DECODE,LZMA_DEC10", NULL); addLoader("IDENTSTR,UPX1HEAD", NULL); }
void PackCom::buildLoader(const Filter *ft) { initLoader(stub_i086_dos16_com, sizeof(stub_i086_dos16_com)); addLoader("COMMAIN1", ph.first_offset_found == 1 ? "COMSBBBP" : "", "COMPSHDI", ft->id ? "COMCALLT" : "", "COMMAIN2,UPX1HEAD,COMCUTPO,NRV2B160", ft->id ? "NRVDDONE" : "NRVDRETU", "NRVDECO1", ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00", "NRVDECO2", NULL ); if (ft->id) { assert(ft->calls > 0); addFilter16(ft->id); } }
void initComponentCommon() { static bool first = true; if (first) { first = false; } initLoader(); initEngine(); /* initRigid(); initDeformable(); initSimpleFEM(); initObjectInteraction(); initMeshCollision(); initExplicitODESolver(); initImplicitODESolver(); initEigen2Solver(); */ }
void PackSys::buildLoader(const Filter *ft) { initLoader(stub_i086_dos16_sys, sizeof(stub_i086_dos16_sys)); addLoader("SYSMAIN1", opt->cpu == opt->CPU_8086 ? "SYSI0861" : "SYSI2861", "SYSMAIN2", ph.first_offset_found == 1 ? "SYSSBBBP" : "", ft->id ? "SYSCALLT" : "", "SYSMAIN3,UPX1HEAD,SYSCUTPO,NRV2B160,NRVDDONE,NRVDECO1", ph.max_offset_found <= 0xd00 ? "NRVLED00" : "NRVGTD00", "NRVDECO2", NULL ); if (ft->id) { assert(ft->calls > 0); addFilter16(ft->id); } addLoader("SYSMAIN5", opt->cpu == opt->CPU_8086 ? "SYSI0862" : "SYSI2862", "SYSJUMP1", NULL ); }
void PackTos::buildLoader(const Filter *ft) { assert(ft->id == 0); initLoader(stub_m68k_atari_tos, sizeof(stub_m68k_atari_tos)); //linker->dumpSymbols(); // // part 1a // addLoader("entry"); if (symbols.up21_a6 <= 32767) addLoader("set_up21_a6.w"); else if (symbols.up21_d4 <= 32767) addLoader("set_up21_d4.w"); else addLoader("set_up21_d4.l"); assert(symbols.loop1.count || symbols.loop2.count); if (symbols.loop1.count) { if (symbols.loop1.value <= 127) addLoader("loop1_set_count.b"); else if (symbols.loop1.value <= 65535) addLoader("loop1_set_count.w"); else addLoader("loop1_set_count.l"); addLoader("loop1_label"); addLoader(opt->small ? "loop1.small" : "loop1.fast"); if (symbols.loop1.mode == symbols.LOOP_SUBQ_L) addLoader("loop1_subql"); else if (symbols.loop1.mode == symbols.LOOP_SUBQ_W) addLoader("loop1_subqw"); else if (symbols.loop1.mode == symbols.LOOP_DBRA) addLoader("loop1_dbra"); else throwBadLoader(); } if (symbols.loop2.count) { assert(symbols.loop2.mode == symbols.LOOP_DBRA); addLoader(opt->small ? "loop2.small" : "loop2.fast"); } addLoader("copy_to_stack"); if (M_IS_NRV2B(ph.method)) addLoader("nrv2b.init"); else if (M_IS_NRV2D(ph.method)) addLoader("nrv2d.init"); else if (M_IS_NRV2E(ph.method)) addLoader("nrv2e.init"); else if (M_IS_LZMA(ph.method)) addLoader("lzma.init"); else throwBadLoader(); symbols.up31_d4 = symbols.up31_base_d4 + getDecomprOffset(ph.method, opt->small); symbols.up31_a6 = symbols.up31_base_a6 + getDecomprOffset(ph.method, opt->small); if (symbols.up31_a6 <= 32767) addLoader("jmp_decompressor_a6.w"); else if (symbols.up31_d4 <= 32767) addLoader("jmp_decompressor_d4.w"); else if (symbols.up31_a6 <= 65534) addLoader("jmp_decompressor_a6.w2"); else addLoader("jmp_decompressor_d4.l"); // // part 1b // addLoader("code_on_stack"); addLoader("clear_dirty_bss"); addLoader("loop3_label"); addLoader(opt->small ? "loop3.small" : "loop3.fast"); if (symbols.loop3.mode == symbols.LOOP_SUBQ_L) addLoader("loop3_subql"); else if (symbols.loop3.mode == symbols.LOOP_SUBQ_W) addLoader("loop3_subqw"); else if (symbols.loop3.mode == symbols.LOOP_DBRA) addLoader("loop3_dbra"); else throwBadLoader(); addLoader("flush_cache"); addLoader("restore_stack"); #if 0 addLoader("clear_dirty_stack"); #endif addLoader("start_program"); addLoader("IDENTSTR,+40D,UPX1HEAD,CUTPOINT"); // // part 2 // if (M_IS_NRV2B(ph.method)) { addLoader(opt->small ? "nrv2b_8.small" : "nrv2b_8.fast"); } else if (M_IS_NRV2D(ph.method)) { addLoader(opt->small ? "nrv2d_8.small" : "nrv2d_8.fast"); } else if (M_IS_NRV2E(ph.method)) { addLoader(opt->small ? "nrv2e_8.small" : "nrv2e_8.fast"); } else if (M_IS_LZMA(ph.method)) { addLoader("__mulsi3"); addLoader(opt->small ? "lzma.small" : "lzma.fast"); addLoader("lzma.finish"); } else throwBadLoader(); if (symbols.need_reloc) addLoader("reloc"); assert(symbols.loop3.count); if (symbols.loop3.value <= 127) addLoader("loop3_set_count.b"); else if (symbols.loop3.value <= 65535) addLoader("loop3_set_count.w"); else addLoader("loop3_set_count.l"); addLoader("jmp_stack"); }
void PackExe::buildLoader(const Filter *) { // get flag exe_header_t dummy_oh; int flag = fillExeHeader(&dummy_oh); initLoader(stub_i086_dos16_exe, sizeof(stub_i086_dos16_exe)); if (M_IS_LZMA(ph.method)) { addLoader("LZMA_DEC00", opt->small ? "LZMA_DEC10" : "LZMA_DEC20", "LZMA_DEC30", use_clear_dirty_stack ? "LZMA_DEC31" : "", "LZMA_DEC32", ph.u_len > 0xffff ? "LZMA_DEC33" : "", NULL ); addLoaderEpilogue(flag); defineDecompressorSymbols(); const unsigned lsize0 = getLoaderSize(); // Lzma decompression code starts at ss:0x10, and its size is // lsize bytes. It also needs getDecompressorWrkmemSize() bytes // during uncompression. It also uses some stack, so 0x100 // more bytes are allocated stack_for_lzma = 0x10 + lsize0 + getDecompressorWrkmemSize() + 0x100; stack_for_lzma = ALIGN_UP(stack_for_lzma, 16u); unsigned clear_dirty_stack_low = 0x10 + lsize0; clear_dirty_stack_low = ALIGN_UP(clear_dirty_stack_low, 2u); if (use_clear_dirty_stack) linker->defineSymbol("clear_dirty_stack_low", clear_dirty_stack_low); relocateLoader(); const unsigned lsize = getLoaderSize(); assert(lsize0 == lsize); MemBuffer loader(lsize); memcpy(loader, getLoader(), lsize); MemBuffer compressed_lzma; compressed_lzma.allocForCompression(lsize); unsigned c_len_lzma = MemBuffer::getSizeForCompression(lsize); int r = upx_compress(loader, lsize, compressed_lzma, &c_len_lzma, NULL, M_NRV2B_LE16, 9, NULL, NULL); assert(r == UPX_E_OK); assert(c_len_lzma < lsize); info("lzma+relocator code compressed: %u -> %u", lsize, c_len_lzma); // reinit the loader initLoader(stub_i086_dos16_exe, sizeof(stub_i086_dos16_exe)); // prepare loader if (device_driver) addLoader("DEVICEENTRY,LZMADEVICE,DEVICEENTRY2", NULL); linker->addSection("COMPRESSED_LZMA", compressed_lzma, c_len_lzma, 0); addLoader("LZMAENTRY,NRV2B160,NRVDDONE,NRVDECO1,NRVGTD00,NRVDECO2", NULL); } else if (device_driver) addLoader("DEVICEENTRY,DEVICEENTRY2", NULL); addLoader("EXEENTRY", M_IS_LZMA(ph.method) && device_driver ? "LONGSUB" : "SHORTSUB", "JNCDOCOPY", relocsize ? "EXERELPU" : "", "EXEMAIN4", M_IS_LZMA(ph.method) ? "" : "EXEMAIN4B", "EXEMAIN4C", M_IS_LZMA(ph.method) ? "COMPRESSED_LZMA_START,COMPRESSED_LZMA" : "", "+G5DXXXX,UPX1HEAD,EXECUTPO", NULL ); if (ph.method == M_NRV2B_8) addLoader("NRV2B16S", // decompressor ph.u_len > DI_LIMIT ? "N2B64K01" : "", "NRV2BEX1", opt->cpu == opt->CPU_8086 ? "N2BX8601" : "N2B28601", "NRV2BEX2", opt->cpu == opt->CPU_8086 ? "N2BX8602" : "N2B28602", "NRV2BEX3", ph.c_len > 0xffff ? "N2B64K02" : "", "NRV2BEX9", NULL ); else if (ph.method == M_NRV2D_8) addLoader("NRV2D16S", ph.u_len > DI_LIMIT ? "N2D64K01" : "", "NRV2DEX1", opt->cpu == opt->CPU_8086 ? "N2DX8601" : "N2D28601", "NRV2DEX2", opt->cpu == opt->CPU_8086 ? "N2DX8602" : "N2D28602", "NRV2DEX3", ph.c_len > 0xffff ? "N2D64K02" : "", "NRV2DEX9", NULL ); else if (ph.method == M_NRV2E_8) addLoader("NRV2E16S", ph.u_len > DI_LIMIT ? "N2E64K01" : "", "NRV2EEX1", opt->cpu == opt->CPU_8086 ? "N2EX8601" : "N2E28601", "NRV2EEX2", opt->cpu == opt->CPU_8086 ? "N2EX8602" : "N2E28602", "NRV2EEX3", ph.c_len > 0xffff ? "N2E64K02" : "", "NRV2EEX9", NULL ); else if M_IS_LZMA(ph.method) return; else
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); } }