From dbcc09a8ead77cfb6f0ff17c5d675c5cd8f9d637 Mon Sep 17 00:00:00 2001 From: x86byte <111459558+x86byte@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:02:59 +0100 Subject: [PATCH] Implement PE export directory parsing --- loader/pe.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/loader/pe.cpp b/loader/pe.cpp index c578332..837b8c9 100644 --- a/loader/pe.cpp +++ b/loader/pe.cpp @@ -252,6 +252,48 @@ bool PELoader::parseHeaders() } } + // Parse export directory + uint32_t export_rva = r32(m_data, data_dir_off); + if (export_rva) + { + uint32_t export_off = rvaToOffset(export_rva); + if (export_off && export_off + 40 <= m_data.size()) + { + uint32_t export_base = r32(m_data, export_off + 16); + uint32_t num_funcs = r32(m_data, export_off + 20); + uint32_t num_names = r32(m_data, export_off + 24); + uint32_t funcs_rva = r32(m_data, export_off + 28); + uint32_t names_rva = r32(m_data, export_off + 32); + uint32_t ords_rva = r32(m_data, export_off + 36); + + uint32_t funcs_off = rvaToOffset(funcs_rva); + uint32_t names_off = rvaToOffset(names_rva); + uint32_t ords_off = rvaToOffset(ords_rva); + + if (funcs_off && names_off && ords_off) + { + for (uint32_t i = 0; i < num_names; i++) + { + uint32_t name_rva = r32(m_data, names_off + i * 4); + uint32_t name_off = rvaToOffset(name_rva); + if (!name_off) continue; + + string exp_name = readString(name_off); + if (exp_name.empty()) continue; + + uint16_t ord = r16(m_data, ords_off + i * 2); + if (ord >= num_funcs) continue; + + uint32_t func_rva = r32(m_data, funcs_off + ord * 4); + if (func_rva == 0) continue; + + addr_t func_va = func_rva + m_image_base; + m_exports.push_back({func_va, exp_name}); + } + } + } + } + return true; }