@propertydefis_readable(self):""" Whether this section has read permissions """returnTrue@propertydefis_writable(self):""" Whether this section has write permissions """return(self._xbe_sec.header.flags&self._xbe_sec.header.flags.WRITABLE)!=0@propertydefis_executable(self):""" Whether this section has execute permissions """return(self._xbe_sec.header.flags&self._xbe_sec.header.flags.EXECUTABLE)!=0@propertydefonly_contains_uninitialized_data(self):""" We load every section in, they're all initialized """returnFalse
[docs]classXBE(Backend):""" The main loader class for statically loading XBE executables. """is_default=True
[docs]def__init__(self,*args,**kwargs):ifXbeisNone:raiseCLEError("Run `pip install pyxbe==1.0.3` to support loading XBE files")super().__init__(*args,**kwargs)self.set_arch(archinfo.arch_from_id("x86"))self.os="xbox"ifself.binaryisNone:self._xbe=Xbe(data=self._binary_stream.read())else:self._xbe=Xbe.from_file(self.binary)self._entry=self._xbe.entry_addrself._image_vmem=bytearray(self._xbe.header.image_size)self._min_addr=self._xbe.header.base_addrself._max_addr=self._xbe.header.base_addr+self._xbe.header.image_size-1# Add headerself._add_xbe_section(0,self._xbe.header.image_header_size,self._xbe.header.base_addr,self._xbe.header.image_header_size,self._xbe.header_data,)# Add each sectionfor_,secinself._xbe.sections.items():self._add_xbe_section(sec.header.raw_addr,sec.header.raw_size,sec.header.virtual_addr,sec.header.virtual_size,sec.data,sec,)self.memory.add_backer(0,bytes(self._image_vmem))self.mapped_base=self.linked_base=self._xbe.header.base_addr
def_add_xbe_section(self,file_offset,file_size,virtual_addr,virtual_size,backer,sec=None):# Copy in section contentsstart=virtual_addr-self._xbe.header.base_addrend=start+file_sizeself._image_vmem[start:end]=backer# Create a segment and a sectionseg=Segment(file_offset,virtual_addr,file_size,virtual_size)self.segments.append(seg)ifsecisnotNone:sec=XBESection(sec.name,file_offset,file_size,virtual_addr,virtual_size,sec)self.sections.append(sec)