Go to the documentation of this file.
16#ifndef LIEF_PE_PARSER_H
17#define LIEF_PE_PARSER_H
54 static constexpr size_t MAX_DATA_SIZE = 3_GB;
58 static constexpr size_t MAX_TLS_CALLBACKS = 3000;
61 static constexpr size_t MAX_DLL_NAME_SIZE = 255;
62 static constexpr size_t MAX_PADDING_SIZE = 1_GB;
81 public:
static std::unique_ptr<Binary>
parse(
const std::string& filename,
84 const ParserConfig& conf = ParserConfig::default_conf());
85 static std::unique_ptr<Binary>
parse(std::vector<uint8_t> data,
88 const ParserConfig& conf = ParserConfig::default_conf());
90 static std::unique_ptr<Binary>
parse(
const uint8_t* buffer,
size_t size,
91 const ParserConfig& conf = ParserConfig::default_conf());
92 static std::unique_ptr<Binary>
parse(std::unique_ptr<BinaryStream> stream,
95 const ParserConfig& conf = ParserConfig::default_conf());
103 auto it = memoize_exception_info_.find(rva);
104 return it == memoize_exception_info_.end() ? nullptr : it->second;
107 const Binary&
bin()
const {
127 unresolved_chains_.emplace_back(&info, target);
136 struct relocation_t {
140 Parser(
const std::string& file);
141 Parser(std::vector<uint8_t> data);
142 Parser(std::unique_ptr<BinaryStream> stream);
149 template<
typename PE_T>
155 template<
typename PE_T>
160 template<
typename PE_T>
163 template<
typename PE_T>
166 template<
typename PE_T>
169 template<
typename PE_T>
170 ok_error_t parse_delay_names_table(DelayImport&
import, uint32_t names_offset,
171 uint32_t iat_offset);
178 std::unique_ptr<Debug> parse_code_view(
const details::pe_debug& debug_info,
179 Section* sec, span<uint8_t> payload);
180 std::unique_ptr<Debug> parse_pogo(
const details::pe_debug& debug_info,
181 Section* sec, span<uint8_t> payload);
182 std::unique_ptr<Debug> parse_repro(
const details::pe_debug& debug_info,
183 Section* sec, span<uint8_t> payload);
185 template<
typename PE_T>
188 template<
typename PE_T>
191 template<
typename PE_T>
192 ok_error_t process_load_config(LoadConfiguration& config);
194 template<
typename PE_T>
207 PE_TYPE type_ = PE_TYPE::PE32_PLUS;
208 std::unique_ptr<Binary> binary_;
209 std::unique_ptr<BinaryStream> stream_;
210 std::map<uint32_t, size_t> memoize_coff_str_;
211 std::map<uint32_t, ExceptionInfo*> memoize_exception_info_;
212 std::map<uint32_t, relocation_t> dyn_hdr_relocs_;
213 std::vector<std::pair<ExceptionInfo*, uint32_t>> unresolved_chains_;
214 ParserConfig config_;
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:33
Class which represents a PE binary This is the main interface to manage and modify a PE executable.
Definition PE/Binary.hpp:56
This class represents a generic entry in the debug data directory. For known types,...
Definition debug/Debug.hpp:40
Class that represents a PE delayed import.
Definition DelayImport.hpp:36
This class is the base class for any exception or runtime function entry.
Definition ExceptionInfo.hpp:33
This class represents the load configuration data associated with the IMAGE_LOAD_CONFIG_DIRECTORY.
Definition LoadConfiguration.hpp:46
Main interface to parse PE binaries. In particular the static functions: Parser::parse should be used...
Definition PE/Parser.hpp:52
static bool is_valid_import_name(const std::string &name)
Check if the given name is a valid import.
void memoize(COFFString str)
static bool is_valid_dll_name(const std::string &name)
Check if the given name is a valid DLL name.
void memoize(ExceptionInfo &info)
static std::unique_ptr< Binary > parse(std::unique_ptr< BinaryStream > stream, const ParserConfig &conf=ParserConfig::default_conf())
Parse a PE binary from the given BinaryStream.
Binary & bin()
Definition PE/Parser.hpp:111
const Binary & bin() const
Definition PE/Parser.hpp:107
static std::unique_ptr< Binary > parse(const uint8_t *buffer, size_t size, const ParserConfig &conf=ParserConfig::default_conf())
ExceptionInfo * find_exception_info(uint32_t rva) const
Definition PE/Parser.hpp:102
static std::unique_ptr< Binary > parse(const std::string &filename, const ParserConfig &conf=ParserConfig::default_conf())
Parse a PE binary from the given filename.
std::unique_ptr< SpanStream > stream_from_rva(uint32_t rva, size_t size=0)
Parser(const Parser ©)=delete
BinaryStream & stream()
Definition PE/Parser.hpp:115
void record_relocation(uint32_t rva, span< const uint8_t > data)
COFFString * find_coff_string(uint32_t offset) const
const ParserConfig & config() const
Definition PE/Parser.hpp:119
void add_non_resolved(ExceptionInfo &info, uint32_t target)
Definition PE/Parser.hpp:126
Parser & operator=(const Parser ©)=delete
static std::unique_ptr< Binary > parse(std::vector< uint8_t > data, const ParserConfig &conf=ParserConfig::default_conf())
Parse a PE binary from a data buffer.
ok_error_t record_delta_relocation(uint32_t rva, int64_t delta, size_t size)
Class which represents an entry of the PE relocation table.
Definition RelocationEntry.hpp:36
Class which represents a Node in the resource tree.
Definition ResourceNode.hpp:45
Class which represents a PE section.
Definition PE/Section.hpp:43
Definition SpanStream.hpp:32
Definition DataDirectory.hpp:37
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
PE_TYPE
Definition PE/enums.hpp:22
LIEF namespace.
Definition Abstract/Binary.hpp:36
result< ok_t > ok_error_t
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:109
#define LIEF_API
Definition visibility.h:41