8PBYTE
peconv::find_ending_cave(BYTE*modulePtr,
size_t moduleSize,
const DWORD minimal_size,
const DWORD req_charact,
bool reserve)
11 if (sec_count == 0)
return nullptr;
13 size_t last_sec = sec_count - 1;
15 if (section_hdr ==
nullptr)
return nullptr;
16 if (!(section_hdr->Characteristics & req_charact))
return nullptr;
18 DWORD raw_size = section_hdr->SizeOfRawData;
19 DWORD virtual_size = (DWORD)moduleSize - section_hdr->VirtualAddress;
21 if (raw_size >= virtual_size) {
22 LOG_INFO(
"Last section's raw_size: 0x%lx >= virtual_size: 0x%lx", raw_size, virtual_size);
25 DWORD cave_size = virtual_size - raw_size;
26 if (cave_size < minimal_size) {
30 PBYTE cave_ptr = modulePtr + section_hdr->VirtualAddress + section_hdr->SizeOfRawData;
31 if (!
validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) {
36 section_hdr->SizeOfRawData += minimal_size;
44 if (alignment == 0)
return nullptr;
47 for (
size_t i = 0; i < sec_count; i++) {
49 if (section_hdr ==
nullptr)
continue;
50 if (!(section_hdr->Characteristics & req_charact))
continue;
52 DWORD rem = section_hdr->SizeOfRawData % alignment;
53 if (rem == 0)
continue;
55 DWORD div = (section_hdr->SizeOfRawData / alignment) + 1;
56 DWORD new_size = div * alignment;
57 DWORD cave_size = new_size - section_hdr->SizeOfRawData;
58 if (cave_size < minimal_size) {
62 DWORD sec_start = section_hdr->PointerToRawData;
63 if (sec_start == 0)
continue;
65 DWORD sec_end = sec_start + section_hdr->SizeOfRawData;
66 LOG_INFO(
"Section: 0x%lx : 0x%lx", sec_start, sec_end);
67 PBYTE cave_ptr = modulePtr + sec_end;
68 if (!
validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) {
73 section_hdr->SizeOfRawData += minimal_size;
84 for (
size_t i = 0; i < sec_count; i++) {
86 if (section_hdr ==
nullptr)
continue;
87 if (!(section_hdr->Characteristics & req_charact))
continue;
89 if (section_hdr->SizeOfRawData < minimal_size)
continue;
92 DWORD sec_start = section_hdr->VirtualAddress;
93 if (sec_start == 0)
continue;
95 DWORD sec_end = sec_start + section_hdr->SizeOfRawData;
96 LOG_INFO(
"Section: 0x%lx : 0x%lx", sec_start, sec_end);
98 size_t cave_offset = section_hdr->SizeOfRawData - minimal_size;
99 PBYTE cave_ptr = modulePtr + sec_start + cave_offset;
100 if (!
validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) {
109 if (section_hdr->Characteristics & IMAGE_SCN_MEM_EXECUTE) {
110 if (
is_padding(cave_ptr, minimal_size, 0xCC)) {
Functions related to finding caves in the loaded PE file.
#define LOG_INFO(fmt,...)
PBYTE find_padding_cave(BYTE *module_ptr, size_t module_size, const size_t minimal_size, const DWORD req_charact=IMAGE_SCN_MEM_READ)
PBYTE find_ending_cave(BYTE *module_ptr, size_t module_size, const DWORD cave_size, const DWORD req_charact=IMAGE_SCN_MEM_READ, bool reserve=true)
bool validate_ptr(IN const void *buffer_bgn, IN size_t buffer_size, IN const void *field_bgn, IN size_t field_size)
PIMAGE_SECTION_HEADER get_section_hdr(IN const BYTE *pe_buffer, IN const size_t buffer_size, IN size_t section_num)
bool is_padding(const BYTE *cave_ptr, size_t cave_size, const BYTE padding_char)
DWORD get_sec_alignment(IN const BYTE *modulePtr, IN bool is_raw)
size_t get_sections_count(IN const BYTE *buffer, IN const size_t buffer_size)
PBYTE find_alignment_cave(BYTE *module_ptr, size_t module_size, const DWORD cave_size, const DWORD req_charact=IMAGE_SCN_MEM_READ, bool reserve=true)
Wrappers over various fields in the PE header. Read, write, parse PE headers.
Miscellaneous utility functions.