Implement PE export directory parsing

This commit is contained in:
x86byte
2026-07-02 13:02:59 +01:00
parent 664dafbc43
commit dbcc09a8ea
+42
View File
@@ -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;
}