LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
Visitor.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_VISITOR_H
17#define LIEF_VISITOR_H
18#include <set>
19#include <utility>
20#include <cstddef>
21
22#include "LIEF/visibility.h"
24
25
26namespace LIEF {
27// Forward declarations
28// ====================
29class Object;
36
37// PE
38// ===============================
40LIEF_PE_FORWARD(DelayImport)
41LIEF_PE_FORWARD(DelayImportEntry)
42LIEF_PE_FORWARD(DosHeader)
44LIEF_PE_FORWARD(OptionalHeader)
45LIEF_PE_FORWARD(RichHeader)
46LIEF_PE_FORWARD(RichEntry)
47LIEF_PE_FORWARD(DataDirectory)
50LIEF_PE_FORWARD(RelocationEntry)
51LIEF_PE_FORWARD(Export)
52LIEF_PE_FORWARD(ExportEntry)
55LIEF_PE_FORWARD(Debug)
56LIEF_PE_FORWARD(CodeView)
57LIEF_PE_FORWARD(CodeViewPDB)
58LIEF_PE_FORWARD(Import)
59LIEF_PE_FORWARD(ImportEntry)
60LIEF_PE_FORWARD(ResourceNode)
61LIEF_PE_FORWARD(ResourceData)
62LIEF_PE_FORWARD(ResourceDirectory)
63LIEF_PE_FORWARD(ResourcesManager)
64LIEF_PE_FORWARD(ResourceVersion)
65LIEF_PE_FORWARD(ResourceStringFileInfo)
66LIEF_PE_FORWARD(ResourceVarFileInfo)
67LIEF_PE_FORWARD(ResourceIcon)
68LIEF_PE_FORWARD(ResourceDialogExtended)
69LIEF_PE_FORWARD(ResourceDialogRegular)
70LIEF_PE_FORWARD(ResourceStringTable)
71LIEF_PE_FORWARD(ResourceAccelerator)
72
73LIEF_PE_FORWARD(Signature)
75LIEF_PE_FORWARD(SignerInfo)
76LIEF_PE_FORWARD(ContentInfo)
77LIEF_PE_FORWARD(GenericContent)
78LIEF_PE_FORWARD(SpcIndirectData)
79LIEF_PE_FORWARD(Attribute)
80LIEF_PE_FORWARD(ContentType)
81LIEF_PE_FORWARD(GenericType)
82LIEF_PE_FORWARD(MsCounterSign)
83LIEF_PE_FORWARD(MsSpcNestedSignature)
84LIEF_PE_FORWARD(MsSpcStatementType)
85LIEF_PE_FORWARD(MsManifestBinaryID)
86LIEF_PE_FORWARD(PKCS9AtSequenceNumber)
87LIEF_PE_FORWARD(PKCS9CounterSignature)
88LIEF_PE_FORWARD(PKCS9MessageDigest)
89LIEF_PE_FORWARD(PKCS9SigningTime)
90LIEF_PE_FORWARD(SpcSpOpusInfo)
91LIEF_PE_FORWARD(SigningCertificateV2)
92LIEF_PE_FORWARD(SpcRelaxedPeMarkerCheck)
93
94LIEF_PE_FORWARD(CodeIntegrity)
95LIEF_PE_FORWARD(LoadConfiguration)
97LIEF_PE_FORWARD(PogoEntry)
98LIEF_PE_FORWARD(Repro)
99
100// ELF
101// ==================================
105LIEF_ELF_FORWARD(Segment)
106LIEF_ELF_FORWARD(DynamicEntry)
107LIEF_ELF_FORWARD(DynamicEntryArray)
108LIEF_ELF_FORWARD(DynamicEntryLibrary)
109LIEF_ELF_FORWARD(DynamicSharedObject)
110LIEF_ELF_FORWARD(DynamicEntryRunPath)
111LIEF_ELF_FORWARD(DynamicEntryRpath)
112LIEF_ELF_FORWARD(DynamicEntryFlags)
115LIEF_ELF_FORWARD(SymbolVersion)
116LIEF_ELF_FORWARD(SymbolVersionRequirement)
117LIEF_ELF_FORWARD(SymbolVersionDefinition)
118LIEF_ELF_FORWARD(SymbolVersionAux)
119LIEF_ELF_FORWARD(SymbolVersionAuxRequirement)
121LIEF_ELF_FORWARD(AndroidIdent)
122LIEF_ELF_FORWARD(QNXStack)
123LIEF_ELF_FORWARD(NoteAbi)
124LIEF_ELF_FORWARD(NoteGnuProperty)
125LIEF_ELF_FORWARD(CorePrPsInfo)
126LIEF_ELF_FORWARD(CorePrStatus)
127LIEF_ELF_FORWARD(CoreAuxv)
128LIEF_ELF_FORWARD(CoreSigInfo)
129LIEF_ELF_FORWARD(CoreFile)
130LIEF_ELF_FORWARD(GnuHash)
131LIEF_ELF_FORWARD(SysvHash)
132
133
134// MACHO
135// ===============================
138LIEF_MACHO_FORWARD(LoadCommand)
139LIEF_MACHO_FORWARD(UUIDCommand)
140LIEF_MACHO_FORWARD(SymbolCommand)
141LIEF_MACHO_FORWARD(SegmentCommand)
143LIEF_MACHO_FORWARD(MainCommand)
144LIEF_MACHO_FORWARD(DynamicSymbolCommand)
145LIEF_MACHO_FORWARD(DylinkerCommand)
146LIEF_MACHO_FORWARD(DylibCommand)
147LIEF_MACHO_FORWARD(ThreadCommand)
148LIEF_MACHO_FORWARD(RPathCommand)
151LIEF_MACHO_FORWARD(RelocationObject)
152LIEF_MACHO_FORWARD(RelocationDyld)
153LIEF_MACHO_FORWARD(RelocationFixup)
154LIEF_MACHO_FORWARD(BindingInfo)
155LIEF_MACHO_FORWARD(DyldBindingInfo)
156LIEF_MACHO_FORWARD(DyldExportsTrie)
157LIEF_MACHO_FORWARD(ChainedBindingInfo)
158LIEF_MACHO_FORWARD(ExportInfo)
159LIEF_MACHO_FORWARD(FunctionStarts)
160LIEF_MACHO_FORWARD(CodeSignature)
161LIEF_MACHO_FORWARD(DataInCode)
162LIEF_MACHO_FORWARD(DataCodeEntry)
163LIEF_MACHO_FORWARD(SourceVersion)
164LIEF_MACHO_FORWARD(VersionMin)
165LIEF_MACHO_FORWARD(SegmentSplitInfo)
166LIEF_MACHO_FORWARD(SubFramework)
167LIEF_MACHO_FORWARD(Routine)
168LIEF_MACHO_FORWARD(DyldEnvironment)
169LIEF_MACHO_FORWARD(EncryptionInfo)
170LIEF_MACHO_FORWARD(BuildVersion)
171LIEF_MACHO_FORWARD(BuildToolVersion)
172LIEF_MACHO_FORWARD(FilesetCommand)
173LIEF_MACHO_FORWARD(TwoLevelHints)
174LIEF_MACHO_FORWARD(CodeSignatureDir)
175LIEF_MACHO_FORWARD(LinkerOptHint)
176LIEF_MACHO_FORWARD(UnknownCommand)
177
178// OAT
179// ===============================
182LIEF_OAT_FORWARD(DexFile)
183LIEF_OAT_FORWARD(Method)
184LIEF_OAT_FORWARD(Class)
185
186// DEX
187// ===============================
189LIEF_DEX_FORWARD(Field)
190LIEF_DEX_FORWARD(Method)
192LIEF_DEX_FORWARD(Class)
193LIEF_DEX_FORWARD(CodeInfo)
195LIEF_DEX_FORWARD(Prototype)
196LIEF_DEX_FORWARD(MapItem)
197LIEF_DEX_FORWARD(MapList)
198
199// VDEX
200// ===============================
203
204// ART
205// ===============================
208
209
211 public:
213 virtual ~Visitor();
214
215 virtual void operator()();
216
217 template<typename Arg1, typename... Args>
218 void operator()(Arg1&& arg1, Args&&... args);
219
220 virtual void visit(const Object&);
221
222 // Abstract Part
223 // =============
227
228
242
247 LIEF_ELF_VISITABLE(DynamicEntry)
248 LIEF_ELF_VISITABLE(DynamicEntryArray)
249 LIEF_ELF_VISITABLE(DynamicEntryLibrary)
250 LIEF_ELF_VISITABLE(DynamicSharedObject)
251 LIEF_ELF_VISITABLE(DynamicEntryRunPath)
252 LIEF_ELF_VISITABLE(DynamicEntryRpath)
253 LIEF_ELF_VISITABLE(DynamicEntryFlags)
256 LIEF_ELF_VISITABLE(SymbolVersion)
257 LIEF_ELF_VISITABLE(SymbolVersionRequirement)
258 LIEF_ELF_VISITABLE(SymbolVersionDefinition)
259 LIEF_ELF_VISITABLE(SymbolVersionAux)
260 LIEF_ELF_VISITABLE(SymbolVersionAuxRequirement)
262 LIEF_ELF_VISITABLE(AndroidIdent)
265 LIEF_ELF_VISITABLE(NoteGnuProperty)
266 LIEF_ELF_VISITABLE(CorePrPsInfo)
267 LIEF_ELF_VISITABLE(CorePrStatus)
273
274 // PE Part
275 // ======= LIEF_PE_VISITABLE(Binary)
278 LIEF_PE_VISITABLE(DosHeader)
281 LIEF_PE_VISITABLE(RichHeader)
284 LIEF_PE_VISITABLE(RichEntry)
290 LIEF_PE_VISITABLE(OptionalHeader)
293 LIEF_PE_VISITABLE(DataDirectory)
308 LIEF_PE_VISITABLE(RelocationEntry)
311 LIEF_PE_VISITABLE(Export)
314 LIEF_PE_VISITABLE(ExportEntry)
317 LIEF_PE_VISITABLE(Debug)
320 LIEF_PE_VISITABLE(CodeView)
323 LIEF_PE_VISITABLE(CodeViewPDB)
326 LIEF_PE_VISITABLE(Import)
329 LIEF_PE_VISITABLE(ImportEntry)
332 LIEF_PE_VISITABLE(DelayImport)
335 LIEF_PE_VISITABLE(DelayImportEntry)
338 LIEF_PE_VISITABLE(ResourceNode)
341 LIEF_PE_VISITABLE(ResourceData)
344 LIEF_PE_VISITABLE(ResourceDirectory)
347 LIEF_PE_VISITABLE(ResourcesManager)
350 LIEF_PE_VISITABLE(ResourceVersion)
353 LIEF_PE_VISITABLE(ResourceStringFileInfo)
356 LIEF_PE_VISITABLE(ResourceVarFileInfo)
359 LIEF_PE_VISITABLE(ResourceStringTable)
362 LIEF_PE_VISITABLE(ResourceAccelerator)
365 LIEF_PE_VISITABLE(ResourceIcon)
368 LIEF_PE_VISITABLE(ResourceDialogExtended)
371 LIEF_PE_VISITABLE(ResourceDialogRegular)
374 LIEF_PE_VISITABLE(Signature)
380 LIEF_PE_VISITABLE(SignerInfo)
383 LIEF_PE_VISITABLE(ContentInfo)
386 LIEF_PE_VISITABLE(Attribute)
389 LIEF_PE_VISITABLE(ContentType)
392 LIEF_PE_VISITABLE(GenericContent)
395 LIEF_PE_VISITABLE(SpcIndirectData)
398 LIEF_PE_VISITABLE(GenericType)
401 LIEF_PE_VISITABLE(MsCounterSign)
404 LIEF_PE_VISITABLE(MsManifestBinaryID)
407 LIEF_PE_VISITABLE(MsSpcNestedSignature)
410 LIEF_PE_VISITABLE(MsSpcStatementType)
413 LIEF_PE_VISITABLE(PKCS9AtSequenceNumber)
416 LIEF_PE_VISITABLE(PKCS9CounterSignature)
419 LIEF_PE_VISITABLE(PKCS9MessageDigest)
422 LIEF_PE_VISITABLE(PKCS9SigningTime)
425 LIEF_PE_VISITABLE(SpcSpOpusInfo)
428 LIEF_PE_VISITABLE(SpcRelaxedPeMarkerCheck)
431 LIEF_PE_VISITABLE(SigningCertificateV2)
434 LIEF_PE_VISITABLE(LoadConfiguration)
437 LIEF_PE_VISITABLE(CodeIntegrity)
443 LIEF_PE_VISITABLE(PogoEntry)
446 LIEF_PE_VISITABLE(Repro)
449
450 // MachO part
451 // ========== LIEF_MACHO_VISITABLE(Binary)
457 LIEF_MACHO_VISITABLE(LoadCommand)
460 LIEF_MACHO_VISITABLE(UUIDCommand)
463 LIEF_MACHO_VISITABLE(SymbolCommand)
466 LIEF_MACHO_VISITABLE(SegmentCommand)
472 LIEF_MACHO_VISITABLE(MainCommand)
475 LIEF_MACHO_VISITABLE(DynamicSymbolCommand)
478 LIEF_MACHO_VISITABLE(DylinkerCommand)
481 LIEF_MACHO_VISITABLE(DylibCommand)
484 LIEF_MACHO_VISITABLE(ThreadCommand)
487 LIEF_MACHO_VISITABLE(RPathCommand)
496 LIEF_MACHO_VISITABLE(RelocationObject)
499 LIEF_MACHO_VISITABLE(RelocationDyld)
502 LIEF_MACHO_VISITABLE(RelocationFixup)
505 LIEF_MACHO_VISITABLE(BindingInfo)
508 LIEF_MACHO_VISITABLE(DyldBindingInfo)
511 LIEF_MACHO_VISITABLE(ChainedBindingInfo)
514 LIEF_MACHO_VISITABLE(DyldExportsTrie)
517 LIEF_MACHO_VISITABLE(ExportInfo)
520 LIEF_MACHO_VISITABLE(FunctionStarts)
523 LIEF_MACHO_VISITABLE(CodeSignature)
526 LIEF_MACHO_VISITABLE(DataInCode)
529 LIEF_MACHO_VISITABLE(DataCodeEntry)
532 LIEF_MACHO_VISITABLE(SourceVersion)
535 LIEF_MACHO_VISITABLE(VersionMin)
538 LIEF_MACHO_VISITABLE(SegmentSplitInfo)
541 LIEF_MACHO_VISITABLE(SubFramework)
544 LIEF_MACHO_VISITABLE(Routine)
547 LIEF_MACHO_VISITABLE(DyldEnvironment)
550 LIEF_MACHO_VISITABLE(EncryptionInfo)
553 LIEF_MACHO_VISITABLE(BuildVersion)
556 LIEF_MACHO_VISITABLE(BuildToolVersion)
559 LIEF_MACHO_VISITABLE(FilesetCommand)
562 LIEF_MACHO_VISITABLE(CodeSignatureDir)
565 LIEF_MACHO_VISITABLE(TwoLevelHints)
568 LIEF_MACHO_VISITABLE(LinkerOptHint)
571 LIEF_MACHO_VISITABLE(UnknownCommand)
574
575 // OAT part
576 // ========
583 LIEF_OAT_VISITABLE(DexFile)
586 LIEF_OAT_VISITABLE(Class)
589 LIEF_OAT_VISITABLE(Method)
592
593
594 // DEX part
595 // ========
599 LIEF_DEX_VISITABLE(Field)
602 LIEF_DEX_VISITABLE(Method)
608 LIEF_DEX_VISITABLE(Class)
611 LIEF_DEX_VISITABLE(CodeInfo)
617 LIEF_DEX_VISITABLE(Prototype)
620 LIEF_DEX_VISITABLE(MapList)
623 LIEF_DEX_VISITABLE(MapItem)
626
627 // VDEX part
628 // =========
635
636 // ART part
637 // =========
644
645 template<class T>
646 void dispatch(const T& obj);
647
648
649 private:
650 std::set<size_t> visited_;
651};
652
653
654
655template<typename Arg1, typename... Args>
656void Visitor::operator()(Arg1&& arg1, Args&&... args) {
657 dispatch(std::forward<Arg1>(arg1));
658 operator()(std::forward<Args>(args)... );
659}
660
661template<class T>
662void Visitor::dispatch(const T& obj) {
663 auto hash = reinterpret_cast<size_t>(&obj);
664 if (visited_.find(hash) != std::end(visited_)) {
665 // Already visited
666 return;
667 }
668
669 visited_.insert(hash);
670 visit(obj);
671}
672
673}
674#endif
Abstract binary that exposes an uniform API for the different executable file formats.
Definition Abstract/Binary.hpp:49
Class that represents a function in the binary.
Definition Abstract/Function.hpp:29
Definition Abstract/Header.hpp:40
Definition Object.hpp:25
Class which represents an abstracted Relocation.
Definition Abstract/Relocation.hpp:27
Class which represents an abstracted section.
Definition Abstract/Section.hpp:29
This class represents a symbol in an executable format.
Definition Abstract/Symbol.hpp:28
Definition Visitor.hpp:210
virtual void operator()()
virtual ~Visitor()
virtual void visit(const Object &)
void dispatch(const T &obj)
Definition Visitor.hpp:662
LIEF namespace.
Definition Abstract/Binary.hpp:36
Hash::value_type hash(const Object &v)
#define LIEF_API
Definition visibility.h:41
#define LIEF_ABSTRACT_FORWARD(OBJ)
Definition visitor_macros.hpp:126
#define LIEF_VDEX_FORWARD(OBJ)
Definition visitor_macros.hpp:98
#define LIEF_MACHO_VISITABLE(OBJ)
Definition visitor_macros.hpp:57
#define LIEF_ART_FORWARD(OBJ)
Definition visitor_macros.hpp:113
#define LIEF_ABSTRACT_VISITABLE(OBJ)
Definition visitor_macros.hpp:129
#define LIEF_DEX_VISITABLE(OBJ)
Definition visitor_macros.hpp:87
#define LIEF_OAT_FORWARD(OBJ)
Definition visitor_macros.hpp:68
#define LIEF_PE_VISITABLE(OBJ)
Definition visitor_macros.hpp:28
#define LIEF_VDEX_VISITABLE(OBJ)
Definition visitor_macros.hpp:102
#define LIEF_DEX_FORWARD(OBJ)
Definition visitor_macros.hpp:83
#define LIEF_MACHO_FORWARD(OBJ)
Definition visitor_macros.hpp:53
#define LIEF_ART_VISITABLE(OBJ)
Definition visitor_macros.hpp:117
#define LIEF_ELF_VISITABLE(OBJ)
Definition visitor_macros.hpp:43
#define LIEF_PE_FORWARD(OBJ)
Definition visitor_macros.hpp:23
#define LIEF_OAT_VISITABLE(OBJ)
Definition visitor_macros.hpp:72
#define LIEF_ELF_FORWARD(OBJ)
Definition visitor_macros.hpp:39