libPeConv
A library to load, manipulate, dump PE files.
Loading...
Searching...
No Matches
pe_hdrs_helper.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <windows.h>
9#include "buffer_util.h"
10
11#ifndef PAGE_SIZE
12#define PAGE_SIZE 0x1000
13#endif
14
15namespace peconv {
19 const ULONGLONG MAX_HEADER_SIZE = PAGE_SIZE;
20
21 template <typename INT_TYPE>
22 INT_TYPE round_up_to_unit(const INT_TYPE size, const INT_TYPE unit)
23 {
24 if (unit == 0) {
25 return size;
26 }
27 INT_TYPE units_count = size / unit;
28 INT_TYPE rounded_size = units_count * unit;
29 if (rounded_size < size) {
30 rounded_size += unit;
31 }
32 return rounded_size;
33 }
34
38 DWORD get_image_size(IN const BYTE *payload);
39
43 bool update_image_size(IN OUT BYTE* payload, IN DWORD new_img_size);
44
48 WORD get_nt_hdr_architecture(IN const BYTE *pe_buffer);
49
53 bool is64bit(IN const BYTE *pe_buffer);
54
59 BYTE* get_nt_hdrs(
60 IN const BYTE *pe_buffer,
61 IN OPTIONAL size_t buffer_size=0 //if buffer_size=0 means size unknown
62 );
63
67 IMAGE_NT_HEADERS32* get_nt_hdrs32(IN const BYTE *pe_buffer);
68
72 IMAGE_NT_HEADERS64* get_nt_hdrs64(IN const BYTE *pe_buffer);
73
77 LPVOID get_optional_hdr(IN const BYTE* payload, IN const size_t buffer_size);
78
82 const IMAGE_FILE_HEADER* get_file_hdr(
83 IN const BYTE* payload,
84 IN const size_t buffer_size
85 );
86
90 DWORD get_hdrs_size(IN const BYTE *pe_buffer);
91
95 IMAGE_DATA_DIRECTORY* get_directory_entry(IN const BYTE* pe_buffer, IN DWORD dir_id, IN bool allow_empty = false);
96
100 template <typename IMAGE_TYPE_DIRECTORY>
101 IMAGE_TYPE_DIRECTORY* get_type_directory(IN HMODULE modulePtr, IN DWORD dir_id)
102 {
103 IMAGE_DATA_DIRECTORY *my_dir = peconv::get_directory_entry((const BYTE*)modulePtr, dir_id);
104 if (!my_dir) return nullptr;
105
106 DWORD dir_addr = my_dir->VirtualAddress;
107 if (dir_addr == 0) return nullptr;
108
109 return (IMAGE_TYPE_DIRECTORY*)(dir_addr + (ULONG_PTR)modulePtr);
110 }
111
115 IMAGE_EXPORT_DIRECTORY* get_export_directory(IN HMODULE modulePtr);
116
117 // Fetch Image Base from Optional Header.
118 ULONGLONG get_image_base(IN const BYTE *pe_buffer);
119
123 bool update_image_base(IN OUT BYTE* payload, IN ULONGLONG destImageBase);
124
128 DWORD get_entry_point_rva(IN const BYTE *pe_buffer);
129
133 bool update_entry_point_rva(IN OUT BYTE *pe_buffer, IN DWORD ep);
134
138 size_t get_sections_count(
139 IN const BYTE* buffer,
140 IN const size_t buffer_size
141 );
142
146 bool is_valid_sections_hdr_offset(IN const BYTE* buffer, IN const size_t buffer_size);
147
151 PIMAGE_SECTION_HEADER get_section_hdr(
152 IN const BYTE* pe_buffer,
153 IN const size_t buffer_size,
154 IN size_t section_num
155 );
156
160 WORD get_file_characteristics(IN const BYTE* payload);
161
165 bool is_module_dll(IN const BYTE* payload);
166
170 bool is_dot_net(BYTE *pe_buffer, size_t pe_buffer_size);
171
175 WORD get_dll_characteristics(IN const BYTE* payload);
176
180 bool set_subsystem(IN OUT BYTE* payload, IN WORD subsystem);
181
185 WORD get_subsystem(IN const BYTE* payload);
186
190 bool has_relocations(IN const BYTE *pe_buffer);
191
195 IMAGE_COR20_HEADER* get_dotnet_hdr(
196 IN const BYTE* pe_buffer,
197 IN size_t const buffer_size,
198 IN const IMAGE_DATA_DIRECTORY* dotNetDir
199 );
200
204 DWORD get_sec_alignment(IN const BYTE* modulePtr, IN bool is_raw);
205
209 bool set_sec_alignment(IN OUT BYTE* pe_buffer, IN bool is_raw, IN DWORD new_alignment);
210
215 IN const BYTE* pe_hdr,
216 IN const PIMAGE_SECTION_HEADER sec_hdr,
217 IN bool rounded //if set, it rounds it up to the Virtual Alignment
218 );
219
226 PIMAGE_SECTION_HEADER get_last_section(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw);
227
234 DWORD calc_pe_size(
235 IN const PBYTE pe_buffer,
236 IN size_t pe_size,
237 IN bool is_raw
238 );
239
246 bool is_valid_sectons_alignment(IN const BYTE* buffer, IN const SIZE_T buffer_size, IN bool is_raw);
247
248}; // namespace peconv
Definitions of the used buffer types. Functions for their allocation and deallocation.
bool update_entry_point_rva(IN OUT BYTE *pe_buffer, IN DWORD ep)
bool set_sec_alignment(IN OUT BYTE *pe_buffer, IN bool is_raw, IN DWORD new_alignment)
bool has_relocations(IN const BYTE *pe_buffer)
DWORD get_entry_point_rva(IN const BYTE *pe_buffer)
WORD get_nt_hdr_architecture(IN const BYTE *pe_buffer)
bool set_subsystem(IN OUT BYTE *payload, IN WORD subsystem)
bool is_dot_net(BYTE *pe_buffer, size_t pe_buffer_size)
DWORD get_virtual_sec_size(IN const BYTE *pe_hdr, IN const PIMAGE_SECTION_HEADER sec_hdr, IN bool rounded)
const IMAGE_FILE_HEADER * get_file_hdr(IN const BYTE *payload, IN const size_t buffer_size)
bool update_image_base(IN OUT BYTE *payload, IN ULONGLONG destImageBase)
bool is_valid_sections_hdr_offset(IN const BYTE *buffer, IN const size_t buffer_size)
ULONGLONG get_image_base(IN const BYTE *pe_buffer)
WORD get_file_characteristics(IN const BYTE *payload)
PIMAGE_SECTION_HEADER get_section_hdr(IN const BYTE *pe_buffer, IN const size_t buffer_size, IN size_t section_num)
IMAGE_TYPE_DIRECTORY * get_type_directory(IN HMODULE modulePtr, IN DWORD dir_id)
IMAGE_NT_HEADERS64 * get_nt_hdrs64(IN const BYTE *pe_buffer)
IMAGE_COR20_HEADER * get_dotnet_hdr(IN const BYTE *pe_buffer, IN size_t const buffer_size, IN const IMAGE_DATA_DIRECTORY *dotNetDir)
DWORD get_image_size(IN const BYTE *payload)
DWORD get_sec_alignment(IN const BYTE *modulePtr, IN bool is_raw)
INT_TYPE round_up_to_unit(const INT_TYPE size, const INT_TYPE unit)
bool is64bit(IN const BYTE *pe_buffer)
size_t get_sections_count(IN const BYTE *buffer, IN const size_t buffer_size)
IMAGE_NT_HEADERS32 * get_nt_hdrs32(IN const BYTE *pe_buffer)
bool update_image_size(IN OUT BYTE *payload, IN DWORD new_img_size)
const ULONGLONG MAX_HEADER_SIZE
DWORD get_hdrs_size(IN const BYTE *pe_buffer)
IMAGE_DATA_DIRECTORY * get_directory_entry(IN const BYTE *pe_buffer, IN DWORD dir_id, IN bool allow_empty=false)
PIMAGE_SECTION_HEADER get_last_section(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw)
WORD get_dll_characteristics(IN const BYTE *payload)
IMAGE_EXPORT_DIRECTORY * get_export_directory(IN HMODULE modulePtr)
bool is_valid_sectons_alignment(IN const BYTE *buffer, IN const SIZE_T buffer_size, IN bool is_raw)
BYTE * get_nt_hdrs(IN const BYTE *pe_buffer, IN OPTIONAL size_t buffer_size=0)
DWORD calc_pe_size(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw)
bool is_module_dll(IN const BYTE *payload)
WORD get_subsystem(IN const BYTE *payload)
LPVOID get_optional_hdr(IN const BYTE *payload, IN const size_t buffer_size)
#define PAGE_SIZE