Skip to content

Commit 9391238

Browse files
committed
Add the underlying executable format in the abstract layer
API changes (Python/C++): * lief.Binary.format * LIEF::ELF::Binary::format()
1 parent bcbeb66 commit 9391238

File tree

11 files changed

+71
-24
lines changed

11 files changed

+71
-24
lines changed

Diff for: api/python/Abstract/objects/pyBinary.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ using it_t = T (Binary::*)(void);
3232

3333
void init_LIEF_Binary_class(py::module& m) {
3434
py::class_<Binary>(m, "Binary")
35+
36+
.def_property_readonly("format",
37+
&Binary::format,
38+
"File format " RST_CLASS_REF(lief.EXE_FORMATS) " of the underlying binary.")
39+
3540
.def_property("name",
3641
static_cast<getter_t<const std::string&>>(&Binary::name),
3742
static_cast<setter_t<const std::string&>>(&Binary::name),

Diff for: api/python/Abstract/pyEnums.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020
#define PY_ENUM(x) LIEF::to_string(x), x
2121

2222
void init_LIEF_Enum(py::module& m) {
23-
py::enum_<LIEF::FILE_FORMATS>(m, "FILE_FORMATS")
24-
.value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_ELF))
25-
.value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_PE))
26-
.value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_MACHO))
23+
py::enum_<LIEF::EXE_FORMATS>(m, "EXE_FORMATS")
24+
.value(PY_ENUM(LIEF::EXE_FORMATS::FORMAT_UNKNOWN))
25+
.value(PY_ENUM(LIEF::EXE_FORMATS::FORMAT_ELF))
26+
.value(PY_ENUM(LIEF::EXE_FORMATS::FORMAT_PE))
27+
.value(PY_ENUM(LIEF::EXE_FORMATS::FORMAT_MACHO))
2728
.export_values();
2829

2930
py::enum_<LIEF::OBJECT_TYPES>(m, "OBJECT_TYPES")

Diff for: doc/sphinx/api/cpp/abstract.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Symbol
4444
Enums
4545
*****
4646

47-
.. doxygenenum:: LIEF::FILE_FORMATS
47+
.. doxygenenum:: LIEF::EXE_FORMATS
4848
:project: lief
4949

5050
.. doxygenenum:: LIEF::OBJECT_TYPES

Diff for: doc/sphinx/api/python/abstract.rst

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ Enums
5353
*****
5454

5555

56-
File Formats
57-
~~~~~~~~~~~~
56+
Executable formats
57+
~~~~~~~~~~~~~~~~~~
5858

59-
.. autoclass:: lief.FILE_FORMATS
59+
.. autoclass:: lief.EXE_FORMATS
6060
:members:
6161
:inherited-members:
6262
:undoc-members:

