LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
PE/Binary.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2025 R. Thomas
2 * Copyright 2017 - 2025 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_PE_BINARY_H
17#define LIEF_PE_BINARY_H
18
19#include "LIEF/PE/Header.hpp"
21#include "LIEF/PE/DosHeader.hpp"
22#include "LIEF/PE/Import.hpp"
24#include "LIEF/PE/Symbol.hpp"
26#include "LIEF/PE/Builder.hpp"
31
33
34#include "LIEF/visibility.h"
35
36namespace LIEF {
37namespace PE {
40class ExceptionInfo;
41class CodeViewPDB;
42class Debug;
43class Export;
45class Parser;
46class Relocation;
47class ResourceData;
49class ResourceNode;
50class RichHeader;
51class TLS;
52class Factory;
53class LIEF_API Binary : public LIEF::Binary {
57 friend class Parser;
58 friend class Builder;
59 friend class Factory;
60
61 public: using sections_t = std::vector<std::unique_ptr<Section>>;
64 using it_sections = ref_iterator<sections_t&, Section*>;
67 using it_const_sections = const_ref_iterator<const sections_t&, const Section*>;
70 using data_directories_t = std::vector<std::unique_ptr<DataDirectory>>;
73 using it_data_directories = ref_iterator<data_directories_t&, DataDirectory*>;
76 using it_const_data_directories = const_ref_iterator<const data_directories_t&, const DataDirectory*>;
79 using relocations_t = std::vector<std::unique_ptr<Relocation>>;
82 using it_relocations = ref_iterator<relocations_t&, Relocation*>;
85 using it_const_relocations = const_ref_iterator<const relocations_t&, const Relocation*>;
88 using imports_t = std::vector<Import>;
91 using it_imports = ref_iterator<imports_t&>;
94 using it_const_imports = const_ref_iterator<const imports_t&>;
97 using delay_imports_t = std::vector<DelayImport>;
100 using it_delay_imports = ref_iterator<delay_imports_t&>;
103 using it_const_delay_imports = const_ref_iterator<const delay_imports_t&>;
106 using debug_entries_t = std::vector<std::unique_ptr<Debug>>;
109 using it_debug_entries = ref_iterator<debug_entries_t&, Debug*>;
112 using it_const_debug_entries = const_ref_iterator<const debug_entries_t&, const Debug*>;
115 using symbols_t = std::vector<std::unique_ptr<Symbol>>;
118 using it_symbols = ref_iterator<symbols_t&, Symbol*>;
121 using it_const_symbols = const_ref_iterator<const symbols_t&, const Symbol*>;
124 using strings_table_t = std::vector<COFFString>;
127 using it_strings_table = ref_iterator<strings_table_t&>;
130 using it_const_strings_table = const_ref_iterator<const strings_table_t&>;
133 using signatures_t = std::vector<Signature>;
136 using it_signatures = ref_iterator<signatures_t&>;
139 using it_const_signatures = const_ref_iterator<const signatures_t&>;
142 using exceptions_t = std::vector<std::unique_ptr<ExceptionInfo>>;
145 using it_exceptions = ref_iterator<exceptions_t&, ExceptionInfo*>;
148 using it_const_exceptions = const_ref_iterator<const exceptions_t&, const ExceptionInfo*>;
151
153 ~Binary() override;
154 PE_TYPE type() const {
157 return type_;
158 }
159 uint64_t rva_to_offset(uint64_t RVA) const;
165 uint64_t va_to_offset(uint64_t VA) const {
169 uint64_t rva = VA - optional_header().imagebase();
170 return rva_to_offset(rva);
171 }
172 result<uint64_t> offset_to_virtual_address(uint64_t offset, uint64_t slide = 0) const override;
178 uint64_t imagebase() const override {
183 return optional_header().imagebase();
184 }
185 Section* section_from_offset(uint64_t offset) {
190 return const_cast<Section*>(static_cast<const Binary*>(this)->section_from_offset(offset));
191 }
192 const Section* section_from_offset(uint64_t offset) const;
193 Section* section_from_rva(uint64_t virtual_address) {
198 return const_cast<Section*>(static_cast<const Binary*>(this)->section_from_rva(virtual_address));
199 }
200 const Section* section_from_rva(uint64_t virtual_address) const;
201 it_sections sections() {
204 return sections_;
205 }
206
207 it_const_sections sections() const {
208 return sections_;
209 }
210 DosHeader& dos_header() {
213 return dos_header_;
214 }
215
216 const DosHeader& dos_header() const {
217 return dos_header_;
218 }
219 Header& header() {
222 return header_;
223 }
224
225 const Header& header() const {
226 return header_;
227 }
228 OptionalHeader& optional_header() {
232 return optional_header_;
233 }
234
235 const OptionalHeader& optional_header() const {
236 return optional_header_;
237 }
238 uint32_t compute_checksum() const;
245 uint64_t virtual_size() const;
249 uint32_t sizeof_headers() const;
252 TLS* tls() {
255 return tls_.get();
256 }
257
258 const TLS* tls() const {
259 return tls_.get();
260 }
261 TLS& tls(const TLS& tls);
264 bool has_tls() const {
267 return tls_ != nullptr;
268 }
269 void remove_tls();
272 bool has_imports() const {
277 return !imports_.empty();
278 }
279 bool has_signatures() const {
284 return !signatures_.empty();
285 }
286 bool has_exports() const {
291 return export_ != nullptr;
292 }
293 bool has_resources() const {
296 return resources_ != nullptr;
297 }
298 bool has_exceptions() const {
301 return exceptions_dir()->size() != 0;
302 }
303 bool has_relocations() const {
308 return !relocations_.empty();
309 }
310 bool has_debug() const {
313 return !debug_.empty();
314 }
315 bool has_configuration() const {
318 return loadconfig_ != nullptr;
319 }
320 bool is_reproducible_build() const;
326 it_const_signatures signatures() const {
329 return signatures_;
330 }
331
332 it_signatures signatures() {
333 return signatures_;
334 }
335 Signature::VERIFICATION_FLAGS verify_signature(
344 Signature::VERIFICATION_CHECKS checks = Signature::VERIFICATION_CHECKS::DEFAULT) const;
345 Signature::VERIFICATION_FLAGS verify_signature(const Signature& sig,
356 Signature::VERIFICATION_CHECKS checks = Signature::VERIFICATION_CHECKS::DEFAULT) const;
357 std::vector<uint8_t> authentihash(ALGORITHMS algo) const;
361 Export* get_export() {
364 return export_.get();
365 }
366
367 const Export* get_export() const {
368 return export_.get();
369 }
370
371 Export& set_export(const Export& export_table);
372 it_symbols symbols() {
375 return symbols_;
376 }
377
378 it_const_symbols symbols() const {
379 return symbols_;
380 }
381 it_const_strings_table coff_string_table() const {
384 return strings_table_;
385 }
386
387 it_strings_table coff_string_table() {
388 return strings_table_;
389 }
390 COFFString* find_coff_string(uint32_t offset) {
396 auto it = std::find_if(strings_table_.begin(), strings_table_.end(),
397 [offset] (const COFFString& item) {
398 return offset == item.offset();
399 }
400 );
401 return it == strings_table_.end() ? nullptr : &*it;
402 }
403
404 const COFFString* find_coff_string(uint32_t offset) const {
405 return const_cast<Binary*>(this)->find_coff_string(offset);
406 }
407 ResourceNode* resources() {
410 return resources_.get();
411 }
412
413 const ResourceNode* resources() const {
414 return resources_.get();
415 }
416 ResourceNode* set_resources(const ResourceNode& root);
420
421 ResourceNode* set_resources(std::unique_ptr<ResourceNode> root);
422 result<ResourcesManager> resources_manager() const;
425 Section* get_section(const std::string& name) {
431 return const_cast<Section*>(static_cast<const Binary*>(this)->get_section(name));
432 }
433 const Section* get_section(const std::string& name) const;
434 const Section* import_section() const;
438 Section* import_section() {
439 return const_cast<Section*>(static_cast<const Binary*>(this)->import_section());
440 }
441 void remove_section(const std::string& name, bool clear = false) override;
448 void remove(const Section& section, bool clear = false);
453 Section* add_section(const Section& section);
456 it_relocations relocations() {
459 return relocations_;
460 }
461
462 it_const_relocations relocations() const {
463 return relocations_;
464 }
465 Relocation& add_relocation(const Relocation& relocation);
468 void remove_all_relocations();
471 it_data_directories data_directories() {
474 return data_directories_;
475 }
476
477 it_const_data_directories data_directories() const {
478 return data_directories_;
479 }
480 DataDirectory* data_directory(DataDirectory::TYPES type) {
483 return const_cast<DataDirectory*>(static_cast<const Binary*>(this)->data_directory(type));
484 }
485 const DataDirectory* data_directory(DataDirectory::TYPES type) const;
486 bool has(DataDirectory::TYPES type) const {
489 return data_directory(type) != nullptr;
490 }
491 it_debug_entries debug() {
494 return debug_;
495 }
496
497 it_const_debug_entries debug() const {
498 return debug_;
499 }
500 Debug* add_debug_info(const Debug& entry);
503 bool remove_debug(const Debug& entry);
506 bool clear_debug();
509 const CodeViewPDB* codeview_pdb() const;
512 const LoadConfiguration* load_configuration() const {
516 return loadconfig_.get();
517 }
518
519 LoadConfiguration* load_configuration() {
520 return loadconfig_.get();
521 }
522 span<const uint8_t> overlay() const {
525 return overlay_;
526 }
527
528 span<uint8_t> overlay() {
529 return overlay_;
530 }
531 uint64_t overlay_offset() const {
534 return overlay_offset_;
535 }
536 span<const uint8_t> dos_stub() const {
539 return dos_stub_;
540 }
541
542 span<uint8_t> dos_stub() {
543 return dos_stub_;
544 }
545 void dos_stub(std::vector<uint8_t> content) {
548 dos_stub_ = std::move(content);
549 }
550 RichHeader* rich_header() {
553 return rich_header_.get();
554 }
555
556 const RichHeader* rich_header() const {
557 return rich_header_.get();
558 }
559 void rich_header(const RichHeader& rich_header);
562 bool has_rich_header() const {
565 return rich_header_ != nullptr;
566 }
567 it_imports imports() {
570 return imports_;
571 }
572
573 it_const_imports imports() const {
574 return imports_;
575 }
576 Import* get_import(const std::string& import_name) {
581 return const_cast<Import*>(static_cast<const Binary*>(this)->get_import(import_name));
582 }
583
584 const Import* get_import(const std::string& import_name) const;
585 bool has_import(const std::string& import_name) const {
588 return get_import(import_name) != nullptr;
589 }
590 bool has_delay_imports() const {
593 return !delay_imports_.empty();
594 }
595 it_delay_imports delay_imports() {
598 return delay_imports_;
599 }
600
601 it_const_delay_imports delay_imports() const {
602 return delay_imports_;
603 }
604 DelayImport* get_delay_import(const std::string& import_name) {
608 return const_cast<DelayImport*>(static_cast<const Binary*>(this)->get_delay_import(import_name));
609 }
610 const DelayImport* get_delay_import(const std::string& import_name) const;
611
612 bool has_delay_import(const std::string& import_name) const {
615 return get_delay_import(import_name) != nullptr;
616 }
617 Import& add_import(const std::string& name) {
620 imports_.emplace_back(name);
621 return imports_.back();
622 }
623 bool remove_import(const std::string& name);
628 void remove_all_imports() {
631 imports_.clear();
632 }
633 std::unique_ptr<Builder> write(const std::string& filename) {
636 return write(filename, Builder::config_t());
637 }
638 std::unique_ptr<Builder> write(const std::string& filename,
642 const Builder::config_t& config);
643 std::unique_ptr<Builder> write(std::ostream& os) {
649 return write(os, Builder::config_t());
650 }
651
652 std::unique_ptr<Builder> write(std::ostream& os,
653 const Builder::config_t& config);
654
655 void accept(Visitor& visitor) const override;
656 void patch_address(uint64_t address, const std::vector<uint8_t>& patch_value,
663 VA_TYPES addr_type = VA_TYPES::AUTO) override;
664
665 void patch_address(uint64_t address, uint64_t patch_value, size_t size = sizeof(uint64_t),
673 VA_TYPES addr_type = VA_TYPES::AUTO) override;
674
675 void fill_address(uint64_t address, size_t size, uint8_t value = 0,
678 VA_TYPES addr_type = VA_TYPES::AUTO);
679 span<const uint8_t> get_content_from_virtual_address(
686 uint64_t virtual_address, uint64_t size,
687 Binary::VA_TYPES addr_type = Binary::VA_TYPES::AUTO) const override;
688 uint64_t entrypoint() const override {
691 return optional_header_.imagebase() + optional_header_.addressof_entrypoint();
692 }
693 bool is_pie() const override {
696 return optional_header_.has(OptionalHeader::DLL_CHARACTERISTICS::DYNAMIC_BASE);
697 }
698 bool has_nx() const override {
701 return optional_header_.has(OptionalHeader::DLL_CHARACTERISTICS::NX_COMPAT);
702 }
703
704 uint64_t last_section_offset() const;
705 DataDirectory* export_dir() {
708 return data_directory(DataDirectory::TYPES::EXPORT_TABLE);
709 }
710
711 const DataDirectory* export_dir() const {
712 return data_directory(DataDirectory::TYPES::EXPORT_TABLE);
713 }
714 DataDirectory* import_dir() {
717 return data_directory(DataDirectory::TYPES::IMPORT_TABLE);
718 }
719
720 const DataDirectory* import_dir() const {
721 return data_directory(DataDirectory::TYPES::IMPORT_TABLE);
722 }
723 DataDirectory* rsrc_dir() {
726 return data_directory(DataDirectory::TYPES::RESOURCE_TABLE);
727 }
728
729 const DataDirectory* rsrc_dir() const {
730 return data_directory(DataDirectory::TYPES::RESOURCE_TABLE);
731 }
732 DataDirectory* exceptions_dir() {
735 return data_directory(DataDirectory::TYPES::EXCEPTION_TABLE);
736 }
737
738 const DataDirectory* exceptions_dir() const {
739 return data_directory(DataDirectory::TYPES::EXCEPTION_TABLE);
740 }
741 DataDirectory* cert_dir() {
745 return data_directory(DataDirectory::TYPES::CERTIFICATE_TABLE);
746 }
747
748 const DataDirectory* cert_dir() const {
749 return data_directory(DataDirectory::TYPES::CERTIFICATE_TABLE);
750 }
751 DataDirectory* relocation_dir() {
754 return data_directory(DataDirectory::TYPES::BASE_RELOCATION_TABLE);
755 }
756
757 const DataDirectory* relocation_dir() const {
758 return data_directory(DataDirectory::TYPES::BASE_RELOCATION_TABLE);
759 }
760 DataDirectory* debug_dir() {
763 return data_directory(DataDirectory::TYPES::DEBUG_DIR);
764 }
765
766 const DataDirectory* debug_dir() const {
767 return data_directory(DataDirectory::TYPES::DEBUG_DIR);
768 }
769 DataDirectory* tls_dir() {
772 return data_directory(DataDirectory::TYPES::TLS_TABLE);
773 }
774
775 const DataDirectory* tls_dir() const {
776 return data_directory(DataDirectory::TYPES::TLS_TABLE);
777 }
778 DataDirectory* load_config_dir() {
781 return data_directory(DataDirectory::TYPES::LOAD_CONFIG_TABLE);
782 }
783
784 const DataDirectory* load_config_dir() const {
785 return data_directory(DataDirectory::TYPES::LOAD_CONFIG_TABLE);
786 }
787 DataDirectory* iat_dir() {
790 return data_directory(DataDirectory::TYPES::IAT);
791 }
792
793 const DataDirectory* iat_dir() const {
794 return data_directory(DataDirectory::TYPES::IAT);
795 }
796 DataDirectory* delay_dir() {
799 return data_directory(DataDirectory::TYPES::DELAY_IMPORT_DESCRIPTOR);
800 }
801
802 const DataDirectory* delay_dir() const {
803 return data_directory(DataDirectory::TYPES::DELAY_IMPORT_DESCRIPTOR);
804 }
805 LIEF::Binary::functions_t ctor_functions() const override;
810 LIEF::Binary::functions_t functions() const;
813 LIEF::Binary::functions_t exception_functions() const;
816 it_exceptions exceptions() {
823 return exceptions_;
824 }
825
826 it_const_exceptions exceptions() const {
827 return exceptions_;
828 }
829 ExceptionInfo* find_exception_at(uint32_t rva);
836
837 const ExceptionInfo* find_exception_at(uint32_t rva) const {
838 return const_cast<Binary*>(this)->find_exception_at(rva);
839 }
840 bool is_arm64ec() const;
843 bool is_arm64x() const;
847 const Binary* nested_pe_binary() const {
859 return nested_.get();
860 }
861
862 Binary* nested_pe_binary() {
863 return nested_.get();
864 }
865
866 static bool classof(const LIEF::Binary* bin) {
867 return bin->format() == Binary::FORMATS::PE;
868 }
869
870 std::ostream& print(std::ostream& os) const override;
871
872 LIEF_LOCAL std::unique_ptr<Binary> move_nested_pe_binary() {
877 auto ret = std::move(nested_);
878 nested_ = nullptr;
879 return ret;
880 }
881
882 private:
883 struct sizing_info_t {
884 uint32_t nb_tls_callbacks = 0;
885 uint32_t load_config_size = 0;
886 };
887 result<uint64_t> make_space_for_new_section();
891 LIEF::Binary::symbols_t get_abstract_symbols() override;
894
895 LIEF::Header get_abstract_header() const override {
896 return LIEF::Header::from(*this);
897 }
898 LIEF::Binary::sections_t get_abstract_sections() override;
901
902 LIEF::Binary::relocations_t get_abstract_relocations() override;
903
904 LIEF::Binary::functions_t get_abstract_exported_functions() const override;
905 LIEF::Binary::functions_t get_abstract_imported_functions() const override;
906 std::vector<std::string> get_abstract_imported_libraries() const override;
907
908 void update_lookup_address_table_offset();
909 void update_iat();
910 void shift(uint64_t from, uint64_t by);
911
912 PE_TYPE type_ = PE_TYPE::PE32_PLUS;
913 DosHeader dos_header_;
914 Header header_;
915 OptionalHeader optional_header_;
916
917 int32_t available_sections_space_ = 0;
918
919 signatures_t signatures_;
920 sections_t sections_;
921 data_directories_t data_directories_;
922 symbols_t symbols_;
923 strings_table_t strings_table_;
924 relocations_t relocations_;
925 imports_t imports_;
926 delay_imports_t delay_imports_;
927 debug_entries_t debug_;
928 exceptions_t exceptions_;
929 uint64_t overlay_offset_ = 0;
930 std::vector<uint8_t> overlay_;
931 std::vector<uint8_t> dos_stub_;
932 std::vector<uint8_t> section_offset_padding_;
933
934 std::unique_ptr<RichHeader> rich_header_;
935 std::unique_ptr<Export> export_;
936 std::unique_ptr<ResourceNode> resources_;
937 std::unique_ptr<TLS> tls_;
938 std::unique_ptr<LoadConfiguration> loadconfig_;
939 std::unique_ptr<Binary> nested_;
940
941 sizing_info_t sizing_info_;
942};
943
944}
945}
946#endif
Binary.hpp
COFFString.hpp
DataDirectory.hpp
DelayImport.hpp
DosHeader.hpp
ExceptionInfo.hpp
Import.hpp
OptionalHeader.hpp
Builder.hpp
Header.hpp
Symbol.hpp
ResourcesManager.hpp
Signature.hpp
LIEF::Binary::functions_t
std::vector< Function > functions_t
Definition Abstract/Binary.hpp:67
LIEF::Binary::format
FORMATS format() const
Executable format (ELF, PE, Mach-O) of the underlying binary.
Definition Abstract/Binary.hpp:109
LIEF::Binary::symbols_t
std::vector< Symbol * > symbols_t
Internal container.
Definition Abstract/Binary.hpp:79
LIEF::Binary::sections_t
std::vector< Section * > sections_t
Internal container.
Definition Abstract/Binary.hpp:70
LIEF::Binary::relocations_t
std::vector< Relocation * > relocations_t
Internal container.
Definition Abstract/Binary.hpp:88
LIEF::Header::from
static Header from(const LIEF::ELF::Binary &elf)
LIEF::PE::Binary
Class which represents a PE binary This is the main interface to manage and modify a PE executable.
Definition PE/Binary.hpp:56
LIEF::PE::Binary::optional_header
OptionalHeader & optional_header()
Header that follows the header(). It is named optional from the COFF specfication but it is mandatory...
Definition PE/Binary.hpp:231
LIEF::PE::Binary::export_dir
const DataDirectory * export_dir() const
Definition PE/Binary.hpp:711
LIEF::PE::Binary::remove_all_relocations
void remove_all_relocations()
Remove all the relocations.
LIEF::PE::Binary::export_dir
DataDirectory * export_dir()
Return the data directory associated with the export table.
Definition PE/Binary.hpp:707
LIEF::PE::Binary::exceptions
it_exceptions exceptions()
Iterator over the exception (_RUNTIME_FUNCTION) functions.
Definition PE/Binary.hpp:822
LIEF::PE::Binary::write
std::unique_ptr< Builder > write(std::ostream &os)
Reconstruct the binary object and write the raw PE in os stream.
Definition PE/Binary.hpp:648
LIEF::PE::Binary::authentihash
std::vector< uint8_t > authentihash(ALGORITHMS algo) const
Compute the authentihash according to the algorithm provided in the first parameter.
LIEF::PE::Binary::remove_tls
void remove_tls()
Remove the TLS from the binary.
LIEF::PE::Binary::load_configuration
const LoadConfiguration * load_configuration() const
Retrun the LoadConfiguration object or a nullptr if the binary does not use the LoadConfiguration.
Definition PE/Binary.hpp:515
LIEF::PE::Binary::print
std::ostream & print(std::ostream &os) const override
LIEF::PE::Binary::delay_imports
it_const_delay_imports delay_imports() const
Definition PE/Binary.hpp:601
LIEF::PE::Binary::debug
it_const_debug_entries debug() const
Definition PE/Binary.hpp:497
LIEF::PE::Binary::remove_section
void remove_section(const std::string &name, bool clear=false) override
Delete the section with the given name.
LIEF::PE::Binary::patch_address
void patch_address(uint64_t address, uint64_t patch_value, size_t size=sizeof(uint64_t), VA_TYPES addr_type=VA_TYPES::AUTO) override
Patch the address with the given value.
LIEF::PE::Binary::is_pie
bool is_pie() const override
Check if the binary is position independent.
Definition PE/Binary.hpp:695
LIEF::PE::Binary::ctor_functions
LIEF::Binary::functions_t ctor_functions() const override
Return the list of the binary constructors.
LIEF::PE::Binary::exceptions_dir
DataDirectory * exceptions_dir()
Return the data directory associated with the exceptions.
Definition PE/Binary.hpp:734
LIEF::PE::Binary::dos_stub
void dos_stub(std::vector< uint8_t > content)
Update the DOS stub content.
Definition PE/Binary.hpp:547
LIEF::PE::Binary::delay_dir
DataDirectory * delay_dir()
Return the data directory associated with delayed imports.
Definition PE/Binary.hpp:798
LIEF::PE::Binary::imports
it_imports imports()
Return an iterator over the binary imports.
Definition PE/Binary.hpp:569
LIEF::PE::Binary::has_resources
bool has_resources() const
Check if the current binary has resources.
Definition PE/Binary.hpp:295
LIEF::PE::Binary::import_dir
const DataDirectory * import_dir() const
Definition PE/Binary.hpp:720
LIEF::PE::Binary::tls
TLS & tls(const TLS &tls)
Set a TLS object in the current Binary.
LIEF::PE::Binary::resources
const ResourceNode * resources() const
Definition PE/Binary.hpp:413
LIEF::PE::Binary::has_debug
bool has_debug() const
Check if the current binary contains debug information.
Definition PE/Binary.hpp:312
LIEF::PE::Binary::iat_dir
const DataDirectory * iat_dir() const
Definition PE/Binary.hpp:793
LIEF::PE::Binary::get_delay_import
DelayImport * get_delay_import(const std::string &import_name)
Returns the DelayImport matching the given name. If it can't be found, it returns a nullptr.
Definition PE/Binary.hpp:607
LIEF::PE::Binary::exceptions
it_const_exceptions exceptions() const
Definition PE/Binary.hpp:826
LIEF::PE::Binary::tls_dir
const DataDirectory * tls_dir() const
Definition PE/Binary.hpp:775
LIEF::PE::Binary::debug_dir
const DataDirectory * debug_dir() const
Definition PE/Binary.hpp:766
LIEF::PE::Binary::has_relocations
bool has_relocations() const
Check if the current binary has relocations.
Definition PE/Binary.hpp:307
LIEF::PE::Binary::has_exports
bool has_exports() const
Check if the current binary has exports.
Definition PE/Binary.hpp:290
LIEF::PE::Binary::virtual_size
uint64_t virtual_size() const
Compute the binary's virtual size. It should match OptionalHeader::sizeof_image.
LIEF::PE::Binary::rva_to_offset
uint64_t rva_to_offset(uint64_t RVA) const
Convert a Relative Virtual Address into an offset.
LIEF::PE::Binary::resources_manager
result< ResourcesManager > resources_manager() const
Return the ResourcesManager (class to manage resources more easily than the tree one)
LIEF::PE::Binary::remove_import
bool remove_import(const std::string &name)
Remove the imported library with the given name
LIEF::PE::Binary::find_coff_string
const COFFString * find_coff_string(uint32_t offset) const
Definition PE/Binary.hpp:404
LIEF::PE::Binary::clear_debug
bool clear_debug()
Remove all debug info from the binary.
LIEF::PE::Binary::offset_to_virtual_address
result< uint64_t > offset_to_virtual_address(uint64_t offset, uint64_t slide=0) const override
Convert the given offset into a virtual address.
LIEF::PE::Binary::imports
it_const_imports imports() const
Definition PE/Binary.hpp:573
LIEF::PE::Binary::optional_header
const OptionalHeader & optional_header() const
Definition PE/Binary.hpp:235
LIEF::PE::Binary::signatures
it_signatures signatures()
Definition PE/Binary.hpp:332
LIEF::PE::Binary::verify_signature
Signature::VERIFICATION_FLAGS verify_signature(const Signature &sig, Signature::VERIFICATION_CHECKS checks=Signature::VERIFICATION_CHECKS::DEFAULT) const
Verify the binary with the Signature object provided in the first parameter. It can be used to verify...
LIEF::PE::Binary::add_debug_info
Debug * add_debug_info(const Debug &entry)
Add a new debug entry.
LIEF::PE::Binary::overlay
span< const uint8_t > overlay() const
Return the overlay content.
Definition PE/Binary.hpp:524
LIEF::PE::Binary::is_arm64x
bool is_arm64x() const
True if this binary is compiled in ARM64X mode (contains both ARM64 and ARM64EC code)
LIEF::PE::Binary::is_arm64ec
bool is_arm64ec() const
True if this binary is compiled in ARM64EC mode (emulation compatible)
LIEF::PE::Binary::rsrc_dir
DataDirectory * rsrc_dir()
Return the data directory associated with the resources tree.
Definition PE/Binary.hpp:725
LIEF::PE::Binary::Binary
Binary()
LIEF::PE::Binary::get_content_from_virtual_address
span< const uint8_t > get_content_from_virtual_address(uint64_t virtual_address, uint64_t size, Binary::VA_TYPES addr_type=Binary::VA_TYPES::AUTO) const override
Return the content located at the provided virtual address.
LIEF::PE::Binary::data_directory
const DataDirectory * data_directory(DataDirectory::TYPES type) const
LIEF::PE::Binary::tls_dir
DataDirectory * tls_dir()
Return the data directory associated with TLS.
Definition PE/Binary.hpp:771
LIEF::PE::Binary::rsrc_dir
const DataDirectory * rsrc_dir() const
Definition PE/Binary.hpp:729
LIEF::PE::Binary::fill_address
void fill_address(uint64_t address, size_t size, uint8_t value=0, VA_TYPES addr_type=VA_TYPES::AUTO)
Fill the content at the provided with a fixed value.
LIEF::PE::Binary::has_rich_header
bool has_rich_header() const
Check if the current binary has a RichHeader object.
Definition PE/Binary.hpp:564
LIEF::PE::Binary::has_signatures
bool has_signatures() const
Check if the current binary contains signatures.
Definition PE/Binary.hpp:283
LIEF::PE::Binary::has_delay_imports
bool has_delay_imports() const
Check if the current binary contains delay imports.
Definition PE/Binary.hpp:592
LIEF::PE::Binary::load_config_dir
const DataDirectory * load_config_dir() const
Definition PE/Binary.hpp:784
LIEF::PE::Binary::rich_header
void rich_header(const RichHeader &rich_header)
Set a RichHeader object in the current Binary.
LIEF::PE::Binary::relocation_dir
DataDirectory * relocation_dir()
Return the data directory associated with the relocation table.
Definition PE/Binary.hpp:753
LIEF::PE::Binary::exceptions_dir
const DataDirectory * exceptions_dir() const
Definition PE/Binary.hpp:738
LIEF::PE::Binary::tls
TLS * tls()
Return a reference to the TLS object.
Definition PE/Binary.hpp:254
LIEF::PE::Binary::data_directories
it_const_data_directories data_directories() const
Definition PE/Binary.hpp:477
LIEF::PE::Binary::entrypoint
uint64_t entrypoint() const override
Return the binary's entrypoint (It is the same value as OptionalHeader::addressof_entrypoint.
Definition PE/Binary.hpp:690
LIEF::PE::Binary::verify_signature
Signature::VERIFICATION_FLAGS verify_signature(Signature::VERIFICATION_CHECKS checks=Signature::VERIFICATION_CHECKS::DEFAULT) const
Verify the binary against the embedded signature(s) (if any) First, it checks that the embedded signa...
LIEF::PE::Binary::find_exception_at
const ExceptionInfo * find_exception_at(uint32_t rva) const
Definition PE/Binary.hpp:837
LIEF::PE::Binary::get_import
const Import * get_import(const std::string &import_name) const
LIEF::PE::Binary::last_section_offset
uint64_t last_section_offset() const
LIEF::PE::Binary::delay_dir
const DataDirectory * delay_dir() const
Definition PE/Binary.hpp:802
LIEF::PE::Binary::find_coff_string
COFFString * find_coff_string(uint32_t offset)
Try to find the COFF string at the given offset in the COFF string table.
Definition PE/Binary.hpp:395
LIEF::PE::Binary::classof
static bool classof(const LIEF::Binary *bin)
Definition PE/Binary.hpp:866
LIEF::PE::Binary::get_section
const Section * get_section(const std::string &name) const
LIEF::PE::Binary::symbols
it_symbols symbols()
Return binary Symbols.
Definition PE/Binary.hpp:374
LIEF::PE::Binary::import_section
Section * import_section()
Definition PE/Binary.hpp:438
LIEF::PE::Binary::accept
void accept(Visitor &visitor) const override
Method so that a visitor can visit us.
LIEF::PE::Binary::functions
LIEF::Binary::functions_t functions() const
All functions found in the binary
LIEF::PE::Binary::exception_functions
LIEF::Binary::functions_t exception_functions() const
Functions found in the Exception table directory.
LIEF::PE::Binary::patch_address
void patch_address(uint64_t address, const std::vector< uint8_t > &patch_value, VA_TYPES addr_type=VA_TYPES::AUTO) override
Patch the content at virtual address address with patch_value.
LIEF::PE::Binary::section_from_offset
const Section * section_from_offset(uint64_t offset) const
LIEF::PE::Binary::compute_checksum
uint32_t compute_checksum() const
Re-compute the value of OptionalHeader::checksum. If both values do not match, it could mean that the...
LIEF::PE::Binary::write
std::unique_ptr< Builder > write(std::ostream &os, const Builder::config_t &config)
LIEF::PE::Binary::add_import
Import & add_import(const std::string &name)
Add an imported library (i.e. DLL) to the binary.
Definition PE/Binary.hpp:619
LIEF::PE::Binary::set_resources
ResourceNode * set_resources(std::unique_ptr< ResourceNode > root)
LIEF::PE::Binary::~Binary
~Binary() override
LIEF::PE::Binary::overlay
span< uint8_t > overlay()
Definition PE/Binary.hpp:528
LIEF::PE::Binary::overlay_offset
uint64_t overlay_offset() const
Return the original overlay offset.
Definition PE/Binary.hpp:533
LIEF::PE::Binary::get_delay_import
const DelayImport * get_delay_import(const std::string &import_name) const
LIEF::PE::Binary::section_from_rva
Section * section_from_rva(uint64_t virtual_address)
Find the section associated that encompasses the given RVA.
Definition PE/Binary.hpp:197
LIEF::PE::Binary::add_section
Section * add_section(const Section &section)
Add a section to the binary and return the section added.
LIEF::PE::Binary::import_section
const Section * import_section() const
Return the section associated with import table or a nullptr if the binary does not have an import ta...
LIEF::PE::Binary::get_export
const Export * get_export() const
Definition PE/Binary.hpp:367
LIEF::PE::Binary::type
PE_TYPE type() const
Return PE32 or PE32+
Definition PE/Binary.hpp:156
LIEF::PE::Binary::has_tls
bool has_tls() const
Check if the current binary has a TLS object.
Definition PE/Binary.hpp:266
LIEF::PE::Binary::set_export
Export & set_export(const Export &export_table)
LIEF::PE::Binary::data_directory
DataDirectory * data_directory(DataDirectory::TYPES type)
Return the DataDirectory with the given type (or index)
Definition PE/Binary.hpp:482
LIEF::PE::Binary::section_from_offset
Section * section_from_offset(uint64_t offset)
Find the section associated that encompasses the given offset.
Definition PE/Binary.hpp:189
LIEF::PE::Binary::has_exceptions
bool has_exceptions() const
Check if the current binary has exceptions.
Definition PE/Binary.hpp:300
LIEF::PE::Binary::delay_imports
it_delay_imports delay_imports()
Return an iterator over the binary's delay imports.
Definition PE/Binary.hpp:597
LIEF::PE::Binary::symbols
it_const_symbols symbols() const
Definition PE/Binary.hpp:378
LIEF::PE::Binary::rich_header
const RichHeader * rich_header() const
Definition PE/Binary.hpp:556
LIEF::PE::Binary::is_reproducible_build
bool is_reproducible_build() const
Check if the current binary is reproducible build, replacing timestamps by a compile hash.
LIEF::PE::Binary::write
std::unique_ptr< Builder > write(const std::string &filename, const Builder::config_t &config)
Reconstruct the binary object with the given configuration and write it in filename
LIEF::PE::Binary::debug_dir
DataDirectory * debug_dir()
Return the data directory associated with the debug table.
Definition PE/Binary.hpp:762
LIEF::PE::Binary::va_to_offset
uint64_t va_to_offset(uint64_t VA) const
Convert the absolute virtual address into an offset.
Definition PE/Binary.hpp:168
LIEF::PE::Binary::relocation_dir
const DataDirectory * relocation_dir() const
Definition PE/Binary.hpp:757
LIEF::PE::Binary::nested_pe_binary
Binary * nested_pe_binary()
Definition PE/Binary.hpp:862
LIEF::PE::Binary::dos_header
DosHeader & dos_header()
Return a reference to the PE::DosHeader object.
Definition PE/Binary.hpp:212
LIEF::PE::Binary::relocations
it_const_relocations relocations() const
Definition PE/Binary.hpp:462
LIEF::PE::Binary::section_from_rva
const Section * section_from_rva(uint64_t virtual_address) const
LIEF::PE::Binary::iat_dir
DataDirectory * iat_dir()
Return the data directory associated with the IAT.
Definition PE/Binary.hpp:789
LIEF::PE::Binary::cert_dir
DataDirectory * cert_dir()
Return the data directory associated with the certificate table (authenticode)
Definition PE/Binary.hpp:744
LIEF::PE::Binary::has_nx
bool has_nx() const override
Check if the binary uses NX protection.
Definition PE/Binary.hpp:700
LIEF::PE::Binary::dos_stub
span< const uint8_t > dos_stub() const
Return the DOS stub content.
Definition PE/Binary.hpp:538
LIEF::PE::Binary::header
Header & header()
Return a reference to the PE::Header object.
Definition PE/Binary.hpp:221
LIEF::PE::Binary::relocations
it_relocations relocations()
Return an iterator over the PE's Relocation.
Definition PE/Binary.hpp:458
LIEF::PE::Binary::imagebase
uint64_t imagebase() const override
Return binary's imagebase. 0 if not relevant.
Definition PE/Binary.hpp:182
LIEF::PE::Binary::has_configuration
bool has_configuration() const
Check if the current binary has a load configuration.
Definition PE/Binary.hpp:317
LIEF::PE::Binary::codeview_pdb
const CodeViewPDB * codeview_pdb() const
Return the CodeViewPDB object if present.
LIEF::PE::Binary::tls
const TLS * tls() const
Definition PE/Binary.hpp:258
LIEF::PE::Binary::resources
ResourceNode * resources()
Return resources as a tree or a nullptr if there is no resources.
Definition PE/Binary.hpp:409
LIEF::PE::Binary::set_resources
ResourceNode * set_resources(const ResourceNode &root)
Change or set the current resource tree with the new one provided in parameter.
LIEF::PE::Binary::has
bool has(DataDirectory::TYPES type) const
Check if the current binary has the given DataDirectory::TYPES.
Definition PE/Binary.hpp:488
LIEF::PE::Binary::load_configuration
LoadConfiguration * load_configuration()
Definition PE/Binary.hpp:519
LIEF::PE::Binary::sizeof_headers
uint32_t sizeof_headers() const
Compute the size of all the headers.
LIEF::PE::Binary::remove_debug
bool remove_debug(const Debug &entry)
Remove a specific debug entry.
LIEF::PE::Binary::load_config_dir
DataDirectory * load_config_dir()
Return the data directory associated with the load config.
Definition PE/Binary.hpp:780
LIEF::PE::Binary::nested_pe_binary
const Binary * nested_pe_binary() const
If the current binary contains dynamic relocations (e.g. LIEF::PE::DynamicFixupARM64X),...
Definition PE/Binary.hpp:858
LIEF::PE::Binary::get_import
Import * get_import(const std::string &import_name)
Return the Import matching the provided name (case sensitive)
Definition PE/Binary.hpp:580
LIEF::PE::Binary::write
std::unique_ptr< Builder > write(const std::string &filename)
Reconstruct the binary object and write the raw PE in filename
Definition PE/Binary.hpp:635
LIEF::PE::Binary::coff_string_table
it_strings_table coff_string_table()
Definition PE/Binary.hpp:387
LIEF::PE::Binary::signatures
it_const_signatures signatures() const
Return an iterator over the Signature object(s) if the binary is signed.
Definition PE/Binary.hpp:328
LIEF::PE::Binary::debug
it_debug_entries debug()
Return an iterator over the Debug entries.
Definition PE/Binary.hpp:493
LIEF::PE::Binary::sections
it_const_sections sections() const
Definition PE/Binary.hpp:207
LIEF::PE::Binary::coff_string_table
it_const_strings_table coff_string_table() const
Iterator over the strings located in the COFF string table.
Definition PE/Binary.hpp:383
LIEF::PE::Binary::has_delay_import
bool has_delay_import(const std::string &import_name) const
True if the binary delay-imports the given library name
Definition PE/Binary.hpp:614
LIEF::PE::Binary::has_imports
bool has_imports() const
Check if the current binary contains imports.
Definition PE/Binary.hpp:276
LIEF::PE::Binary::find_exception_at
ExceptionInfo * find_exception_at(uint32_t rva)
Try to find the exception info at the given RVA.
LIEF::PE::Binary::remove
void remove(const Section &section, bool clear=false)
Remove the given section.
LIEF::PE::Binary::header
const Header & header() const
Definition PE/Binary.hpp:225
LIEF::PE::Binary::cert_dir
const DataDirectory * cert_dir() const
Definition PE/Binary.hpp:748
LIEF::PE::Binary::data_directories
it_data_directories data_directories()
Return an iterator over the DataDirectory present in the Binary.
Definition PE/Binary.hpp:473
LIEF::PE::Binary::sections
it_sections sections()
Return an iterator over the PE's Section.
Definition PE/Binary.hpp:203
LIEF::PE::Binary::remove_all_imports
void remove_all_imports()
Remove all libraries in the binary.
Definition PE/Binary.hpp:630
LIEF::PE::Binary::get_export
Export * get_export()
Return the Export object.
Definition PE/Binary.hpp:363
LIEF::PE::Binary::dos_stub
span< uint8_t > dos_stub()
Definition PE/Binary.hpp:542
LIEF::PE::Binary::has_import
bool has_import(const std::string &import_name) const
True if the binary imports the given library name
Definition PE/Binary.hpp:587
LIEF::PE::Binary::import_dir
DataDirectory * import_dir()
Return the data directory associated with the import table.
Definition PE/Binary.hpp:716
LIEF::PE::Binary::add_relocation
Relocation & add_relocation(const Relocation &relocation)
Add a new PE Relocation.
LIEF::PE::Binary::get_section
Section * get_section(const std::string &name)
Return binary's section from its name. If the secion can't be found, return a nullptr.
Definition PE/Binary.hpp:430
LIEF::PE::Binary::rich_header
RichHeader * rich_header()
Return a reference to the RichHeader object.
Definition PE/Binary.hpp:552
LIEF::PE::Binary::dos_header
const DosHeader & dos_header() const
Definition PE/Binary.hpp:216
LIEF::PE::CodeViewPDB
CodeView PDB specialization.
Definition CodeViewPDB.hpp:35
LIEF::PE::Debug
This class represents a generic entry in the debug data directory. For known types,...
Definition debug/Debug.hpp:40
LIEF::PE::ExceptionInfo
This class is the base class for any exception or runtime function entry.
Definition ExceptionInfo.hpp:33
LIEF::PE::Export
Class which represents a PE Export.
Definition Export.hpp:38
LIEF::PE::Factory
This factory is used to create PE from scratch.
Definition Factory.hpp:30
LIEF::PE::LoadConfiguration
This class represents the load configuration data associated with the IMAGE_LOAD_CONFIG_DIRECTORY.
Definition LoadConfiguration.hpp:46
LIEF::PE::Parser
Main interface to parse PE binaries. In particular the static functions: Parser::parse should be used...
Definition PE/Parser.hpp:52
LIEF::PE::Relocation
Class which represents the Base Relocation Block We usually find this structure in the ....
Definition PE/Relocation.hpp:42
LIEF::PE::ResourceData
Class which represents a Data Node in the PE resources tree.
Definition ResourceData.hpp:33
LIEF::PE::ResourceDirectory
Definition ResourceDirectory.hpp:33
LIEF::PE::ResourceNode
Class which represents a Node in the resource tree.
Definition ResourceNode.hpp:45
LIEF::PE::RichHeader
Class which represents the not-so-documented rich header.
Definition RichHeader.hpp:37
LIEF::PE::TLS
Class which represents the PE Thread Local Storage.
Definition TLS.hpp:43
LIEF::PE
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
LIEF::PE::PE_TYPE
PE_TYPE
Definition PE/enums.hpp:22
LIEF
LIEF namespace.
Definition Abstract/Binary.hpp:36
visibility.h
LIEF_API
#define LIEF_API
Definition visibility.h:41
LIEF_LOCAL
#define LIEF_LOCAL
Definition visibility.h:42