LIEF: Library to Instrument Executable Formats Version 2.0.0
Loading...
Searching...
No Matches
COFF/Binary.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_COFF_BINARY_H
17#define LIEF_COFF_BINARY_H
18#include "LIEF/iterators.hpp"
19#include "LIEF/span.hpp"
20#include "LIEF/visibility.h"
21
22#include "LIEF/COFF/String.hpp"
23
25
26#include <string_view>
27#include <unordered_map>
28#include <memory>
29#include <string>
30#include <vector>
31
32namespace LIEF {
33
34namespace assembly {
35class Engine;
36}
37
38namespace COFF {
39class Header;
40class Parser;
41class Section;
42class Relocation;
43class Symbol;
44
46class LIEF_API Binary {
47 public:
48 friend class Parser;
49
51 using sections_t = std::vector<std::unique_ptr<Section>>;
52
55
58
60 using relocations_t = std::vector<std::unique_ptr<Relocation>>;
61
64
68
70 using strings_table_t = std::vector<String>;
71
74
77
79 using symbols_t = std::vector<std::unique_ptr<Symbol>>;
80
83
86
89
92
95
97 const Header& header() const {
98 return *header_;
99 }
100
102 return *header_;
103 }
104
107 return sections_;
108 }
109
111 return sections_;
112 }
113
116 return relocations_;
117 }
118
120 return relocations_;
121 }
122
125 return symbols_;
126 }
127
129 return symbols_;
130 }
131
134 return strings_table_;
135 }
136
138 return strings_table_;
139 }
140
146 auto it = std::find_if(strings_table_.begin(), strings_table_.end(),
147 [offset](const String& item) {
148 return offset == item.offset();
149 });
150 return it == strings_table_.end() ? nullptr : &*it;
151 }
152
153 const String* find_string(uint32_t offset) const LIEF_LIFETIMEBOUND {
154 return const_cast<Binary*>(this)->find_string(offset);
155 }
156
159
161
163 const Symbol* find_function(const std::string& name) const LIEF_LIFETIMEBOUND;
164
165 Symbol* find_function(const std::string& name) LIEF_LIFETIMEBOUND {
166 return const_cast<Symbol*>(
167 static_cast<const Binary*>(this)->find_function(name)
168 );
169 }
170
172 const Symbol*
173 find_demangled_function(const std::string& name) const LIEF_LIFETIMEBOUND;
174
176 return const_cast<Symbol*>(
177 static_cast<const Binary*>(this)->find_demangled_function(name)
178 );
179 }
180
192 instructions_it disassemble(const Symbol& symbol) const;
193
204 instructions_it disassemble(const std::string& symbol) const;
205
210 instructions_it disassemble(const uint8_t* buffer, size_t size,
211 uint64_t address = 0) const;
212
213
218 instructions_it disassemble(const std::vector<uint8_t>& buffer,
219 uint64_t address = 0) const {
220 return disassemble(buffer.data(), buffer.size(), address);
221 }
222
224 uint64_t address = 0) const {
225 return disassemble(buffer.data(), buffer.size(), address);
226 }
227
229 uint64_t address = 0) const {
230 return disassemble(buffer.data(), buffer.size(), address);
231 }
232
248 Section* get_section(std::string_view name) LIEF_LIFETIMEBOUND {
249 return const_cast<Section*>(
250 static_cast<const Binary*>(this)->get_section(name)
251 );
252 }
253
254 const Section* get_section(std::string_view name) const LIEF_LIFETIMEBOUND;
255
256 std::string to_string() const;
257
258 LIEF_API friend std::ostream& operator<<(std::ostream& os, const Binary& bin) {
259 os << bin.to_string();
260 return os;
261 }
262
264
265 private:
266 Binary();
267 std::unique_ptr<Header> header_;
268 sections_t sections_;
269 relocations_t relocations_;
270 strings_table_t strings_table_;
271 symbols_t symbols_;
272
273 mutable std::unordered_map<uint32_t, std::unique_ptr<assembly::Engine>> engines_;
274
275 assembly::Engine* get_engine(uint64_t address) const;
276
277 template<uint32_t Key, class F>
278 LIEF_LOCAL assembly::Engine* get_cache_engine(uint64_t address, F&& f) const;
279};
280
281}
282}
283#endif
std::vector< std::unique_ptr< Symbol > > symbols_t
Internal container used to store COFF's symbols.
Definition COFF/Binary.hpp:79
ref_iterator< relocations_t &, Relocation * > it_relocations
Iterator that outputs Relocation& object.
Definition COFF/Binary.hpp:63
const Header & header() const
The COFF header.
Definition COFF/Binary.hpp:97
it_symbols symbols()
Iterator over the COFF's symbols.
Definition COFF/Binary.hpp:124
const_ref_iterator< const relocations_t &, const Relocation * > it_const_relocations
Iterator that outputs const Relocation& object.
Definition COFF/Binary.hpp:66
const String * find_string(uint32_t offset) const
Definition COFF/Binary.hpp:153
iterator_range< assembly::Instruction::Iterator > instructions_it
Instruction iterator.
Definition COFF/Binary.hpp:88
instructions_it disassemble(LIEF::span< uint8_t > buffer, uint64_t address=0) const
Definition COFF/Binary.hpp:228
instructions_it disassemble(LIEF::span< const uint8_t > buffer, uint64_t address=0) const
Definition COFF/Binary.hpp:223
const_ref_iterator< const strings_table_t & > it_const_strings_table
Iterator that outputs const String& object.
Definition COFF/Binary.hpp:76
it_sections sections()
Iterator over the different sections located in this COFF binary.
Definition COFF/Binary.hpp:106
it_const_symbols symbols() const
Definition COFF/Binary.hpp:128
it_const_strings_table string_table() const
Iterator over the COFF's strings.
Definition COFF/Binary.hpp:133
ref_iterator< strings_table_t & > it_strings_table
Iterator that outputs String& object.
Definition COFF/Binary.hpp:73
Symbol * find_demangled_function(const std::string &name)
Definition COFF/Binary.hpp:175
filter_iterator< symbols_t &, Symbol * > it_functions
Iterator which outputs COFF symbols representing functions.
Definition COFF/Binary.hpp:91
const_filter_iterator< const symbols_t &, const Symbol * > it_const_function
Iterator which outputs COFF symbols representing functions.
Definition COFF/Binary.hpp:94
ref_iterator< symbols_t &, Symbol * > it_symbols
Iterator that outputs Symbol& object.
Definition COFF/Binary.hpp:82
const_ref_iterator< const sections_t &, const Section * > it_const_sections
Iterator that outputs const Section& object.
Definition COFF/Binary.hpp:57
instructions_it disassemble(const uint8_t *buffer, size_t size, uint64_t address=0) const
Disassemble code provided by the given buffer at the specified address parameter.
const_ref_iterator< const symbols_t &, const Symbol * > it_const_symbols
Iterator that outputs Symbol& object.
Definition COFF/Binary.hpp:85
const Section * get_section(std::string_view name) const
it_strings_table string_table()
Definition COFF/Binary.hpp:137
it_const_relocations relocations() const
Definition COFF/Binary.hpp:119
it_const_function functions() const
Iterator over the functions implemented in this COFF.
const Symbol * find_demangled_function(const std::string &name) const
Try to find the function (symbol) with the given demangled name.
friend class Parser
Definition COFF/Binary.hpp:48
std::string to_string() const
it_const_sections sections() const
Definition COFF/Binary.hpp:110
Section * get_section(std::string_view name)
Return the section matching the given name or a nullptr if it can't be found.
Definition COFF/Binary.hpp:248
Header & header()
Definition COFF/Binary.hpp:101
ref_iterator< sections_t &, Section * > it_sections
Iterator that outputs Section& object.
Definition COFF/Binary.hpp:54
instructions_it disassemble(const std::vector< uint8_t > &buffer, uint64_t address=0) const
Disassemble code provided by the given vector of bytes at the specified address parameter.
Definition COFF/Binary.hpp:218
String * find_string(uint32_t offset)
Try to find the COFF string at the given offset in the COFF string table.
Definition COFF/Binary.hpp:145
instructions_it disassemble(const Symbol &symbol) const
Disassemble code for the given symbol.
std::vector< String > strings_table_t
Internal container used to store COFF's strings.
Definition COFF/Binary.hpp:70
std::vector< std::unique_ptr< Relocation > > relocations_t
Internal container used to store COFF's relocations.
Definition COFF/Binary.hpp:60
const Symbol * find_function(const std::string &name) const
Try to find the function (symbol) with the given name.
instructions_it disassemble(const std::string &symbol) const
Disassemble code for the given symbol name.
friend std::ostream & operator<<(std::ostream &os, const Binary &bin)
Definition COFF/Binary.hpp:258
std::vector< std::unique_ptr< Section > > sections_t
Internal container used to store COFF's section.
Definition COFF/Binary.hpp:51
it_relocations relocations()
Iterator over all the relocations used by this COFF binary.
Definition COFF/Binary.hpp:115
Class that represents the COFF header. It is subclassed by LIEF::COFF::RegularHeader and LIEF::COFF::...
Definition COFF/Header.hpp:33
Definition COFF/Parser.hpp:34
This class represents a COFF relocation.
Definition COFF/Relocation.hpp:34
This class represents a COFF section.
Definition COFF/Section.hpp:41
This class represents a string located in the COFF string table.
Definition String.hpp:35
This class represents a COFF symbol.
Definition COFF/Symbol.hpp:37
This class interfaces the assembler/disassembler support.
Definition Engine.hpp:37
Iterator which returns a ref on container's values given predicates.
Definition iterators.hpp:323
Definition iterators.hpp:591
Iterator which returns reference on container's values.
Definition iterators.hpp:47
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
Definition AuxiliarySymbol.hpp:30
Namespace related to assembly/disassembly support.
Definition Abstract/Binary.hpp:48
LIEF namespace.
Definition Abstract/Binary.hpp:41
filter_iterator< CT, U, typename decay_t< CT >::const_iterator > const_filter_iterator
Iterator which returns a const ref on container's values given predicates.
Definition iterators.hpp:583
tcb::span< ElementType, Extent > span
Definition span.hpp:22
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which returns a const ref on container's values.
Definition iterators.hpp:316
#define LIEF_API
Definition visibility.h:45
#define LIEF_LOCAL
Definition visibility.h:46