retdec
signature.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_UNPACKER_SIGNATURE_H
8 #define RETDEC_UNPACKER_SIGNATURE_H
9 
10 #include <cstdint>
11 #include <initializer_list>
12 #include <vector>
13 
14 #include "retdec/loader/loader.h"
16 
17 namespace retdec {
18 namespace unpacker {
19 
23 #define ANY Signature::Byte(Signature::Byte::Type::WILDCARD, 0x0, 0xFF)
24 
28 #define CAP Signature::Byte(Signature::Byte::Type::CAPTURE, 0x0, 0xFF)
29 
33 #define ANYB(exp, mask) Signature::Byte(Signature::Byte::Type::WILDCARD, exp, mask)
34 
38 #define CAPB(exp, mask) Signature::Byte(Signature::Byte::Type::CAPTURE, exp, mask)
39 
56 class Signature
57 {
58 public:
64  {
65  public:
66  MatchSettings(uint64_t offset = 0, uint64_t searchDistance = 0);
67  MatchSettings(const MatchSettings& settings);
68 
69  uint64_t getOffset() const;
70  void setOffset(uint64_t offset);
71 
72  uint32_t getSectionOrSegmentIndex() const;
73  void setSectionOrSegmentIndex(uint32_t secSegIndex);
74 
75  bool isSearch() const;
76  uint64_t getSearchDistance() const;
77  void setSearchDistance(uint64_t distance);
78 
79  private:
81 
82  uint64_t _offset;
83  uint64_t _searchDistance;
84  };
85 
107  class Byte
108  {
109  public:
113  enum class Type
114  {
115  NORMAL,
116  WILDCARD,
117  CAPTURE
118  };
119 
120  Byte();
121  Byte(uint8_t byte);
122  Byte(Type type, uint8_t expectedValue, uint8_t wildcardMask);
123  Byte(const Byte& byte);
124 
125  Type getType() const;
126  uint8_t getExpectedValue() const;
127  uint8_t getWildcardMask() const;
128 
129  Byte& operator =(uint8_t rhs);
130  Byte& operator =(Byte rhs);
131  bool operator ==(uint8_t rhs) const;
132  friend bool operator ==(uint8_t lhs, const Byte& rhs);
133  bool operator !=(uint8_t rhs) const;
134  friend bool operator !=(uint8_t lhs, const Byte& rhs);
135 
136  private:
137 
139  uint8_t _expectedValue;
140  uint8_t _wildcardMask;
141  };
142 
143  Signature() = delete;
144  Signature(const std::initializer_list<Signature::Byte>& initList);
145  Signature(const Signature& signature);
146 
147  virtual ~Signature() = default;
148 
149  uint64_t getSize() const;
150  uint64_t getCaptureSize() const;
151 
152  bool match(const MatchSettings& settings, retdec::loader::Image* file) const;
153  bool match(const MatchSettings& settings, const retdec::utils::DynamicBuffer& data) const;
154  bool match(const MatchSettings& settings, retdec::loader::Image* file, retdec::utils::DynamicBuffer& capturedData) const;
155  bool match(const MatchSettings& settings, const retdec::utils::DynamicBuffer& data,
156  retdec::utils::DynamicBuffer& capturedData) const;
157 
158  Signature& operator =(const std::initializer_list<Signature::Byte>& initList);
159 
160 private:
162 
163  bool searchMatchImpl(const std::vector<uint8_t>& bytesToMatch, uint64_t offset, uint64_t maxSearchDist, retdec::utils::DynamicBuffer* captureBuffer) const;
164  int64_t matchImpl(const std::vector<uint8_t>& bytesToMatch, uint64_t offset, retdec::utils::DynamicBuffer* captureBuffer) const;
165 
166  std::vector<Signature::Byte> _buffer;
167 };
168 
169 } // namespace unpacker
170 } // namespace retdec
171 
172 #endif
Definition: image.h:22
Definition: signature.h:108
uint8_t _wildcardMask
Wildcard mask specifying the bits that are wildcard and that are exact.
Definition: signature.h:140
uint8_t getWildcardMask() const
Definition: signature.cpp:341
Byte & operator=(uint8_t rhs)
Definition: signature.cpp:353
uint8_t _expectedValue
Expected value of the byte.
Definition: signature.h:139
Type _type
Type of the byte.
Definition: signature.h:138
Type
Definition: signature.h:114
Type getType() const
Definition: signature.cpp:321
bool operator==(uint8_t rhs) const
Definition: signature.cpp:383
bool operator!=(uint8_t rhs) const
Definition: signature.cpp:411
Byte()
Definition: signature.cpp:282
uint8_t getExpectedValue() const
Definition: signature.cpp:331
MatchSettings(const MatchSettings &settings)
uint64_t getSearchDistance() const
Definition: signature.cpp:262
MatchSettings(uint64_t offset=0, uint64_t searchDistance=0)
Definition: signature.cpp:223
void setSectionOrSegmentIndex(uint32_t secSegIndex)
MatchSettings & operator=(const MatchSettings &)
uint64_t getOffset() const
Definition: signature.cpp:232
void setOffset(uint64_t offset)
Definition: signature.cpp:242
uint64_t _searchDistance
Maximum searching distance. No searching if this is set 0.
Definition: signature.h:83
bool isSearch() const
Definition: signature.cpp:252
void setSearchDistance(uint64_t distance)
Definition: signature.cpp:272
uint64_t _offset
Offset where to start matching.
Definition: signature.h:82
Definition: signature.h:57
Signature & operator=(const std::initializer_list< Signature::Byte > &initList)
Definition: signature.cpp:43
int64_t matchImpl(const std::vector< uint8_t > &bytesToMatch, uint64_t offset, retdec::utils::DynamicBuffer *captureBuffer) const
Definition: signature.cpp:187
virtual ~Signature()=default
uint64_t getSize() const
Definition: signature.cpp:54
uint64_t getCaptureSize() const
Definition: signature.cpp:64
bool searchMatchImpl(const std::vector< uint8_t > &bytesToMatch, uint64_t offset, uint64_t maxSearchDist, retdec::utils::DynamicBuffer *captureBuffer) const
Definition: signature.cpp:157
std::vector< Signature::Byte > _buffer
Signature bytes buffer.
Definition: signature.h:166
bool match(const MatchSettings &settings, retdec::loader::Image *file) const
Definition: signature.cpp:84
The class for dynamic buffered data manipulation taking the endianness of the data in account.
Definition: dynamic_buffer.h:36
Declaration of class for buffered data mainpulation.
Interface to loader library.
Definition: archive_wrapper.h:19
Supportive functionality for the generic unpacker.