mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
224 lines
6.7 KiB
C++
224 lines
6.7 KiB
C++
/* lefile.h --
|
|
|
|
This file is part of the UPX executable compressor.
|
|
|
|
Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
|
|
Copyright (C) 1996-2000 Laszlo Molnar
|
|
|
|
UPX and the UCL library are free software; you can redistribute them
|
|
and/or modify them under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of
|
|
the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING.
|
|
If not, write to the Free Software Foundation, Inc.,
|
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
|
markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu
|
|
*/
|
|
|
|
|
|
#ifndef __UPX_LEFILE_H
|
|
#define __UPX_LEFILE_H
|
|
|
|
class InputFile;
|
|
class OutputFile;
|
|
|
|
|
|
/*************************************************************************
|
|
//
|
|
**************************************************************************/
|
|
|
|
class LeFile
|
|
{
|
|
public:
|
|
LeFile(InputFile *);
|
|
virtual ~LeFile();
|
|
|
|
virtual bool readFileHeader();
|
|
virtual void writeFile(OutputFile *, bool);
|
|
|
|
protected:
|
|
enum { FIXUP_EXTRA = 3 };
|
|
|
|
struct le_header_t
|
|
{ // 0x00
|
|
char _[2]; // signature: 'LE' || 'LX'
|
|
char byte_order; // 0 little endian
|
|
char word_order; // 0 little endian
|
|
LE32 exe_format_level; // 0
|
|
LE16 cpu_type; // 1->286..4->586
|
|
LE16 target_os; // 1->OS2
|
|
char _0[4]; // module_version = 0
|
|
// 0x10
|
|
LE32 module_type; // 0x200->compatible with PM windowing
|
|
LE32 memory_pages;
|
|
LE32 init_cs_object;
|
|
LE32 init_eip_offset;
|
|
// 0x20
|
|
LE32 init_ss_object;
|
|
LE32 init_esp_offset;
|
|
LE32 memory_page_size;
|
|
LE32 bytes_on_last_page;
|
|
// 0x30
|
|
LE32 fixup_size;
|
|
char _1[4]; // fixup_checksum = 0
|
|
LE32 loader_size;
|
|
char _2[4]; // loader_checksum = 0
|
|
// 0x40
|
|
LE32 object_table_offset;
|
|
LE32 object_table_entries;
|
|
LE32 object_pagemap_offset;
|
|
LE32 object_iterate_data_map_offset;
|
|
// 0x50
|
|
char _3[4]; // resource_offset
|
|
LE32 resource_entries;
|
|
LE32 resident_names_offset;
|
|
LE32 entry_table_offset;
|
|
// 0x60
|
|
char _4[4]; // module_directives_table_offset = 0
|
|
LE32 module_directives_entries;
|
|
LE32 fixup_page_table_offset;
|
|
LE32 fixup_record_table_offset;
|
|
// 0x70
|
|
LE32 imported_modules_name_table_offset;
|
|
LE32 imported_modules_count;
|
|
LE32 imported_procedures_name_table_offset;
|
|
char _5[4]; // per_page_checksum_table_offset = 0
|
|
// 0x80
|
|
LE32 data_pages_offset;
|
|
char _6[4]; // preload_page_count = 0
|
|
LE32 non_resident_name_table_offset;
|
|
LE32 non_resident_name_table_length;
|
|
// 0x90
|
|
char _7[4]; //non_resident_names_checksum
|
|
LE32 automatic_data_object;
|
|
#if 1
|
|
char _8[44];
|
|
#else
|
|
LE32 debug_info_offset;
|
|
LE32 debug_info_length;
|
|
// 0xA0
|
|
LE32 preload_instance_pages;
|
|
LE32 demand_instance_pages;
|
|
LE32 extra_heap_alloc;
|
|
char reserved[12];
|
|
LE32 versioninfo;
|
|
LE32 unkown;
|
|
// 0xC0
|
|
LE16 device_id;
|
|
LE16 ddk_version;
|
|
#endif
|
|
};
|
|
|
|
struct le_object_table_entry_t
|
|
{
|
|
LE32 virtual_size;
|
|
LE32 base_address;
|
|
LE32 flags;
|
|
LE32 pagemap_index;
|
|
LE32 npages;
|
|
LE32 reserved;
|
|
};
|
|
|
|
struct le_pagemap_entry_t
|
|
{
|
|
upx_byte h;
|
|
upx_byte m;
|
|
upx_byte l;
|
|
upx_byte type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed
|
|
};
|
|
|
|
virtual void readObjectTable();
|
|
virtual void writeObjectTable();
|
|
//virtual void encodeObjectTable(){oobject_table = iobject_table; iobject_table = NULL;}
|
|
//virtual void decodeObjectTable(){encodeObjectTable();}
|
|
|
|
virtual void readFixupPageTable();
|
|
virtual void writeFixupPageTable();
|
|
//virtual void encodeFixupPageTable(){ofpage_table = ifpage_table; ifpage_table = NULL;}
|
|
//virtual void decodeFixupPageTable(){encodeFixupPageTable();}
|
|
|
|
virtual void readPageMap();
|
|
virtual void writePageMap();
|
|
virtual void encodePageMap(){opm_entries = ipm_entries; ipm_entries = NULL;}
|
|
virtual void decodePageMap(){encodePageMap();}
|
|
|
|
virtual void readResidentNames();
|
|
virtual void writeResidentNames();
|
|
virtual void encodeResidentNames(){ores_names = ires_names; ires_names = NULL;}
|
|
virtual void decodeResidentNames(){encodeResidentNames();}
|
|
|
|
virtual void readNonResidentNames();
|
|
virtual void writeNonResidentNames();
|
|
virtual void encodeNonResidentNames(){ononres_names = inonres_names; inonres_names = NULL;}
|
|
virtual void decodeNonResidentNames(){encodeNonResidentNames();}
|
|
|
|
virtual void readEntryTable();
|
|
virtual void writeEntryTable();
|
|
//virtual void encodeEntryTable(){oentries = ientries; ientries = NULL;}
|
|
//virtual void decodeEntryTable(){encodeEntryTable();}
|
|
|
|
virtual void readFixups();
|
|
virtual void writeFixups();
|
|
//virtual void encodeFixups(){ofixups = ifixups; ifixups = NULL;}
|
|
//virtual void decodeFixups(){encodeFixups();}
|
|
|
|
virtual void readImage();
|
|
virtual void writeImage();
|
|
//virtual void encodeImage(){oimage = iimage; iimage = NULL;}
|
|
//virtual void decodeImage(){encodeImage();}
|
|
|
|
void countFixups(unsigned *) const;
|
|
|
|
InputFile *fif;
|
|
OutputFile *fof;
|
|
long le_offset;
|
|
long exe_offset;
|
|
|
|
le_header_t ih;
|
|
le_header_t oh;
|
|
|
|
le_object_table_entry_t *iobject_table;
|
|
le_object_table_entry_t *oobject_table;
|
|
unsigned *ifpage_table;
|
|
unsigned *ofpage_table;
|
|
le_pagemap_entry_t *ipm_entries;
|
|
le_pagemap_entry_t *opm_entries;
|
|
upx_byte *ires_names;
|
|
upx_byte *ores_names;
|
|
upx_byte *ifixups;
|
|
upx_byte *ofixups;
|
|
upx_byte *inonres_names;
|
|
upx_byte *ononres_names;
|
|
MemBuffer iimage;
|
|
MemBuffer oimage;
|
|
upx_byte *ientries;
|
|
upx_byte *oentries;
|
|
|
|
unsigned soobject_table;
|
|
unsigned sofpage_table;
|
|
unsigned sopm_entries;
|
|
unsigned sores_names;
|
|
unsigned sofixups;
|
|
unsigned sononres_names;
|
|
unsigned soimage;
|
|
unsigned soentries;
|
|
};
|
|
|
|
|
|
#endif /* already included */
|
|
|
|
|
|
/*
|
|
vi:ts=4:et
|
|
*/
|
|
|