15 if (sections_count < 2)
return false;
17 bool is_valid_padding =
false;
18 for (
size_t i = 1; i < sections_count; i += 2) {
21 if (!sec1 || !sec2)
continue;
23 if (sec1->SizeOfRawData == 0)
continue;
25 const DWORD sec1_end_offset = sec1->VirtualAddress + sec1->SizeOfRawData;
26 if (sec2->VirtualAddress == sec1_end_offset)
continue;
28 if (sec2->VirtualAddress < sec1_end_offset) {
32 const size_t diff = sec2->VirtualAddress - sec1_end_offset;
33 if (diff < r_align)
continue;
35 BYTE* sec1_end_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec1_end_offset);
41 is_valid_padding =
true;
47 return is_valid_padding;
61 if (sections_count == 0)
return false;
62 for (
size_t i = 0; i < sections_count; i++) {
64 if (!sec || sec->PointerToRawData == 0 || sec->SizeOfRawData == 0) {
67 if (sec->PointerToRawData >= v_align)
continue;
69 size_t diff = v_align - sec->PointerToRawData;
70 BYTE* sec_raw_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec->PointerToRawData);
84 for (
size_t i = 0; i < count; i++) {
88 if (hdr->PointerToRawData != 0)
return false;
91 if (hdr->VirtualAddress != 0)
return false;
100 for (
size_t i = 0; i < count; i++) {
104 if (hdr->VirtualAddress != hdr->PointerToRawData) {
115 LOG_INFO(
"Valid Import Table found.");
119 LOG_INFO(
"Valid Relocations Table found.");
123 LOG_INFO(
"Header virtual alignment OK.");
126 LOG_INFO(
"TOTAL v_score: %zu.", v_score);
143 LOG_INFO(
"Raw alignment is erased.");
155 for (
size_t i = 0; i < sections_count; i++) {
167 if (!sec)
return false;
170 size_t sec_rsize = sec->SizeOfRawData;
172 if (sec_rsize >= sec_vsize)
return false;
173 size_t diff = sec_vsize - sec_rsize;
175 BYTE* sec_raw_end_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec->VirtualAddress + sec_rsize);
Parsing and filling the Import Table.
#define LOG_INFO(fmt,...)
bool has_valid_import_table(const PBYTE modulePtr, size_t moduleSize, size_t max_count=0)
bool is_section_expanded(IN const BYTE *pe_buffer, IN size_t pe_size, IN const PIMAGE_SECTION_HEADER sec)
DWORD get_virtual_sec_size(IN const BYTE *pe_hdr, IN const PIMAGE_SECTION_HEADER sec_hdr, IN bool rounded)
bool is_pe_raw(IN const BYTE *pe_buffer, IN size_t pe_size)
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)
bool is_pe_raw_eq_virtual(IN const BYTE *pe_buffer, IN size_t pe_size)
size_t get_sections_count(IN const BYTE *buffer, IN const size_t buffer_size)
bool is_pe_expanded(IN const BYTE *pe_buffer, IN size_t pe_size)
DWORD get_hdrs_size(IN const BYTE *pe_buffer)
bool has_valid_relocation_table(IN const PBYTE modulePtr, IN const size_t moduleSize)
bool is_hdr_virtual_align(const BYTE *pe_buffer, size_t pe_size)
bool is_virtual_padding(const BYTE *pe_buffer, size_t pe_size)
bool is_sec_hdrs_erased(IN const BYTE *pe_buffer, IN size_t pe_size, bool is_raw)
bool is_pe_mapped(IN const BYTE *pe_buffer, IN size_t pe_size)
Detecting in which mode is the PE in the supplied buffer (i.e. raw, virtual). Analyzes PE features ty...
Operating on PE file's relocations table.
Miscellaneous utility functions.