retdec
mpress.h
Go to the documentation of this file.
1 
7 #ifndef UNPACKERTOOL_PLUGINS_MPRESS_MPRESS_H
8 #define UNPACKERTOOL_PLUGINS_MPRESS_MPRESS_H
9 
10 #include "retdec/loader/loader.h"
11 #include "retdec/pelib/PeFile.h"
13 #include "retdec/unpacker/plugin.h"
14 
15 #define mpress_plugin plugin(retdec::unpackertool::mpress::MpressPlugin)
16 
17 namespace retdec {
18 namespace unpackertool {
19 namespace mpress {
20 
22 {
26 };
27 
29 {
38 };
39 
41 {
46 };
47 
49 {
50  std::uint32_t signature; // Offset written near the EP which tells where is the offset to the fix imports stub
51  std::uint32_t packedContentOffset; // Offset of the section with the packed content
52  std::uint32_t fixStubOffset; // Offset from the EP where the offset of Fix Imports Stub is written
53  std::uint32_t relocOffset; // Offset from Fix Imports Stub where relocations are written
54  std::uint32_t relocSizeOffset; // Offset from the EP where size of relocations is written
55  Compression compression; // Compression method used while packing
56 };
57 
59 {
60  std::uint32_t signature; // Byte at the beginning of fix imports stub
61  std::uint32_t importHintsOffset; // Offset from Fix Imports Stub where Import Hints are stored
62  std::uint32_t oepOffset; // Offset from Fix Imports Stub where the offset of OEP is written
63 };
64 
65 class MpressPlugin : public Plugin
66 {
67 public:
68  MpressPlugin();
69  virtual ~MpressPlugin() override;
70 
71  virtual void prepare() override;
72  virtual void unpack() override;
73  virtual void cleanup() override;
74 
75 private:
76  bool decompressData(retdec::utils::DynamicBuffer& compressedContent,
77  retdec::utils::DynamicBuffer& decompressedContent);
78  void decodeLzmaProperties(retdec::utils::DynamicBuffer& compressedContent, std::uint8_t& pb,
79  std::uint8_t& lp, std::uint8_t& lc);
80  std::uint32_t getFixStub();
83  void offsetAnalysis(const retdec::utils::DynamicBuffer& buffer);
85  void fixRelocations();
88  void saveFile(const std::string& fileName, retdec::utils::DynamicBuffer& content);
89  void copySectionFromOriginalFile(std::uint32_t origSectIndex, std::ostream& outputFile, std::uint32_t newSectIndex);
90 
91  std::unique_ptr<retdec::loader::Image> _file;
96  std::uint32_t _addedSectionCount;
97 
98  std::uint32_t _iatVa, _iatSize;
99  std::uint32_t _oepVa;
100  std::uint32_t _importHintsOffset;
101 };
102 
103 } // namespace mpress
104 } // namespace unpackertool
105 } // namespace retdec
106 
107 #endif
Definition: PeFile.h:109
Definition: segment.h:25
The abstract base of unpacking plugin.
Definition: plugin.h:51
MpressFixStub _fixStub
Definition: mpress.h:94
void fixJumpsAndCalls(retdec::utils::DynamicBuffer &buffer)
Definition: mpress.cpp:234
virtual void prepare() override
Definition: mpress.cpp:76
MpressPlugin()
Definition: mpress.cpp:55
void offsetAnalysis(const retdec::utils::DynamicBuffer &buffer)
Definition: mpress.cpp:372
bool decompressData(retdec::utils::DynamicBuffer &compressedContent, retdec::utils::DynamicBuffer &decompressedContent)
Definition: mpress.cpp:174
MpressUnpackerStub detectUnpackerStubVersion()
Definition: mpress.cpp:606
virtual ~MpressPlugin() override
Definition: mpress.cpp:68
MpressUnpackerStub _unpackerStub
Definition: mpress.h:93
void trailingBytesAnalysis(const retdec::utils::DynamicBuffer &buffer)
Definition: mpress.cpp:502
void saveFile(const std::string &fileName, retdec::utils::DynamicBuffer &content)
Definition: mpress.cpp:651
void fixImportsAndEp(retdec::utils::DynamicBuffer &buffer)
Definition: mpress.cpp:267
const retdec::loader::Segment * _packedContentSect
Definition: mpress.h:95
virtual void unpack() override
Definition: mpress.cpp:101
std::uint32_t _oepVa
Definition: mpress.h:99
std::uint32_t _addedSectionCount
Definition: mpress.h:96
virtual void cleanup() override
Definition: mpress.cpp:168
std::unique_ptr< retdec::loader::Image > _file
Definition: mpress.h:91
std::uint32_t _importHintsOffset
Definition: mpress.h:100
void decodeLzmaProperties(retdec::utils::DynamicBuffer &compressedContent, std::uint8_t &pb, std::uint8_t &lp, std::uint8_t &lc)
Definition: mpress.cpp:207
void copySectionFromOriginalFile(std::uint32_t origSectIndex, std::ostream &outputFile, std::uint32_t newSectIndex)
Definition: mpress.cpp:700
std::uint32_t getFixStub()
Definition: mpress.cpp:216
void fixRelocations()
Definition: mpress.cpp:576
std::uint32_t _iatSize
Definition: mpress.h:98
PeLib::PeFileT * _peFile
Definition: mpress.h:92
MpressFixStub detectFixStubVersion(retdec::utils::DynamicBuffer &unpackedContent)
Definition: mpress.cpp:636
std::uint32_t _iatVa
Definition: mpress.h:98
The class for dynamic buffered data manipulation taking the endianness of the data in account.
Definition: dynamic_buffer.h:36
Declaration of class for buffered data mainpulation.
Interface to loader library.
Compression
Definition: mpress.h:22
@ COMPRESSION_UNKNOWN
Definition: mpress.h:25
@ COMPRESSION_LZMA
Definition: mpress.h:23
@ COMPRESSION_LZMAT
Definition: mpress.h:24
MpressUnpackerStub
Definition: mpress.h:29
@ MPRESS_UNPACKER_STUB_205_LZMA
Definition: mpress.h:33
@ MPRESS_UNPACKER_STUB_101_105
Definition: mpress.h:30
@ MPRESS_UNPACKER_STUB_205_LZMAT
Definition: mpress.h:34
@ MPRESS_UNPACKER_STUB_201
Definition: mpress.h:32
@ MPRESS_UNPACKER_STUB_212_219_LZMA
Definition: mpress.h:35
@ MPRESS_UNPACKER_STUB_107_127
Definition: mpress.h:31
@ MPRESS_UNPACKER_STUB_212_219_LZMAT
Definition: mpress.h:36
@ MPRESS_UNPACKER_STUB_UNKNOWN
Definition: mpress.h:37
MpressFixStub
Definition: mpress.h:41
@ MPRESS_FIX_STUB_UNKNOWN
Definition: mpress.h:45
@ MPRESS_FIX_STUB_21x
Definition: mpress.h:44
@ MPRESS_FIX_STUB_127_20x
Definition: mpress.h:43
@ MPRESS_FIX_STUB_10x
Definition: mpress.h:42
Definition: archive_wrapper.h:19
Plugin class declaration which is representation of interface to the plugin library.
std::uint32_t signature
Definition: mpress.h:60
std::uint32_t oepOffset
Definition: mpress.h:62
std::uint32_t importHintsOffset
Definition: mpress.h:61
std::uint32_t relocOffset
Definition: mpress.h:53
std::uint32_t fixStubOffset
Definition: mpress.h:52
std::uint32_t signature
Definition: mpress.h:50
std::uint32_t packedContentOffset
Definition: mpress.h:51
std::uint32_t relocSizeOffset
Definition: mpress.h:54
Compression compression
Definition: mpress.h:55