retdec
macho_format.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_FILEFORMAT_FILE_FORMAT_MACHO_MACHO_FORMAT_H
8 #define RETDEC_FILEFORMAT_FILE_FORMAT_MACHO_MACHO_FORMAT_H
9 
10 #include <cstdint>
11 
12 #include <llvm/Object/MachO.h>
13 #include <llvm/Object/MachOUniversal.h>
14 
16 
17 namespace retdec {
18 namespace fileformat {
19 
23 class MachOFormat : public FileFormat
24 {
25  private:
26  bool isLittle = true;
27  bool is32 = true;
28  bool isFat = false;
29  bool isDyld = false;
30  bool isStaticLib = false;
31  bool hasEntryPoint = false;
32  unsigned long long entryPointAddr = 0;
33  unsigned long long entryPointOffset = 0;
34  std::uint32_t chosenArchOffset = 0;
35  std::uint32_t chosenArchSize = 0;
36  std::vector<std::uint8_t> chosenArchBytes;
37  std::size_t sectionCounter = 0;
38  std::size_t segmentCounter = 0;
39  std::vector<MachOSymbol> symbols;
40  std::vector<unsigned long long> indirectTable;
41  llvm::MachO::mach_header header32;
42  llvm::MachO::mach_header_64 header64;
43  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileBuffer;
44 
47  void setWidthAndEndianness();
48  bool chooseArchitecture(const llvm::object::MachOUniversalBinary::object_iterator &itr);
49  bool constructMachO();
50  bool constructFatMachO();
52 
55  void initStructures();
57 
60  std::string getSecSegName(const char *secSegName) const;
61  SecSeg::Type getSegmentType(const char *segName) const;
62  SecSeg::Type getSectionType(std::uint32_t flags, const std::string &name) const;
63  std::vector<std::uint8_t> createRelocationMask(unsigned length) const;
64  void handleScatteredRelocation(std::uint32_t firstDword, RelocationTable *tabPtr);
65  void handleRelocation(std::uint32_t firstDword, std::uint32_t secondDword, RelocationTable *tabPtr);
66  void loadSectionRelocations(std::size_t offset, std::size_t count);
67  template<typename T> void loadSection(const T &section);
68  template<typename T> Segment* loadSegment(const T &segment);
69  void segmentCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
70  void segment64Command(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
72 
75  void entryPointCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
76  void oldEntryPointCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
78 
81  void loadDylibCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
82  void symtabCommand();
85  void getImportsFromSection(const MachOSection *secPtr);
86  void parseIndirectTable(std::uint32_t offset, std::uint32_t size);
87  void dySymtabCommand();
88  void dyldInfoCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo);
89  std::unique_ptr<Import> getImportFromBindEntry(const llvm::object::MachOBindEntry &input);
91 
94  std::uint32_t getNumberOfCommands() const;
95  std::uint32_t getFirstCommandOffset() const;
96  void loadCommands();
97  void dumpCommands(std::ostream &outStream);
99 
102  unsigned long long get32Bit(const char *ptr) const;
103  unsigned long long get64Bit(const char *ptr) const;
104  unsigned long long offsetToAddress(unsigned long long offset) const;
105  Architecture getTargetArchitecture(std::uint32_t cpuType) const;
106  std::vector<std::string> getMachOUniversalArchitectures() const;
107  const char* getBufferStart() const;
108  const char* getBufferEnd() const;
109  void clearCommands();
111  protected:
112  std::unique_ptr<llvm::object::MachOObjectFile> file;
113  std::unique_ptr<llvm::object::MachOUniversalBinary> fatFile;
114  public:
115  MachOFormat(std::string pathToFile, LoadFlags loadFlags = LoadFlags::NONE);
116  MachOFormat(std::istream &inputStream, LoadFlags loadFlags = LoadFlags::NONE);
117  MachOFormat(const std::uint8_t *data, std::size_t size, LoadFlags loadFlags = LoadFlags::NONE);
118 
121  virtual retdec::utils::Endianness getEndianness() const override;
122  virtual std::size_t getBytesPerWord() const override;
123  virtual bool hasMixedEndianForDouble() const override;
125 
128  virtual std::string getFileFormatName() const override;
129  virtual bool areSectionsValid() const override;
130  virtual bool isObjectFile() const override;
131  virtual bool isDll() const override;
132  virtual bool isExecutable() const override;
133  virtual bool getMachineCode(unsigned long long &result) const override;
134  virtual bool getAbiVersion(unsigned long long &result) const override;
135  virtual bool getImageBaseAddress(unsigned long long &imageBase) const override;
136  virtual bool getEpAddress(unsigned long long &result) const override;
137  virtual bool getEpOffset(unsigned long long &epOffset) const override;
138  virtual Architecture getTargetArchitecture() const override;
139  virtual std::size_t getDeclaredNumberOfSections() const override;
140  virtual std::size_t getDeclaredNumberOfSegments() const override;
141  virtual std::size_t initSectionTableHashOffsets() override;
142  virtual std::size_t getSectionTableOffset() const override;
143  virtual std::size_t getSectionTableEntrySize() const override;
144  virtual std::size_t getSegmentTableOffset() const override;
145  virtual std::size_t getSegmentTableEntrySize() const override;
147 
150  bool is32Bit() const;
151  bool isFatBinary() const;
152  bool isStaticLibrary() const;
153  bool getTargetOs(std::string &name, std::string &version) const;
154  bool getEncryptionInfo(unsigned long &off, unsigned long &size, unsigned long &id);
155  std::uint32_t getFileType() const;
156  std::uint32_t getSizeOfCommands() const;
158 
161  bool chooseArchitecture(std::uint32_t cpuType);
162  bool chooseArchitectureAtIndex(std::uint32_t index);
163  std::uint32_t getChosenArchitectureOffset() const;
165 };
166 
167 } // namespace fileformat
168 } // namespace retdec
169 
170 #endif
Definition: file_format.h:45
LoadFlags loadFlags
load flags for configurable file loading
Definition: file_format.h:51
Definition: macho_format.h:24
virtual std::size_t getSectionTableEntrySize() const override
Definition: macho_format.cpp:1449
void dumpCommands(std::ostream &outStream)
Definition: macho_format.cpp:1144
virtual std::size_t getBytesPerWord() const override
Definition: macho_format.cpp:1336
void segment64Command(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:632
bool is32
true if address size is 32 bits
Definition: macho_format.h:27
std::vector< std::uint8_t > createRelocationMask(unsigned length) const
Definition: macho_format.cpp:385
virtual std::size_t initSectionTableHashOffsets() override
Definition: macho_format.cpp:1437
unsigned long long entryPointOffset
entry point offset
Definition: macho_format.h:33
bool getTargetOs(std::string &name, std::string &version) const
Definition: macho_format.cpp:1499
std::size_t sectionCounter
number of segment commands found
Definition: macho_format.h:37
std::uint32_t chosenArchSize
size of chosen architecture from universal binary
Definition: macho_format.h:35
std::vector< MachOSymbol > symbols
temporary symbol representation
Definition: macho_format.h:39
virtual std::size_t getSectionTableOffset() const override
Definition: macho_format.cpp:1443
llvm::MachO::mach_header header32
32 bit Mach-O header
Definition: macho_format.h:41
void symtabCommand()
Definition: macho_format.cpp:745
bool isStaticLibrary() const
Definition: macho_format.cpp:1488
bool hasEntryPoint
true if file has LC_MAIN or LC_UNIXTHREAD command
Definition: macho_format.h:31
virtual bool getAbiVersion(unsigned long long &result) const override
Definition: macho_format.cpp:1389
void segmentCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:607
std::vector< std::string > getMachOUniversalArchitectures() const
Definition: macho_format.cpp:1248
void loadDylibCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:714
virtual bool isExecutable() const override
Definition: macho_format.cpp:1377
void loadSection(const T &section)
Definition: macho_format.cpp:549
std::uint32_t getFirstCommandOffset() const
Definition: macho_format.cpp:1086
void initStructures()
Definition: macho_format.cpp:258
void handleRelocation(std::uint32_t firstDword, std::uint32_t secondDword, RelocationTable *tabPtr)
Definition: macho_format.cpp:449
bool isStaticLib
true if file static library signature is detected
Definition: macho_format.h:30
unsigned long long entryPointAddr
entry point address
Definition: macho_format.h:32
virtual std::size_t getSegmentTableOffset() const override
Definition: macho_format.cpp:1455
void dyldInfoCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:947
MachOFormat(std::string pathToFile, LoadFlags loadFlags=LoadFlags::NONE)
Definition: macho_format.cpp:69
void parseIndirectTable(std::uint32_t offset, std::uint32_t size)
Definition: macho_format.cpp:885
virtual std::size_t getDeclaredNumberOfSections() const override
Definition: macho_format.cpp:1426
void handleScatteredRelocation(std::uint32_t firstDword, RelocationTable *tabPtr)
Definition: macho_format.cpp:410
bool constructFatMachO()
Definition: macho_format.cpp:192
virtual std::size_t getDeclaredNumberOfSegments() const override
Definition: macho_format.cpp:1431
bool is32Bit() const
Definition: macho_format.cpp:1470
bool isDyld
true if file has LC_DYLD_INFO command
Definition: macho_format.h:29
void setWidthAndEndianness()
Definition: macho_format.cpp:115
bool getEncryptionInfo(unsigned long &off, unsigned long &size, unsigned long &id)
Definition: macho_format.cpp:1544
std::uint32_t getNumberOfCommands() const
Definition: macho_format.cpp:1077
std::uint32_t getChosenArchitectureOffset() const
Definition: macho_format.cpp:1652
virtual bool areSectionsValid() const override
Definition: macho_format.cpp:1361
std::unique_ptr< Import > getImportFromBindEntry(const llvm::object::MachOBindEntry &input)
Definition: macho_format.cpp:1057
std::unique_ptr< llvm::object::MachOObjectFile > file
parser of input file
Definition: macho_format.h:112
std::vector< unsigned long long > indirectTable
indirect table for import addresses
Definition: macho_format.h:40
virtual std::string getFileFormatName() const override
Definition: macho_format.cpp:1346
virtual std::size_t getSegmentTableEntrySize() const override
Definition: macho_format.cpp:1461
bool constructMachO()
Definition: macho_format.cpp:169
void entryPointCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:656
bool chooseArchitectureAtIndex(std::uint32_t index)
Definition: macho_format.cpp:1617
virtual bool getMachineCode(unsigned long long &result) const override
Definition: macho_format.cpp:1383
void loadSectionRelocations(std::size_t offset, std::size_t count)
Definition: macho_format.cpp:502
virtual bool getEpOffset(unsigned long long &epOffset) const override
Definition: macho_format.cpp:1410
bool isFatBinary() const
Definition: macho_format.cpp:1479
SecSeg::Type getSegmentType(const char *segName) const
Definition: macho_format.cpp:312
unsigned long long offsetToAddress(unsigned long long offset) const
Definition: macho_format.cpp:1205
std::unique_ptr< llvm::object::MachOUniversalBinary > fatFile
parser of universal binary
Definition: macho_format.h:113
unsigned long long get64Bit(const char *ptr) const
Definition: macho_format.cpp:1181
std::string getSecSegName(const char *secSegName) const
Definition: macho_format.cpp:287
virtual retdec::utils::Endianness getEndianness() const override
Definition: macho_format.cpp:1331
std::size_t segmentCounter
number of section commands found
Definition: macho_format.h:38
bool isFat
true if file is universal binary
Definition: macho_format.h:28
MachOSection * getLazySymbolsSection() const
Definition: macho_format.cpp:811
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > fileBuffer
LLVM buffer of input file.
Definition: macho_format.h:43
virtual bool hasMixedEndianForDouble() const override
Definition: macho_format.cpp:1341
SecSeg::Type getSectionType(std::uint32_t flags, const std::string &name) const
Definition: macho_format.cpp:332
llvm::MachO::mach_header_64 header64
64 bit Mach-O header
Definition: macho_format.h:42
void getImportsFromSection(const MachOSection *secPtr)
Definition: macho_format.cpp:849
const char * getBufferEnd() const
Definition: macho_format.cpp:1312
void dySymtabCommand()
Definition: macho_format.cpp:899
bool isLittle
true if file is little endian
Definition: macho_format.h:26
void loadCommands()
Definition: macho_format.cpp:1096
Segment * loadSegment(const T &segment)
Definition: macho_format.cpp:582
virtual bool getEpAddress(unsigned long long &result) const override
Definition: macho_format.cpp:1399
virtual Architecture getTargetArchitecture() const override
Definition: macho_format.cpp:1421
virtual bool isDll() const override
Definition: macho_format.cpp:1371
void clearCommands()
Definition: macho_format.cpp:1320
std::uint32_t getSizeOfCommands() const
Definition: macho_format.cpp:1589
unsigned long long get32Bit(const char *ptr) const
Definition: macho_format.cpp:1159
virtual bool isObjectFile() const override
Definition: macho_format.cpp:1366
virtual bool getImageBaseAddress(unsigned long long &imageBase) const override
Definition: macho_format.cpp:1394
void oldEntryPointCommand(const llvm::object::MachOObjectFile::LoadCommandInfo &commandInfo)
Definition: macho_format.cpp:668
std::uint32_t chosenArchOffset
offset of chosen architecture from universal binary
Definition: macho_format.h:34
MachOSection * getNonLazySymbolsSection() const
Definition: macho_format.cpp:829
const char * getBufferStart() const
Definition: macho_format.cpp:1303
std::vector< std::uint8_t > chosenArchBytes
bytes of chosen architecture from universal binary
Definition: macho_format.h:36
std::uint32_t getFileType() const
Definition: macho_format.cpp:1580
bool chooseArchitecture(const llvm::object::MachOUniversalBinary::object_iterator &itr)
Definition: macho_format.cpp:142
Definition: macho_section.h:19
Definition: relocation_table.h:21
Type
Definition: sec_seg.h:27
Definition: segment.h:19
Definition of FileFormat class.
LoadFlags
Definition: fftypes.h:69
@ NONE
Definition: fftypes.h:70
Architecture
Definition: fftypes.h:59
Endianness
Definition: byte_value_storage.h:21
Definition: archive_wrapper.h:19