16#ifndef LIEF_MACHO_CHAINED_PTR_ANALYSIS_H
17#define LIEF_MACHO_CHAINED_PTR_ANALYSIS_H
33 struct dyld_chained_ptr_arm64e_rebase_t
42 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_rebase_t& chain);
45 return uint64_t(high8) | target;
50 struct dyld_chained_ptr_arm64e_bind_t
52 uint64_t ordinal : 16,
60 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_bind_t& chain);
64 struct dyld_chained_ptr_arm64e_auth_rebase_t
75 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_auth_rebase_t& chain);
79 struct dyld_chained_ptr_arm64e_auth_bind_t
81 uint64_t ordinal : 16,
91 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_auth_bind_t& chain);
95 struct dyld_chained_ptr_64_rebase_t
104 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_64_rebase_t& chain);
107 return uint64_t(high8) | target;
112 struct dyld_chained_ptr_arm64e_bind24_t
114 uint64_t ordinal : 24,
122 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_bind24_t& chain);
126 struct dyld_chained_ptr_arm64e_auth_bind24_t
128 uint64_t ordinal : 24,
138 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_arm64e_auth_bind24_t& chain);
142 struct dyld_chained_ptr_64_bind_t
144 uint64_t ordinal : 24,
151 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_64_bind_t& chain);
155 struct dyld_chained_ptr_64_kernel_cache_rebase_t
157 uint64_t target : 30,
166 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_64_kernel_cache_rebase_t& chain);
170 struct dyld_chained_ptr_32_rebase_t
172 uint32_t target : 26,
177 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_32_rebase_t& chain);
181 struct dyld_chained_ptr_32_bind_t
183 uint32_t ordinal : 20,
189 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_32_bind_t& chain);
193 struct dyld_chained_ptr_32_cache_rebase_t
195 uint32_t target : 30,
199 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_32_cache_rebase_t& chain);
203 struct dyld_chained_ptr_32_firmware_rebase_t
205 uint32_t target : 26,
209 std::ostream&
operator<<(std::ostream& os,
const dyld_chained_ptr_32_firmware_rebase_t& chain);
212 enum class PTR_TYPE : uint64_t {
214 DYLD_CHAINED_PTR_ARM64E_REBASE,
215 DYLD_CHAINED_PTR_ARM64E_BIND,
216 DYLD_CHAINED_PTR_ARM64E_AUTH_REBASE,
217 DYLD_CHAINED_PTR_ARM64E_AUTH_BIND,
218 DYLD_CHAINED_PTR_64_REBASE,
219 DYLD_CHAINED_PTR_ARM64E_BIND24,
220 DYLD_CHAINED_PTR_ARM64E_AUTH_BIND24,
221 DYLD_CHAINED_PTR_64_BIND,
222 DYLD_CHAINED_PTR_64_KERNEL_CACHE_REBASE,
223 DYLD_CHAINED_PTR_32_REBASE,
224 DYLD_CHAINED_PTR_32_BIND,
225 DYLD_CHAINED_PTR_32_CACHE_REBASE,
226 DYLD_CHAINED_PTR_32_FIRMWARE_REBASE
229 static std::unique_ptr<ChainedPointerAnalysis>
from_value(uint64_t value,
232 return std::unique_ptr<ChainedPointerAnalysis>(
233 new ChainedPointerAnalysis(value, size));
236 static size_t stride(DYLD_CHAINED_PTR_FORMAT fmt) {
238 case DYLD_CHAINED_PTR_FORMAT::NONE:
240 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E:
241 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND:
242 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND24:
243 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_SHARED_CACHE:
246 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_KERNEL:
247 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_FIRMWARE:
248 case DYLD_CHAINED_PTR_FORMAT::PTR_32_FIRMWARE:
249 case DYLD_CHAINED_PTR_FORMAT::PTR_64:
250 case DYLD_CHAINED_PTR_FORMAT::PTR_64_OFFSET:
251 case DYLD_CHAINED_PTR_FORMAT::PTR_32:
252 case DYLD_CHAINED_PTR_FORMAT::PTR_32_CACHE:
253 case DYLD_CHAINED_PTR_FORMAT::PTR_64_KERNEL_CACHE:
256 case DYLD_CHAINED_PTR_FORMAT::PTR_X86_64_KERNEL_CACHE:
262 static size_t ptr_size(DYLD_CHAINED_PTR_FORMAT fmt) {
264 case DYLD_CHAINED_PTR_FORMAT::NONE:
266 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E:
267 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND:
268 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND24:
269 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_KERNEL:
270 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_FIRMWARE:
271 case DYLD_CHAINED_PTR_FORMAT::PTR_64:
272 case DYLD_CHAINED_PTR_FORMAT::PTR_64_OFFSET:
273 case DYLD_CHAINED_PTR_FORMAT::PTR_64_KERNEL_CACHE:
274 case DYLD_CHAINED_PTR_FORMAT::PTR_X86_64_KERNEL_CACHE:
275 case DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_SHARED_CACHE:
276 return sizeof(uint64_t);
278 case DYLD_CHAINED_PTR_FORMAT::PTR_32_FIRMWARE:
279 case DYLD_CHAINED_PTR_FORMAT::PTR_32:
280 case DYLD_CHAINED_PTR_FORMAT::PTR_32_CACHE:
281 return sizeof(uint32_t);
292 ChainedPointerAnalysis&
operator=(
const ChainedPointerAnalysis&) =
default;
295 ChainedPointerAnalysis& operator=(ChainedPointerAnalysis&&) noexcept = default;
297 ~ChainedPointerAnalysis() = default;
299 uint64_t value()
const {
308 dyld_chained_ptr_arm64e_rebase_t
result;
314 dyld_chained_ptr_arm64e_bind_t
result;
320 dyld_chained_ptr_arm64e_auth_rebase_t
result;
326 dyld_chained_ptr_arm64e_auth_bind_t
result;
332 dyld_chained_ptr_64_rebase_t
result;
338 dyld_chained_ptr_arm64e_bind24_t
result;
344 dyld_chained_ptr_arm64e_auth_bind24_t
result;
350 dyld_chained_ptr_64_bind_t
result;
356 dyld_chained_ptr_64_kernel_cache_rebase_t
result;
362 dyld_chained_ptr_32_rebase_t
result;
368 dyld_chained_ptr_32_bind_t
result;
374 dyld_chained_ptr_32_cache_rebase_t
result;
380 dyld_chained_ptr_32_firmware_rebase_t
result;
385 struct union_pointer_t {
386 PTR_TYPE type = PTR_TYPE::UNKNOWN;
388 dyld_chained_ptr_arm64e_rebase_t arm64e_rebase;
389 dyld_chained_ptr_arm64e_bind_t arm64e_bind;
390 dyld_chained_ptr_arm64e_auth_rebase_t arm64e_auth_rebase;
391 dyld_chained_ptr_arm64e_auth_bind_t arm64e_auth_bind;
392 dyld_chained_ptr_64_rebase_t ptr_64_rebase;
393 dyld_chained_ptr_arm64e_bind24_t arm64e_bind24;
394 dyld_chained_ptr_arm64e_auth_bind24_t arm64e_auth_bind24;
395 dyld_chained_ptr_64_bind_t ptr_64_bind;
396 dyld_chained_ptr_64_kernel_cache_rebase_t ptr_64_kernel_cache_rebase;
397 dyld_chained_ptr_32_rebase_t ptr_32_rebase;
398 dyld_chained_ptr_32_bind_t ptr_32_bind;
399 dyld_chained_ptr_32_cache_rebase_t ptr_32_cache_rebase;
400 dyld_chained_ptr_32_firmware_rebase_t ptr_32_firmware_rebase;
409 return (
bool)ordinal();
414 std::ostream&
operator<<(std::ostream& os,
const union_pointer_t& ptr);
417 static_assert(
sizeof(union_pointer_t) == 16);
419 union_pointer_t
get_as(DYLD_CHAINED_PTR_FORMAT fmt)
const;
422 BinaryStream& stream, DYLD_CHAINED_PTR_FORMAT format,
423 const std::function<
int(uint64_t,
const union_pointer_t& ptr)>& callback);
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:33
Definition ChainedPointerAnalysis.hpp:30
union_pointer_t get_as(DYLD_CHAINED_PTR_FORMAT fmt) const
ChainedPointerAnalysis(uint64_t value, size_t size)
Definition ChainedPointerAnalysis.hpp:286
const dyld_chained_ptr_32_bind_t dyld_chained_ptr_32_bind() const
Definition ChainedPointerAnalysis.hpp:367
const dyld_chained_ptr_64_bind_t dyld_chained_ptr_64_bind() const
Definition ChainedPointerAnalysis.hpp:349
const dyld_chained_ptr_64_rebase_t dyld_chained_ptr_64_rebase() const
Definition ChainedPointerAnalysis.hpp:331
size_t size() const
Definition ChainedPointerAnalysis.hpp:303
const dyld_chained_ptr_arm64e_rebase_t dyld_chained_ptr_arm64e_rebase() const
Definition ChainedPointerAnalysis.hpp:307
const dyld_chained_ptr_arm64e_auth_rebase_t dyld_chained_ptr_arm64e_auth_rebase() const
Definition ChainedPointerAnalysis.hpp:319
const dyld_chained_ptr_64_kernel_cache_rebase_t dyld_chained_ptr_64_kernel_cache_rebase() const
Definition ChainedPointerAnalysis.hpp:355
ChainedPointerAnalysis & operator=(const ChainedPointerAnalysis &)=default
const dyld_chained_ptr_arm64e_bind24_t dyld_chained_ptr_arm64e_bind24() const
Definition ChainedPointerAnalysis.hpp:337
const dyld_chained_ptr_32_rebase_t dyld_chained_ptr_32_rebase() const
Definition ChainedPointerAnalysis.hpp:361
static size_t stride(DYLD_CHAINED_PTR_FORMAT fmt)
Definition ChainedPointerAnalysis.hpp:236
const dyld_chained_ptr_32_firmware_rebase_t dyld_chained_ptr_32_firmware_rebase() const
Definition ChainedPointerAnalysis.hpp:379
const dyld_chained_ptr_arm64e_bind_t dyld_chained_ptr_arm64e_bind() const
Definition ChainedPointerAnalysis.hpp:313
const dyld_chained_ptr_arm64e_auth_bind_t dyld_chained_ptr_arm64e_auth_bind() const
Definition ChainedPointerAnalysis.hpp:325
ChainedPointerAnalysis(ChainedPointerAnalysis &&) noexcept=default
static std::unique_ptr< ChainedPointerAnalysis > from_value(uint64_t value, size_t size)
Definition ChainedPointerAnalysis.hpp:229
const dyld_chained_ptr_32_cache_rebase_t dyld_chained_ptr_32_cache_rebase() const
Definition ChainedPointerAnalysis.hpp:373
static size_t ptr_size(DYLD_CHAINED_PTR_FORMAT fmt)
Definition ChainedPointerAnalysis.hpp:262
ChainedPointerAnalysis(const ChainedPointerAnalysis &)=default
const dyld_chained_ptr_arm64e_auth_bind24_t dyld_chained_ptr_arm64e_auth_bind24() const
Definition ChainedPointerAnalysis.hpp:343
static uint64_t walk_chain(BinaryStream &stream, DYLD_CHAINED_PTR_FORMAT format, const std::function< int(uint64_t, const union_pointer_t &ptr)> &callback)
Namespace related to the LIEF's Mach-O module.
Definition Abstract/Header.hpp:36
@ UNKNOWN
Definition MachO/enums.hpp:24
LIEF namespace.
Definition Abstract/Binary.hpp:36
tl::expected< T, lief_errors > result
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:75
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_bind_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_cache_rebase_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_firmware_rebase_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_rebase_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_bind_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_kernel_cache_rebase_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_rebase_t &chain)
uint64_t unpack_target() const
Definition ChainedPointerAnalysis.hpp:106
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_bind24_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_bind_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_rebase_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_bind24_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_bind_t &chain)
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_rebase_t &chain)
uint64_t unpack_target() const
Definition ChainedPointerAnalysis.hpp:44
friend std::ostream & operator<<(std::ostream &os, const union_pointer_t &ptr)
bool is_bind() const
Definition ChainedPointerAnalysis.hpp:408
result< uint64_t > target() const
result< uint32_t > ordinal() const
#define LIEF_API
Definition visibility.h:41