libPeConv
A library to load, manipulate, dump PE files.
Loading...
Searching...
No Matches
relocate.h
Go to the documentation of this file.
1
6#pragma once
7#include <windows.h>
8#include <unordered_set>
9
10#include "peconv/buffer_util.h"
11
12namespace peconv {
13
14 typedef struct _BASE_RELOCATION_ENTRY {
15 WORD Offset : 12;
16 WORD Type : 4;
18
20 {
21 public:
22 RelocBlockCallback(bool _is64bit)
23 : is64bit(_is64bit)
24 {
25 }
26
28
29 virtual bool processRelocField(ULONG_PTR relocField) = 0;
30
31 protected:
32 bool is64bit;
33 };
34
35 //--
36
38 {
39 public:
40 CollectRelocs(const BYTE* pe_buffer, size_t buffer_size, IN bool _is64bit, OUT std::unordered_set<ULONGLONG>& _relocs)
41 : RelocBlockCallback(_is64bit), relocs(_relocs),
42 peBuffer(pe_buffer), bufferSize(buffer_size)
43 {
44 }
45
46 virtual bool processRelocField(ULONG_PTR relocField)
47 {
48 ULONGLONG rva = 0;
49 if (is64bit) {
50
51 ULONGLONG* relocateAddr = (ULONGLONG*)((ULONG_PTR)relocField);
52 if (!validate_ptr(peBuffer, bufferSize, relocateAddr, sizeof(ULONGLONG))) {
53 return false;
54 }
55 rva = (*relocateAddr);
56 }
57 else {
58 DWORD* relocateAddr = (DWORD*)((ULONG_PTR)relocField);
59 if (!validate_ptr(peBuffer, bufferSize, relocateAddr, sizeof(DWORD))) {
60 return false;
61 }
62 rva = ULONGLONG(*relocateAddr);
63 }
64 relocs.insert(rva);
65 return true;
66 }
67
68 protected:
69 std::unordered_set<ULONGLONG>& relocs;
70
71 const BYTE* peBuffer;
72 size_t bufferSize;
73 };
74
75 // Processs the relocation table and make your own callback on each relocation field
76 bool process_relocation_table(IN PVOID modulePtr, IN SIZE_T moduleSize, IN RelocBlockCallback *callback);
77
86 bool relocate_module(IN PBYTE modulePtr, IN SIZE_T moduleSize, IN ULONGLONG newBase, IN ULONGLONG oldBase = 0);
87
93 bool has_valid_relocation_table(IN const PBYTE modulePtr, IN const size_t moduleSize);
94
105 bool virtual_addr_to_rva(IN const PBYTE imgBase, IN const size_t imgSize, IN ULONGLONG virtualAddr, OUT DWORD& outRVA, IN std::unordered_set<ULONGLONG>* relocs=nullptr);
106
107};//namespace peconv
Definitions of the used buffer types. Functions for their allocation and deallocation.
const BYTE * peBuffer
Definition: relocate.h:71
CollectRelocs(const BYTE *pe_buffer, size_t buffer_size, IN bool _is64bit, OUT std::unordered_set< ULONGLONG > &_relocs)
Definition: relocate.h:40
virtual bool processRelocField(ULONG_PTR relocField)
Definition: relocate.h:46
std::unordered_set< ULONGLONG > & relocs
Definition: relocate.h:69
virtual ~RelocBlockCallback()
Definition: relocate.h:27
RelocBlockCallback(bool _is64bit)
Definition: relocate.h:22
virtual bool processRelocField(ULONG_PTR relocField)=0
bool virtual_addr_to_rva(IN const PBYTE imgBase, IN const size_t imgSize, IN ULONGLONG virtualAddr, OUT DWORD &outRVA, IN std::unordered_set< ULONGLONG > *relocs=nullptr)
Definition: relocate.cpp:215
bool validate_ptr(IN const void *buffer_bgn, IN size_t buffer_size, IN const void *field_bgn, IN size_t field_size)
Definition: buffer_util.cpp:9
bool process_relocation_table(IN PVOID modulePtr, IN SIZE_T moduleSize, IN RelocBlockCallback *callback)
Definition: relocate.cpp:111
struct peconv::_BASE_RELOCATION_ENTRY BASE_RELOCATION_ENTRY
bool relocate_module(IN PBYTE modulePtr, IN SIZE_T moduleSize, IN ULONGLONG newBase, IN ULONGLONG oldBase=0)
Definition: relocate.cpp:172
bool has_valid_relocation_table(IN const PBYTE modulePtr, IN const size_t moduleSize)
Definition: relocate.cpp:192