From 5bbda279685f52693d4f5d9cb1500e295e06fc1e Mon Sep 17 00:00:00 2001 From: auth12 <67507608+auth12@users.noreply.github.com> Date: Sat, 1 Aug 2020 11:15:55 -0700 Subject: Started security. --- server/src/image/pe.h | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'server/src/image') diff --git a/server/src/image/pe.h b/server/src/image/pe.h index 23a0e4f..1025f13 100644 --- a/server/src/image/pe.h +++ b/server/src/image/pe.h @@ -18,6 +18,7 @@ template class image { win::image_t *m_image; std::vector m_buffer; + std::string m_name; std::unordered_map> m_imports; std::vector m_sections; @@ -25,7 +26,7 @@ class image { public: image() = default; - image(const std::string_view name) : m_image{nullptr} { + image(const std::string_view name) : m_image{nullptr}, m_name{name} { if (!io::read_file(name, m_buffer)) { io::logger->error("failed to load image {}.", name); return; @@ -41,15 +42,17 @@ class image { parse_imports(); } - void reload(const std::string_view name) { - io::read_file(name, m_buffer); + void reload() { + io::read_file(m_name, m_buffer); if (m_buffer.empty()) { - io::logger->error("failed to reload image {}.", name); + io::logger->error("failed to reload image {}.", m_name); return; } m_image = reinterpret_cast *>(m_buffer.data()); load(); + + io::logger->info("reloaded {}.", m_name); } void parse_sections() { @@ -103,16 +106,20 @@ class image { auto named_import = reinterpret_cast( m_image->rva_to_ptr(thunk->address)); - if (!thunk->is_ordinal) { - import_t data; - data.name = reinterpret_cast(named_import->name); - data.rva = table->rva_first_thunk + index; + if (thunk->is_ordinal) { + io::logger->error("found import by ordinal in module {}, {}.", + mod_name, m_name); + continue; + } - std::transform(mod_name.begin(), mod_name.end(), mod_name.begin(), - ::tolower); + import_t data; + data.name = reinterpret_cast(named_import->name); + data.rva = table->rva_first_thunk + index; - m_imports[mod_name].emplace_back(std::move(data)); - } + std::transform(mod_name.begin(), mod_name.end(), mod_name.begin(), + ::tolower); + + m_imports[mod_name].emplace_back(std::move(data)); } } } @@ -124,6 +131,10 @@ class image { out.resize(nt->optional_header.size_image); for (auto &sec : m_sections) { + if(sec.name == ".reloc" || sec.name == ".rsrc" || sec.name == ".idata") { + continue; + } + std::memcpy(&out[sec.va], &m_buffer[sec.rva], sec.size); } } -- cgit v1.2.3