added self info header

This commit is contained in:
georgemoralis 2023-04-13 14:51:58 +03:00
parent 4d218d7a0d
commit 3b34a06e94
2 changed files with 45 additions and 1 deletions

View file

@ -70,6 +70,7 @@ void Elf::Reset()//reset all variables
} }
delete m_self; delete m_self;
delete m_elf_header; delete m_elf_header;
delete m_self_id_header;
delete[] m_self_segments; delete[] m_self_segments;
delete[] m_elf_phdr; delete[] m_elf_phdr;
delete[] m_elf_shdr; delete[] m_elf_shdr;
@ -79,6 +80,7 @@ void Elf::Reset()//reset all variables
m_elf_header = nullptr; m_elf_header = nullptr;
m_elf_phdr = nullptr; m_elf_phdr = nullptr;
m_elf_shdr = nullptr; m_elf_shdr = nullptr;
m_self_id_header = nullptr;
} }
void Elf::Open(const std::string& file_name) void Elf::Open(const std::string& file_name)
{ {
@ -89,7 +91,8 @@ void Elf::Open(const std::string& file_name)
m_self = load_self(*m_f); m_self = load_self(*m_f);
if (!isSelfFile()) bool isself = isSelfFile();
if (!isself)
{ {
delete m_self; delete m_self;
m_self = nullptr; m_self = nullptr;
@ -115,6 +118,27 @@ void Elf::Open(const std::string& file_name)
m_elf_phdr = load_program_header(*m_f, elfheader_pos + m_elf_header->e_phoff, m_elf_header->e_phnum); m_elf_phdr = load_program_header(*m_f, elfheader_pos + m_elf_header->e_phoff, m_elf_header->e_phnum);
m_elf_shdr = load_section_header(*m_f, elfheader_pos + m_elf_header->e_shoff, m_elf_header->e_shnum); m_elf_shdr = load_section_header(*m_f, elfheader_pos + m_elf_header->e_shoff, m_elf_header->e_shnum);
} }
if (isself && m_elf_header != nullptr)
{
u64 header_size = 0;
header_size += sizeof(self_header);
header_size += sizeof(self_segment_header) * m_self->segment_count;
header_size += sizeof(elf_header);
header_size += m_elf_header->e_phnum * m_elf_header->e_phentsize;
header_size += m_elf_header->e_shnum * m_elf_header->e_shentsize;
header_size += 15; header_size &= ~15; // align
if (m_elf_header->e_ehsize - header_size >= sizeof(elf_program_id_header))
{
m_f->Seek(header_size, fsSeekMode::fsSeekSet);
m_self_id_header = new elf_program_id_header;
m_f->Read(m_self_id_header, sizeof(elf_program_id_header));
}
}
DebugDump(); DebugDump();
} }
@ -327,4 +351,15 @@ void Elf::DebugDump() {
spdlog::info("sh_entsize .....: {:#018x}\n", (m_elf_shdr + i)->sh_entsize); spdlog::info("sh_entsize .....: {:#018x}\n", (m_elf_shdr + i)->sh_entsize);
} }
} }
if (m_self_id_header != nullptr)
{
spdlog::info("SELF info:\n");
spdlog::info("auth id ............: {:#018x}\n", m_self_id_header->authid);
spdlog::info("program type .......: {:#018x}\n", m_self_id_header->program_type);
spdlog::info("app version ........: {:#018x}\n", m_self_id_header->appver);
spdlog::info("fw version .........: {:#018x}\n", m_self_id_header->firmver);
spdlog::info("digest..............: 0x");
for (int i = 0; i < 32; i++) spdlog::info("{:02x}", m_self_id_header->digest[i]);
spdlog::info("\n");
}
} }

View file

@ -108,6 +108,14 @@ struct elf_section_header
u64 sh_entsize; /* Size of entries, if section has table */ u64 sh_entsize; /* Size of entries, if section has table */
}; };
struct elf_program_id_header
{
u64 authid;
u64 program_type;
u64 appver;
u64 firmver;
u08 digest[32];
};
class Elf class Elf
{ {
public: public:
@ -128,5 +136,6 @@ private:
elf_header* m_elf_header = nullptr; elf_header* m_elf_header = nullptr;
elf_program_header* m_elf_phdr = nullptr; elf_program_header* m_elf_phdr = nullptr;
elf_section_header* m_elf_shdr = nullptr; elf_section_header* m_elf_shdr = nullptr;
elf_program_id_header* m_self_id_header = nullptr;
}; };