mirror of
https://gitlab.com/BinaryHardening/cfgrip
synced 2026-07-26 12:41:08 +00:00
Fix #9: implement PE export directory parsing
Fix #9: implement PE export directory parsing
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user