summaryrefslogtreecommitdiffhomepage
path: root/src/headers
diff options
context:
space:
mode:
Diffstat (limited to 'src/headers')
-rw-r--r--src/headers/pe_get_image_section_tbl_addr.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/headers/pe_get_image_section_tbl_addr.c b/src/headers/pe_get_image_section_tbl_addr.c
index 56c55a6..98f9dd4 100644
--- a/src/headers/pe_get_image_section_tbl_addr.c
+++ b/src/headers/pe_get_image_section_tbl_addr.c
@@ -75,3 +75,41 @@ struct pe_raw_sec_hdr * pe_get_image_named_section_addr(const void * base, const
return 0;
}
+
+
+struct pe_raw_sec_hdr * pe_get_image_block_section_addr(
+ const void * base,
+ uint32_t blk_rva,
+ uint32_t blk_size)
+{
+ uint32_t low,size;
+ uint16_t count;
+ struct pe_raw_sec_hdr * hdr;
+ struct pe_raw_coff_image_hdr * coff;
+
+ if (!(hdr = pe_get_image_section_tbl_addr(base)))
+ return 0;
+
+ if (!(coff = pe_get_image_coff_hdr_addr(base)))
+ return 0;
+
+ count = coff->cfh_num_of_sections[1] << 8;
+ count += coff->cfh_num_of_sections[0];
+
+ for (; count; hdr++,count--) {
+ low = hdr->sh_virtual_addr[3] << 24;
+ low += hdr->sh_virtual_addr[2] << 16;
+ low += hdr->sh_virtual_addr[1] << 8;
+ low += hdr->sh_virtual_addr[0];
+
+ size = hdr->sh_virtual_size[3] << 24;
+ size += hdr->sh_virtual_size[2] << 16;
+ size += hdr->sh_virtual_size[1] << 8;
+ size += hdr->sh_virtual_size[0];
+
+ if ((low <= blk_rva) && (blk_rva + blk_size <= low + size))
+ return hdr;
+ }
+
+ return 0;
+}