diff --git a/src/p_exe.cpp b/src/p_exe.cpp index 0fbd436d..316e5625 100644 --- a/src/p_exe.cpp +++ b/src/p_exe.cpp @@ -85,14 +85,14 @@ int PackExe::fillExeHeader(struct exe_header_t *eh) const oh.headsize16 = 2; oh.ip = 0; - unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16; + oh.sp = ih.sp > 0x200 ? ih.sp : 0x200; + unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16; oh.ss = ph.c_len/16 + destpara; if (ih.ss*16 + ih.sp < 0x100000 && ih.ss > oh.ss && ih.sp > 0x200) oh.ss = ih.ss; - oh.sp = ih.sp > 0x200 ? ih.sp : 0x200; - if (oh.ss*16u + 0x50 < ih.ss*16u + ih.sp - && oh.ss*16u + 0x200 > ih.ss*16u + ih.sp) + if (oh.ss*16 + 0x50 < ih.ss*16 + ih.sp + && oh.ss*16 + 0x200 > ih.ss*16 + ih.sp) oh.ss += 0x20; if (oh.ss != ih.ss) @@ -398,8 +398,6 @@ void PackExe::pack(OutputFile *fo) if (ph.max_run_found + ph.max_match_found > 0x8000) throwCantPack("decompressor limit exceeded, send a bugreport"); - ph.overlap_overhead = findOverlapOverhead(obuf,32); - #ifdef TESTING if (opt->debug) { @@ -411,8 +409,10 @@ void PackExe::pack(OutputFile *fo) } #endif - int flag = fillExeHeader(&oh); + ph.overlap_overhead = findOverlapOverhead(obuf,32); const unsigned lsize = buildLoader(&ft); + int flag = fillExeHeader(&oh); + MemBuffer loader(lsize); memcpy(loader,getLoader(),lsize); //OutputFile::dump("xxloader.dat", loader, lsize); @@ -428,8 +428,8 @@ void PackExe::pack(OutputFile *fo) // set oh.min & oh.max ic = ih.min*16 + ih_imagesize; - if (ic < oh.ss*16u + oh.sp) - ic = oh.ss*16u + oh.sp; + if (ic < oh.ss*16 + oh.sp) + ic = oh.ss*16 + oh.sp; oh.min = (ic - (packedsize + lsize)) / 16; ic = oh.min + (ih.max - ih.min); oh.max = ic < 0xffff && ih.max != 0xffff ? ic : 0xffff; diff --git a/src/packhead.cpp b/src/packhead.cpp index d4bddd5c..419255aa 100644 --- a/src/packhead.cpp +++ b/src/packhead.cpp @@ -38,7 +38,7 @@ **************************************************************************/ PackHeader::PackHeader() : - version(-1), format(-1), filter(0), filter_cto(0), overlap_overhead(0) + version(-1), format(-1) { } @@ -108,6 +108,7 @@ void PackHeader::putPackHeader(upx_bytep p) throwBadLoader(); #else assert(get_le32(p) == UPX_MAGIC_LE32); + int size = 0; p[4] = (unsigned char) version; p[5] = (unsigned char) format; @@ -124,13 +125,19 @@ void PackHeader::putPackHeader(upx_bytep p) set_le16(p+16,u_len); set_le16(p+18,c_len); p[20] = (unsigned char) filter; + size = 22; } - else if (format == UPX_F_DOS_EXE || format == UPX_F_DOS_EXEH) + else if (format == UPX_F_DOS_EXE) { set_le24(p+16,u_len); set_le24(p+19,c_len); set_le24(p+22,u_file_size); p[25] = (unsigned char) filter; + size = 27; + } + else if (format == UPX_F_DOS_EXEH) + { + throwInternalError("invalid format"); } else { @@ -140,6 +147,7 @@ void PackHeader::putPackHeader(upx_bytep p) p[28] = (unsigned char) filter; p[29] = (unsigned char) filter_cto; p[30] = 0; + size = 32; } } else @@ -152,10 +160,11 @@ void PackHeader::putPackHeader(upx_bytep p) p[28] = (unsigned char) filter; p[29] = (unsigned char) filter_cto; p[30] = 0; + size = 32; } // store header_checksum - const int size = getPackHeaderSize(); + assert(size == getPackHeaderSize()); p[size - 1] = get_packheader_checksum(p, size - 1); #endif /* UNUPX */ }