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)
54LIEF_PE_FORWARD(Debug)
55LIEF_PE_FORWARD(CodeView)
56LIEF_PE_FORWARD(CodeViewPDB)
57LIEF_PE_FORWARD(Import)
58LIEF_PE_FORWARD(ImportEntry)
59LIEF_PE_FORWARD(ResourceNode)
60LIEF_PE_FORWARD(ResourceData)
61LIEF_PE_FORWARD(ResourceDirectory)
62LIEF_PE_FORWARD(ResourcesManager)
63LIEF_PE_FORWARD(ResourceVersion)
64LIEF_PE_FORWARD(ResourceStringFileInfo)
65LIEF_PE_FORWARD(ResourceVarFileInfo)
66LIEF_PE_FORWARD(ResourceIcon)
67LIEF_PE_FORWARD(ResourceDialogExtended)
68LIEF_PE_FORWARD(ResourceDialogRegular)
69LIEF_PE_FORWARD(ResourceStringTable)
70LIEF_PE_FORWARD(ResourceAccelerator)
71
72LIEF_PE_FORWARD(Signature)
74LIEF_PE_FORWARD(SignerInfo)
75LIEF_PE_FORWARD(ContentInfo)
76LIEF_PE_FORWARD(GenericContent)
77LIEF_PE_FORWARD(SpcIndirectData)
78LIEF_PE_FORWARD(Attribute)
79LIEF_PE_FORWARD(ContentType)
80LIEF_PE_FORWARD(GenericType)
81LIEF_PE_FORWARD(MsCounterSign)
82LIEF_PE_FORWARD(MsSpcNestedSignature)
83LIEF_PE_FORWARD(MsSpcStatementType)
84LIEF_PE_FORWARD(MsManifestBinaryID)
85LIEF_PE_FORWARD(PKCS9AtSequenceNumber)
86LIEF_PE_FORWARD(PKCS9CounterSignature)
87LIEF_PE_FORWARD(PKCS9MessageDigest)
88LIEF_PE_FORWARD(PKCS9SigningTime)
89LIEF_PE_FORWARD(SpcSpOpusInfo)
90LIEF_PE_FORWARD(SigningCertificateV2)
91LIEF_PE_FORWARD(SpcRelaxedPeMarkerCheck)
92
93LIEF_PE_FORWARD(CodeIntegrity)
94LIEF_PE_FORWARD(LoadConfiguration)
96LIEF_PE_FORWARD(PogoEntry)
97LIEF_PE_FORWARD(Repro)
98
99// ELF
100// ==================================
104LIEF_ELF_FORWARD(Segment)
105LIEF_ELF_FORWARD(DynamicEntry)
106LIEF_ELF_FORWARD(DynamicEntryArray)
107LIEF_ELF_FORWARD(DynamicEntryLibrary)
108LIEF_ELF_FORWARD(DynamicSharedObject)
109LIEF_ELF_FORWARD(DynamicEntryRunPath)
110LIEF_ELF_FORWARD(DynamicEntryRpath)
111LIEF_ELF_FORWARD(DynamicEntryFlags)
114LIEF_ELF_FORWARD(SymbolVersion)
115LIEF_ELF_FORWARD(SymbolVersionRequirement)
116LIEF_ELF_FORWARD(SymbolVersionDefinition)
117LIEF_ELF_FORWARD(SymbolVersionAux)
118LIEF_ELF_FORWARD(SymbolVersionAuxRequirement)
120LIEF_ELF_FORWARD(AndroidIdent)
121LIEF_ELF_FORWARD(QNXStack)
122LIEF_ELF_FORWARD(NoteAbi)
123LIEF_ELF_FORWARD(NoteGnuProperty)
124LIEF_ELF_FORWARD(CorePrPsInfo)
125LIEF_ELF_FORWARD(CorePrStatus)
126LIEF_ELF_FORWARD(CoreAuxv)
127LIEF_ELF_FORWARD(CoreSigInfo)
128LIEF_ELF_FORWARD(CoreFile)
129LIEF_ELF_FORWARD(GnuHash)
130LIEF_ELF_FORWARD(SysvHash)
131
132
133// MACHO
134// ===============================
137LIEF_MACHO_FORWARD(LoadCommand)
138LIEF_MACHO_FORWARD(UUIDCommand)
139LIEF_MACHO_FORWARD(SymbolCommand)
140LIEF_MACHO_FORWARD(SegmentCommand)
142LIEF_MACHO_FORWARD(MainCommand)
143LIEF_MACHO_FORWARD(DynamicSymbolCommand)
144LIEF_MACHO_FORWARD(DylinkerCommand)
145LIEF_MACHO_FORWARD(DylibCommand)
146LIEF_MACHO_FORWARD(ThreadCommand)
147LIEF_MACHO_FORWARD(RPathCommand)
150LIEF_MACHO_FORWARD(RelocationObject)
151LIEF_MACHO_FORWARD(RelocationDyld)
152LIEF_MACHO_FORWARD(RelocationFixup)
153LIEF_MACHO_FORWARD(BindingInfo)
154LIEF_MACHO_FORWARD(DyldBindingInfo)
155LIEF_MACHO_FORWARD(DyldExportsTrie)
156LIEF_MACHO_FORWARD(ChainedBindingInfo)
157LIEF_MACHO_FORWARD(ExportInfo)
158LIEF_MACHO_FORWARD(FunctionStarts)
159LIEF_MACHO_FORWARD(CodeSignature)
160LIEF_MACHO_FORWARD(DataInCode)
161LIEF_MACHO_FORWARD(DataCodeEntry)
162LIEF_MACHO_FORWARD(SourceVersion)
163LIEF_MACHO_FORWARD(VersionMin)
164LIEF_MACHO_FORWARD(SegmentSplitInfo)
165LIEF_MACHO_FORWARD(SubFramework)
166LIEF_MACHO_FORWARD(Routine)
167LIEF_MACHO_FORWARD(DyldEnvironment)
168LIEF_MACHO_FORWARD(EncryptionInfo)
169LIEF_MACHO_FORWARD(BuildVersion)
170LIEF_MACHO_FORWARD(BuildToolVersion)
171LIEF_MACHO_FORWARD(FilesetCommand)
172LIEF_MACHO_FORWARD(TwoLevelHints)
173LIEF_MACHO_FORWARD(CodeSignatureDir)
174LIEF_MACHO_FORWARD(LinkerOptHint)
175LIEF_MACHO_FORWARD(UnknownCommand)
176
177// OAT
178// ===============================
181LIEF_OAT_FORWARD(DexFile)
182LIEF_OAT_FORWARD(Method)
183LIEF_OAT_FORWARD(Class)
184
185// DEX
186// ===============================
188LIEF_DEX_FORWARD(Field)
189LIEF_DEX_FORWARD(Method)
191LIEF_DEX_FORWARD(Class)
192LIEF_DEX_FORWARD(CodeInfo)
194LIEF_DEX_FORWARD(Prototype)
195LIEF_DEX_FORWARD(MapItem)
196LIEF_DEX_FORWARD(MapList)
197
198// VDEX
199// ===============================
202
203// ART
204// ===============================
207
208
210 public:
212 virtual ~Visitor();
213
214 virtual void operator()();
215
216 template<typename Arg1, typename... Args>
217 void operator()(Arg1&& arg1, Args&&... args);
218
219 virtual void visit(const Object&);
220
221 // Abstract Part
222 // =============
226
227
241
246 LIEF_ELF_VISITABLE(DynamicEntry)
247 LIEF_ELF_VISITABLE(DynamicEntryArray)
248 LIEF_ELF_VISITABLE(DynamicEntryLibrary)
249 LIEF_ELF_VISITABLE(DynamicSharedObject)
250 LIEF_ELF_VISITABLE(DynamicEntryRunPath)
251 LIEF_ELF_VISITABLE(DynamicEntryRpath)
252 LIEF_ELF_VISITABLE(DynamicEntryFlags)
255 LIEF_ELF_VISITABLE(SymbolVersion)
256 LIEF_ELF_VISITABLE(SymbolVersionRequirement)
257 LIEF_ELF_VISITABLE(SymbolVersionDefinition)
258 LIEF_ELF_VISITABLE(SymbolVersionAux)
259 LIEF_ELF_VISITABLE(SymbolVersionAuxRequirement)
261 LIEF_ELF_VISITABLE(AndroidIdent)
264 LIEF_ELF_VISITABLE(NoteGnuProperty)
265 LIEF_ELF_VISITABLE(CorePrPsInfo)
266 LIEF_ELF_VISITABLE(CorePrStatus)
272
273 // PE Part
274 // ======= LIEF_PE_VISITABLE(Binary)
277 LIEF_PE_VISITABLE(DosHeader)
280 LIEF_PE_VISITABLE(RichHeader)
283 LIEF_PE_VISITABLE(RichEntry)
289 LIEF_PE_VISITABLE(OptionalHeader)
292 LIEF_PE_VISITABLE(DataDirectory)
304 LIEF_PE_VISITABLE(RelocationEntry)
307 LIEF_PE_VISITABLE(Export)
310 LIEF_PE_VISITABLE(ExportEntry)
313 LIEF_PE_VISITABLE(Debug)
316 LIEF_PE_VISITABLE(CodeView)
319 LIEF_PE_VISITABLE(CodeViewPDB)
322 LIEF_PE_VISITABLE(Import)
325 LIEF_PE_VISITABLE(ImportEntry)
328 LIEF_PE_VISITABLE(DelayImport)
331 LIEF_PE_VISITABLE(DelayImportEntry)
334 LIEF_PE_VISITABLE(ResourceNode)
337 LIEF_PE_VISITABLE(ResourceData)
340 LIEF_PE_VISITABLE(ResourceDirectory)
343 LIEF_PE_VISITABLE(ResourcesManager)
346 LIEF_PE_VISITABLE(ResourceVersion)
349 LIEF_PE_VISITABLE(ResourceStringFileInfo)
352 LIEF_PE_VISITABLE(ResourceVarFileInfo)
355 LIEF_PE_VISITABLE(ResourceStringTable)
358 LIEF_PE_VISITABLE(ResourceAccelerator)
361 LIEF_PE_VISITABLE(ResourceIcon)
364 LIEF_PE_VISITABLE(ResourceDialogExtended)
367 LIEF_PE_VISITABLE(ResourceDialogRegular)
370 LIEF_PE_VISITABLE(Signature)
376 LIEF_PE_VISITABLE(SignerInfo)
379 LIEF_PE_VISITABLE(ContentInfo)
382 LIEF_PE_VISITABLE(Attribute)
385 LIEF_PE_VISITABLE(ContentType)
388 LIEF_PE_VISITABLE(GenericContent)
391 LIEF_PE_VISITABLE(SpcIndirectData)
394 LIEF_PE_VISITABLE(GenericType)
397 LIEF_PE_VISITABLE(MsCounterSign)
400 LIEF_PE_VISITABLE(MsManifestBinaryID)
403 LIEF_PE_VISITABLE(MsSpcNestedSignature)
406 LIEF_PE_VISITABLE(MsSpcStatementType)
409 LIEF_PE_VISITABLE(PKCS9AtSequenceNumber)
412 LIEF_PE_VISITABLE(PKCS9CounterSignature)
415 LIEF_PE_VISITABLE(PKCS9MessageDigest)
418 LIEF_PE_VISITABLE(PKCS9SigningTime)
421 LIEF_PE_VISITABLE(SpcSpOpusInfo)
424 LIEF_PE_VISITABLE(SpcRelaxedPeMarkerCheck)
427 LIEF_PE_VISITABLE(SigningCertificateV2)
430 LIEF_PE_VISITABLE(LoadConfiguration)
433 LIEF_PE_VISITABLE(CodeIntegrity)
439 LIEF_PE_VISITABLE(PogoEntry)
442 LIEF_PE_VISITABLE(Repro)
445
446 // MachO part
447 // ========== LIEF_MACHO_VISITABLE(Binary)
453 LIEF_MACHO_VISITABLE(LoadCommand)
456 LIEF_MACHO_VISITABLE(UUIDCommand)
459 LIEF_MACHO_VISITABLE(SymbolCommand)
462 LIEF_MACHO_VISITABLE(SegmentCommand)
468 LIEF_MACHO_VISITABLE(MainCommand)
471 LIEF_MACHO_VISITABLE(DynamicSymbolCommand)
474 LIEF_MACHO_VISITABLE(DylinkerCommand)
477 LIEF_MACHO_VISITABLE(DylibCommand)
480 LIEF_MACHO_VISITABLE(ThreadCommand)
483 LIEF_MACHO_VISITABLE(RPathCommand)
492 LIEF_MACHO_VISITABLE(RelocationObject)
495 LIEF_MACHO_VISITABLE(RelocationDyld)
498 LIEF_MACHO_VISITABLE(RelocationFixup)
501 LIEF_MACHO_VISITABLE(BindingInfo)
504 LIEF_MACHO_VISITABLE(DyldBindingInfo)
507 LIEF_MACHO_VISITABLE(ChainedBindingInfo)
510 LIEF_MACHO_VISITABLE(DyldExportsTrie)
513 LIEF_MACHO_VISITABLE(ExportInfo)
516 LIEF_MACHO_VISITABLE(FunctionStarts)
519 LIEF_MACHO_VISITABLE(CodeSignature)
522 LIEF_MACHO_VISITABLE(DataInCode)
525 LIEF_MACHO_VISITABLE(DataCodeEntry)
528 LIEF_MACHO_VISITABLE(SourceVersion)
531 LIEF_MACHO_VISITABLE(VersionMin)
534 LIEF_MACHO_VISITABLE(SegmentSplitInfo)
537 LIEF_MACHO_VISITABLE(SubFramework)
540 LIEF_MACHO_VISITABLE(Routine)
543 LIEF_MACHO_VISITABLE(DyldEnvironment)
546 LIEF_MACHO_VISITABLE(EncryptionInfo)
549 LIEF_MACHO_VISITABLE(BuildVersion)
552 LIEF_MACHO_VISITABLE(BuildToolVersion)
555 LIEF_MACHO_VISITABLE(FilesetCommand)
558 LIEF_MACHO_VISITABLE(CodeSignatureDir)
561 LIEF_MACHO_VISITABLE(TwoLevelHints)
564 LIEF_MACHO_VISITABLE(LinkerOptHint)
567 LIEF_MACHO_VISITABLE(UnknownCommand)
570
571 // OAT part
572 // ========
579 LIEF_OAT_VISITABLE(DexFile)
582 LIEF_OAT_VISITABLE(Class)
585 LIEF_OAT_VISITABLE(Method)
588
589
590 // DEX part
591 // ========
595 LIEF_DEX_VISITABLE(Field)
598 LIEF_DEX_VISITABLE(Method)
604 LIEF_DEX_VISITABLE(Class)
607 LIEF_DEX_VISITABLE(CodeInfo)
613 LIEF_DEX_VISITABLE(Prototype)
616 LIEF_DEX_VISITABLE(MapList)
619 LIEF_DEX_VISITABLE(MapItem)
622
623 // VDEX part
624 // =========
631
632 // ART part
633 // =========
640
641 template<class T>
642 void dispatch(const T& obj);
643
644
645 private:
646 std::set<size_t> visited_;
647};
648
649
650
651template<typename Arg1, typename... Args>
652void Visitor::operator()(Arg1&& arg1, Args&&... args) {
653 dispatch(std::forward<Arg1>(arg1));
654 operator()(std::forward<Args>(args)... );
655}
656
657template<class T>
658void Visitor::dispatch(const T& obj) {
659 auto hash = reinterpret_cast<size_t>(&obj);
660 if (visited_.find(hash) != std::end(visited_)) {
661 // Already visited
662 return;
663 }
664
665 visited_.insert(hash);
666 visit(obj);
667}
668
669}
670#endif
Abstract binary that exposes an uniform API for the different executable file formats.
Definition Abstract/Binary.hpp:52
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:209
virtual void operator()()
virtual ~Visitor()
virtual void visit(const Object &)
void dispatch(const T &obj)
Definition Visitor.hpp:658
LIEF namespace.
Definition Abstract/Binary.hpp:39
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