if (base_of_code < base_of_data) and (base_of_code != 0):\r
return base_of_code\r
else:\r
- return base_of_data \r
+ return base_of_data\r
+\r
+class EfiSectionPE64:\r
+ def __init__(self, ec, base_pe64):\r
+ self.ec = ec\r
+ self.base_pe64 = base_pe64\r
+\r
+ def get_debug_filepath(self):\r
+ # Offset from dos hdr to PE file hdr (EFI_IMAGE_NT_HEADERS64)\r
+ #file_header_offset = self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)\r
+ file_header_offset = 0x0\r
+\r
+ # Offset to debug dir in PE hdrs\r
+ debug_dir_entry_rva = self.ec.getMemoryService().readMemory32(self.base_pe64 + file_header_offset + 0x138)\r
+ if debug_dir_entry_rva == 0:\r
+ raise Exception("EfiFileSectionPE64","No Debug Directory")\r
+\r
+ debug_type = self.ec.getMemoryService().readMemory32(self.base_pe64 + debug_dir_entry_rva + 0xC)\r
+ if (debug_type != 0xdf) and (debug_type != EfiFileSection.EFI_IMAGE_DEBUG_TYPE_CODEVIEW):\r
+ raise Exception("EfiFileSectionPE64","Debug type is not dwarf")\r
+ \r
+ \r
+ debug_rva = self.ec.getMemoryService().readMemory32(self.base_pe64 + debug_dir_entry_rva + 0x14)\r
+ \r
+ dwarf_sig = struct.unpack("cccc", self.ec.getMemoryService().read(str(self.base_pe64 + debug_rva), 4, 32))\r
+ if (dwarf_sig != 0x66727764) and (dwarf_sig != FirmwareFile.CONST_NB10_SIGNATURE):\r
+ raise Exception("EfiFileSectionPE64","Dwarf debug signature not found")\r
\r
+ if dwarf_sig == 0x66727764:\r
+ filename = self.base_pe64 + debug_rva + 0xc\r
+ else:\r
+ filename = self.base_pe64 + debug_rva + 0x10\r
+ filename = struct.unpack("200s", self.ec.getMemoryService().read(str(filename), 200, 32))[0]\r
+ return filename[0:string.find(filename,'\0')]\r
+ \r
+ def get_debug_elfbase(self):\r
+ # Offset from dos hdr to PE file hdr\r
+ pe_file_header = self.base_pe64 + self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)\r
+ \r
+ base_of_code = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)\r
+ base_of_data = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)\r
+ \r
+ if (base_of_code < base_of_data) and (base_of_code != 0):\r
+ return base_of_code\r
+ else:\r
+ return base_of_data\r
+ \r
class FirmwareFile:\r
EFI_FV_FILETYPE_RAW = 0x01\r
EFI_FV_FILETYPE_FREEFORM = 0x02\r
except Exception, (ErrorClass, ErrorMessage):\r
if verbose:\r
print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
- pass\r
\r
return debug_info\r
\r
except Exception, (ErrorClass, ErrorMessage):\r
if verbose:\r
print "Error while loading a symbol file (%s: %s)" % (ErrorClass, ErrorMessage)\r
- pass\r
\r