Diff for: include/LIEF/Abstract/Binary.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ class DLL_PUBLIC Binary : public Visitable {
4141
Binary& operator=(const Binary&);
4242
Binary(const Binary&);
4343

44+
//! @brief Executable format (ELF, PE, Mach-O) of the underlying binary
45+
EXE_FORMATS format(void) const;
46+
4447
//! @brief Return the abstract header of the binary
4548
Header get_header(void) const;
4649

Diff for: include/LIEF/Abstract/EnumToString.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "LIEF/Abstract/enums.hpp"
2121

2222
namespace LIEF {
23-
DLL_PUBLIC const char* to_string(FILE_FORMATS e);
23+
DLL_PUBLIC const char* to_string(EXE_FORMATS e);
2424
DLL_PUBLIC const char* to_string(ARCHITECTURES e);
2525
DLL_PUBLIC const char* to_string(OBJECT_TYPES e);
2626
DLL_PUBLIC const char* to_string(MODES e);

Diff for: include/LIEF/Abstract/enums.hpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020

2121
namespace LIEF {
2222

23-
enum FILE_FORMATS {
24-
FORMAT_ELF = 0,
25-
FORMAT_PE = 1,
26-
FORMAT_MACHO = 2
23+
enum EXE_FORMATS {
24+
FORMAT_UNKNOWN = 0,
25+
FORMAT_ELF = 1,
26+
FORMAT_PE = 2,
27+
FORMAT_MACHO = 3,
2728
};
2829

2930
enum OBJECT_TYPES {

Diff for: src/Abstract/Binary.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,35 @@
1616
#include "LIEF/Abstract/Binary.hpp"
1717
#include "LIEF/exception.hpp"
1818

19+
#include "LIEF/ELF/Binary.hpp"
20+
#include "LIEF/PE/Binary.hpp"
21+
#include "LIEF/MachO/Binary.hpp"
22+
1923
namespace LIEF {
2024
Binary::Binary(void) :
25+
name_{""},
2126
original_size_{0}
2227
{}
28+
2329
Binary::~Binary(void) = default;
2430
Binary& Binary::operator=(const Binary&) = default;
2531
Binary::Binary(const Binary&) = default;
2632

33+
EXE_FORMATS Binary::format(void) const {
34+
if (typeid(*this) == typeid(LIEF::ELF::Binary)) {
35+
return EXE_FORMATS::FORMAT_ELF;
36+
}
37+
38+
if (typeid(*this) == typeid(LIEF::PE::Binary)) {
39+
return EXE_FORMATS::FORMAT_PE;
40+
}
41+
42+
if (typeid(*this) == typeid(LIEF::MachO::Binary)) {
43+
return EXE_FORMATS::FORMAT_MACHO;
44+
}
45+
46+
return EXE_FORMATS::FORMAT_UNKNOWN;
47+
}
2748

2849
Header Binary::get_header(void) const {
2950
return this->get_abstract_header();

Diff for: src/Abstract/EnumToString.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818

1919
namespace LIEF {
2020

21-
const char* to_string(FILE_FORMATS e) {
22-
const std::map<FILE_FORMATS, const char*> enumStrings {
23-
{ FILE_FORMATS::FORMAT_ELF, "ELF" },
24-
{ FILE_FORMATS::FORMAT_PE, "PE" },
25-
{ FILE_FORMATS::FORMAT_MACHO, "MACHO" },
21+
const char* to_string(EXE_FORMATS e) {
22+
const std::map<EXE_FORMATS, const char*> enumStrings {
23+
{ EXE_FORMATS::FORMAT_UNKNOWN, "UNKNOWN" },
24+
{ EXE_FORMATS::FORMAT_ELF, "ELF" },
25+
{ EXE_FORMATS::FORMAT_PE, "PE" },
26+
{ EXE_FORMATS::FORMAT_MACHO, "MACHO" },
2627
};
2728
auto it = enumStrings.find(e);
2829
return it == enumStrings.end() ? "UNDEFINED" : it->second;

Diff for: src/visitors/json.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ void JsonVisitor::visit(const Binary& binary) {
5050

5151
this->node_["name"] = binary.name();
5252
this->node_["entrypoint"] = binary.entrypoint();
53+
this->node_["format"] = to_string(binary.format());
5354
this->node_["original_size"] = binary.original_size();
5455
this->node_["exported_functions"] = binary.get_exported_functions();
5556
this->node_["imported_libraries"] = binary.get_imported_libraries();

Diff for: tests/abstract/abstract_tests.py

+20-6
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,42 @@ class TestAbstract(TestCase):
1919
def setUp(self):
2020
self.logger = logging.getLogger(__name__)
2121

22+
@staticmethod
23+
def get_abstract_binary(binary):
24+
return super(binary.__class__, binary)
25+
2226
def test_endianness(self):
23-
binary = lief.parse(get_sample('ELF/ELF32_x86_binary_ls.bin'))
24-
binary = super(binary.__class__, binary)
27+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('ELF/ELF32_x86_binary_ls.bin')))
2528
header = binary.header
2629

2730
self.assertEqual(header.endianness, lief.ENDIANNESS.LITTLE)
2831

2932

30-
binary = lief.parse(get_sample('MachO/MachO64_x86-64_binary_id.bin'))
31-
binary = super(binary.__class__, binary)
33+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('MachO/MachO64_x86-64_binary_id.bin')))
3234
header = binary.header
3335

3436
self.assertEqual(header.endianness, lief.ENDIANNESS.LITTLE)
3537

3638

37-
binary = lief.parse(get_sample('PE/PE64_x86-64_binary_ConsoleApplication1.exe'))
38-
binary = super(binary.__class__, binary)
39+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('PE/PE64_x86-64_binary_ConsoleApplication1.exe')))
3940
header = binary.header
4041

4142
self.assertEqual(header.endianness, lief.ENDIANNESS.LITTLE)
4243

4344

45+
def test_format(self):
46+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('ELF/ELF32_x86_binary_ls.bin')))
47+
self.assertEqual(binary.format, lief.EXE_FORMATS.ELF)
48+
49+
50+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('MachO/MachO64_x86-64_binary_id.bin')))
51+
self.assertEqual(binary.format, lief.EXE_FORMATS.MACHO)
52+
53+
54+
binary = TestAbstract.get_abstract_binary(lief.parse(get_sample('PE/PE64_x86-64_binary_ConsoleApplication1.exe')))
55+
self.assertEqual(binary.format, lief.EXE_FORMATS.PE)
56+
57+
4458
if __name__ == '__main__':
4559

4660
root_logger = logging.getLogger()

0 commit comments

Comments
 (0)