29 #ifndef __UPX_PACKER_H 30 #define __UPX_PACKER_H 1 55 void putPackHeader(upx_bytep p);
56 bool fillPackHeader(
const upx_bytep b,
int blen);
57 bool PACKHEADER_TRYFILLPACK(
const upx_bytep buf,
int blen,
unsigned int type);
60 int getPackHeaderSize()
const;
80 unsigned saved_u_adler;
81 unsigned saved_c_adler;
89 unsigned max_offset_found;
91 unsigned max_match_found;
93 unsigned max_run_found;
94 unsigned first_offset_found;
98 unsigned overlap_overhead;
103 void ph_decompress(
PackHeader &ph,
const upx_bytep in, upx_bytep out,
104 bool verify_checksum,
Filter *ft);
105 bool ph_testOverlappingDecompression(
const PackHeader &ph,
const upx_bytep buf,
106 unsigned overlap_overhead);
123 virtual void assertPacker()
const;
125 virtual int getVersion()
const = 0;
127 virtual int getFormat()
const = 0;
128 virtual const char *getName()
const = 0;
129 virtual const char *getFullName(
const options_t *)
const = 0;
130 virtual const int *getCompressionMethods(
int method,
int level)
const = 0;
131 virtual const int *getFilters()
const = 0;
134 void initPackHeader();
135 void updatePackHeader();
143 virtual bool canUnpackVersion(
int version)
const 144 {
return (version >= 8); }
145 virtual bool canUnpackFormat(
int format)
const 146 {
return (format == getFormat()); }
150 virtual bool testUnpackVersion(
int version)
const;
151 virtual bool testUnpackFormat(
int format)
const;
159 virtual void fileInfo();
166 virtual bool canPack() = 0;
167 virtual int canUnpack() = 0;
168 virtual int canTest() {
return canUnpack(); }
169 virtual int canList() {
return canUnpack(); }
173 virtual bool compress(upx_bytep i_ptr,
unsigned i_len, upx_bytep o_ptr,
175 virtual void decompress(
const upx_bytep in, upx_bytep out,
176 bool verify_checksum =
true,
Filter *ft = NULL);
177 virtual bool checkDefaultCompressionRatio(
unsigned u_len,
unsigned c_len)
const;
178 virtual bool checkCompressionRatio(
unsigned u_len,
unsigned c_len)
const;
179 virtual bool checkFinalCompressionRatio(
const OutputFile *fo)
const;
182 void compressWithFilters(
Filter *ft,
183 const unsigned overlap_range,
185 int filter_strategy = 0,
186 int inhibit_compression_check = 0);
187 void compressWithFilters(
Filter *ft,
188 const unsigned overlap_range,
191 unsigned filter_buf_off,
192 unsigned compress_ibuf_off,
193 unsigned compress_obuf_off,
194 const upx_bytep hdr_ptr,
unsigned hdr_len,
195 int inhibit_compression_check = 0);
197 void compressWithFilters(upx_bytep i_ptr,
unsigned i_len,
199 upx_bytep f_ptr,
unsigned f_len,
200 const upx_bytep hdr_ptr,
unsigned hdr_len,
202 const unsigned overlap_range,
205 int inhibit_compression_check = 0);
209 virtual bool testOverlappingDecompression(
const upx_bytep buf,
210 const upx_bytep tbuf,
211 unsigned overlap_overhead)
const;
213 virtual unsigned findOverlapOverhead(
const upx_bytep buf,
214 const upx_bytep tbuf,
216 unsigned upper_limit = ~0u)
const;
218 void verifyOverlappingDecompression(
Filter *ft = NULL);
219 void verifyOverlappingDecompression(upx_bytep o_ptr,
unsigned o_size,
Filter *ft = NULL);
222 virtual int patchPackHeader(
void *b,
int blen);
223 virtual bool getPackHeader(
void *b,
int blen,
bool allow_incompressible=
false);
224 virtual bool readPackHeader(
int len,
bool allow_incompressible=
false);
225 virtual void checkAlreadyPacked(
const void *b,
int blen);
228 virtual void buildLoader(
const Filter *ft) = 0;
229 virtual Linker* newLinker()
const = 0;
230 virtual void relocateLoader();
232 virtual upx_byte *getLoader()
const;
233 virtual int getLoaderSize()
const;
234 virtual void initLoader(
const void *pdata,
int plen,
int small=-1);
235 #define C const char * 236 void addLoader(C);
void addLoader(C,C);
void addLoader(C,C,C);
237 void addLoader(C,C,C,C);
void addLoader(C,C,C,C,C);
238 void addLoader(C,C,C,C,C,C);
void addLoader(C,C,C,C,C,C,C);
239 void addLoader(C,C,C,C,C,C,C,C);
void addLoader(C,C,C,C,C,C,C,C,C);
240 void addLoader(C,C,C,C,C,C,C,C,C,C);
242 #if 1 && (ACC_CC_CLANG || (ACC_CC_GNUC >= 0x040100)) 243 void __acc_cdecl_va addLoaderVA(
const char *s, ...) __attribute__((__sentinel__));
245 void __acc_cdecl_va addLoaderVA(
const char *s, ...);
247 virtual bool hasLoaderSection(
const char *name)
const;
248 virtual int getLoaderSection(
const char *name,
int *slen=NULL)
const;
249 virtual int getLoaderSectionStart(
const char *name,
int *slen=NULL)
const;
253 static bool isValidCompressionMethod(
int method);
255 const int *getDefaultCompressionMethods_8(
int method,
int level,
int small=-1)
const;
256 const int *getDefaultCompressionMethods_le32(
int method,
int level,
int small=-1)
const;
257 virtual const char *getDecompressorSections()
const;
258 virtual unsigned getDecompressorWrkmemSize()
const;
259 virtual void defineDecompressorSymbols();
262 virtual bool isValidFilter(
int filter_id)
const;
263 virtual void optimizeFilter(
Filter *,
const upx_byte *,
unsigned)
const { }
264 virtual void addFilter32(
int filter_id);
265 virtual void defineFilterSymbols(
const Filter *ft);
269 virtual void checkOverlay(
unsigned overlay);
270 virtual void copyOverlay(
OutputFile *fo,
unsigned overlay,
274 virtual unsigned getRandomId()
const;
277 int patch_be16(
void *b,
int blen,
unsigned old,
unsigned new_);
278 int patch_be16(
void *b,
int blen,
const void * old,
unsigned new_);
279 int patch_be32(
void *b,
int blen,
unsigned old,
unsigned new_);
280 int patch_be32(
void *b,
int blen,
const void * old,
unsigned new_);
281 int patch_le16(
void *b,
int blen,
unsigned old,
unsigned new_);
282 int patch_le16(
void *b,
int blen,
const void * old,
unsigned new_);
283 int patch_le32(
void *b,
int blen,
unsigned old,
unsigned new_);
284 int patch_le32(
void *b,
int blen,
const void * old,
unsigned new_);
285 void checkPatch(
void *b,
int blen,
int boff,
int size);
288 static upx_byte *optimizeReloc(upx_byte *in,
unsigned relocnum,upx_byte *out,upx_byte *image,
int bs,
int *big,
int bits);
289 static unsigned unoptimizeReloc(upx_byte **in,upx_byte *image,
MemBuffer *out,
int bs,
int bits);
290 static upx_byte *optimizeReloc32(upx_byte *in,
unsigned relocnum,upx_byte *out,upx_byte *image,
int bs,
int *big);
291 static unsigned unoptimizeReloc32(upx_byte **in,upx_byte *image,
MemBuffer *out,
int bs);
292 static upx_byte *optimizeReloc64(upx_byte *in,
unsigned relocnum,upx_byte *out,upx_byte *image,
int bs,
int *big);
293 static unsigned unoptimizeReloc64(upx_byte **in,upx_byte *image,
MemBuffer *out,
int bs);
296 unsigned get_te16(
const void *p)
const {
return bele->get16(p); }
297 unsigned get_te32(
const void *p)
const {
return bele->get32(p); }
298 upx_uint64_t get_te64(
const void *p)
const {
return bele->get64(p); }
299 void set_te16(
void *p,
unsigned v)
const { bele->set16(p, v); }
300 void set_te32(
void *p,
unsigned v)
const { bele->set32(p, v); }
301 void set_te64(
void *p, upx_uint64_t v)
const { bele->set64(p, v); }
Definition: packmast.h:41