Skip to content

Commit c069f3a

Browse files
adding header bytes to SmdaReport for future processing
1 parent 5588331 commit c069f3a

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

smda/common/BinaryInfo.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,12 @@ def isInCodeAreas(self, address):
7575
else:
7676
is_inside = any([a[0] <= address < a[1] for a in self.code_areas])
7777
return is_inside
78+
79+
def getHeaderBytes(self):
80+
if self.raw_data:
81+
lief_result = lief.parse(self.raw_data)
82+
if isinstance(lief_result, lief.PE.Binary):
83+
return self.raw_data[:0x400]
84+
elif isinstance(lief_result, lief.ELF.Binary):
85+
return self.raw_data[:0x40]
86+
return None

smda/common/SmdaReport.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class SmdaReport(object):
5555
timestamp = None
5656
version = None
5757
xcfg = None
58+
xheader = None
5859

5960
# on first usage, initialize codexrefs objects for all functions based on inrefs/outrefs (requires knowledge about all functions)
6061
_has_codexrefs = False
@@ -95,6 +96,7 @@ def __init__(self, disassembly=None, config=None, buffer=None):
9596
self.timestamp = datetime.datetime.now(datetime.timezone.utc)
9697
self.version = disassembly.binary_info.version
9798
self.xcfg = self._convertCfg(disassembly, config=config)
99+
self.xheader = disassembly.binary_info.getHeaderBytes()
98100

99101
def _convertCfg(self, disassembly, config=None):
100102
function_results = {}
@@ -257,6 +259,7 @@ def fromDict(cls, report_dict) -> Optional["SmdaReport"]:
257259
binary_info.binary_size = smda_report.binary_size
258260
binary_info.oep = smda_report.oep
259261
smda_report.xcfg = {int(function_addr): SmdaFunction.fromDict(function_dict, binary_info=binary_info, version=smda_report.smda_version, smda_report=smda_report) for function_addr, function_dict in report_dict["xcfg"].items()}
262+
smda_report.xheader = bytes.fromhex(report_dict["xheader"]) if "xheader" in report_dict else None
260263
return smda_report
261264

262265
def toDict(self) -> dict:
@@ -289,7 +292,8 @@ def toDict(self) -> dict:
289292
"statistics": self.statistics.toDict(),
290293
"status": self.status,
291294
"timestamp": self.timestamp.strftime("%Y-%m-%dT%H-%M-%S"),
292-
"xcfg": {function_addr: smda_function.toDict() for function_addr, smda_function in self.xcfg.items()}
295+
"xcfg": {function_addr: smda_function.toDict() for function_addr, smda_function in self.xcfg.items()},
296+
"xheader": self.xheader.hex(),
293297
}
294298

295299
@classmethod

tests/testFileFormatParsers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44
import os
5+
import lief
56
import unittest
67

78
from smda.utility.FileLoader import FileLoader
@@ -46,6 +47,10 @@ def testPeParsingWithCutwail(self):
4647
binary_info.code_areas = loader.getCodeAreas()
4748
binary_info.oep = binary_info.getOep()
4849
cutwail_binary_info = binary_info
50+
# parse bytes of 0x400 truncated PE header
51+
pe_header = lief.parse(binary_info.getHeaderBytes())
52+
assert pe_header.dos_header.magic == 0x5A4D
53+
assert pe_header.header.machine == 0x14C
4954
cutwail_disassembly = disasm._disassemble(binary_info)
5055
cutwail_unmapped_disassembly = disasm.disassembleUnmappedBuffer(cutwail_binary)
5156
assert cutwail_unmapped_disassembly.num_functions == 33

0 commit comments

Comments
 (0)