From d243fa924e94a9a1826a8c795f387e13032d3c9d Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Fri, 8 Feb 2019 15:29:57 -0500 Subject: [PATCH] refactoring for zipr sdk Former-commit-id: ad5f7de055f7bc135002d0044c24d5768a0e78a6 --- libIRDB-core/src/fileir.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libIRDB-core/src/fileir.cpp b/libIRDB-core/src/fileir.cpp index 73442e61e..581a8a5f8 100644 --- a/libIRDB-core/src/fileir.cpp +++ b/libIRDB-core/src/fileir.cpp @@ -1003,24 +1003,20 @@ void FileIR_t::setArchitecture() libIRDB::FileIR_t::archdesc=new ArchitectureDescription_t; + auto is_elf=false; + auto is_pe=false; + if((e_ident[EI_MAG0]==ELFMAG0) && (e_ident[EI_MAG1]==ELFMAG1) && (e_ident[EI_MAG2]==ELFMAG2) && (e_ident[EI_MAG3]==ELFMAG3)) { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELF); - } - else if((e_ident[EI_MAG0]==ELFMAG0) && - (e_ident[EI_MAG1]=='C') && - (e_ident[EI_MAG2]=='G') && - (e_ident[EI_MAG3]=='C')) - { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELF); + is_elf=true; } else if((e_ident[EI_MAG0]=='M') && (e_ident[EI_MAG1]=='Z')) { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftPE); + is_pe=true; } else { @@ -1029,18 +1025,24 @@ void FileIR_t::setArchitecture() } - if (libIRDB::FileIR_t::archdesc->getFileType() == IRDB_SDK::adftPE) + if (is_pe) // libIRDB::FileIR_t::archdesc->getFileType() == IRDB_SDK::adftPE) { + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftPE); // just assume x86-64 bit for Windows, o/w could also extract from file libIRDB::FileIR_t::archdesc->setBitWidth(64); libIRDB::FileIR_t::archdesc->setMachineType(IRDB_SDK::admtX86_64); } - else + else if(is_elf) { switch(e_ident[4]) { case ELFCLASS32: { + + if(hdr_union.ehdr32.e_type == ET_DYN) + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFSO); + else + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFEXE); libIRDB::FileIR_t::archdesc->setBitWidth(32); if(hdr_union.ehdr32.e_machine!=EM_386) throw std::invalid_argument("Arch not supported. 32-bit archs supported: I386"); @@ -1049,6 +1051,10 @@ void FileIR_t::setArchitecture() } case ELFCLASS64: { + if(hdr_union.ehdr64.e_type == ET_DYN) + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFSO); + else + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFEXE); libIRDB::FileIR_t::archdesc->setBitWidth(64); const auto mt= hdr_union.ehdr64.e_machine==EM_AARCH64 ? IRDB_SDK::admtAarch64 : -- GitLab