All pastes #766213 Raw Edit

Unnamed

public python v1 · immutable
·published 2007-11-08 18:33 UTC
rendered paste body
import syssys.path.append('..\\..')from PyStand import Structuint16 = Struct.uint16uint32 = Struct.uint32import XBECODE = 0x00000020INITDATA = 0x00000040UNINITDATA = 0x00000080COMMENTS = 0x00000200NOFINAL = 0x00000800DISCARD = 0x02000000SHAREABLE = 0x10000000EXECUTABLE = 0x20000000READABLE = 0x40000000WRITABLE = 0x80000000class ImageFileHeader(Struct):	__endian__ = Struct.LE	def __format__(self):		self.machine, self.numberOfSections = uint16[2]		self.timestamp, self.symtab, self.numsyms = uint32[3]		self.optHdrSize, self.characteristics = uint16[2]class ImageOptionalHeader(Struct):	__endian__ = Struct.LE	def __format__(self):		self.Magic = uint16		self.LinkerVersion = Struct.uint8[2]		self.SizeOfCode, self.SizeOfInitializedData = uint32[2]		self.SizeOfUninitializedData = uint32		self.AddressOfEntryPoint = uint32		self.BaseOfCode, self.BaseOfData = uint32[2]		self.ImageBase, self.SectionAlignment, self.FileAlignment = uint32[3]		self.OperatingSystemVersion = uint16[2]		self.ImageVersion = uint16[2]		self.SubsystemVersion = uint16[2]		self.Reserved = uint32		self.SizeOfImage, self.SizeOfHeaders, self.Checksum = uint32[3]		self.Subsystem, self.DllCharacteristics = uint16[2]		self.SizeOfStackReserve, self.SizeOfStackCommit = uint32[2]		self.SizeOfHeapReserve, self.SizeOfHeapCommit = uint32[2]		self.LoaderFlags, self.NumberOfRvaAndSizes = uint32[2]		self.DataDirectory = uint32[32]	class ImageSectionHeader(Struct):	__endian__ = Struct.LE	def __format__(self):		self.Name = Struct.string(8, stripNulls=True)		self.VirtualSize, self.VirtualAddress = uint32[2]		self.SizeOfRawData, self.RawData = uint32[2]		self.Relocations, self.Linenumbers = uint32[2]		self.NumRelocations, self.NumLinenumbers = uint16[2]		self.Characteristics = uint32class ImageImportDirectory(Struct):	__endian__ = Struct.LE	def __format__(self):		RVAFunctionNameList = uint32		useless = uint32[2]		RVAModuleName = uint32		RVAFunctionAddressList = uint32class PE(object):	def __init__(self, xbe):		self.xbe = xbe		def write(self, fp):		fp.write('MZ')		fp.write('\0' * 58)		fp.write(uint32(64))				imgheader = ImageFileHeader()		imgheader.machine = 0x14C # x86		imgheader.numberOfSections = len(self.xbe.sections) + 1 # +1 for import directory		imgheader.timestamp = 0		imgheader.symtab = 0		imgheader.numsyms = 0		imgheader.characteristics = 0x0003 # No relocations and executable				imgoptheader = ImageOptionalHeader()		imgheader.optHdrSize = len(imgoptheader)				imgoptheader.Magic = 0x010B		imgoptheader.AddressOfEntryPoint = self.xbe.entry - self.xbe.base		imgoptheader.ImageBase = self.xbe.base		imgoptheader.SectionAlignment = 1		imgoptheader.FileAlignment = 1		imgoptheader.OperatingSystemVersion[0] = 1		imgoptheader.SubsystemVersion = [3, 1]		imgoptheader.SizeOfImage = 0		imgoptheader.Subsystem = 2 # Windows GUI		imgoptheader.DllCharacteristics = 0xF		imgoptheader.SizeOfStackReserve = 0x100000		imgoptheader.SizeOfStackCommit  = 0x100000		imgoptheader.SizeOfHeapReserve  = 0x100000		imgoptheader.SizeOfHeapCommit   = 0x001000		imgoptheader.NumberOfRvaAndSizes = 0				imgsectheader = ImageSectionHeader()				imgoptheader.SizeOfHeaders  = 64 + 4 + len(imgheader) + len(imgoptheader)		imgoptheader.SizeOfHeaders += (len(imgsectheader) * len(self.xbe.sections))				dirBase = max(sect.addr + sect.size for sect in self.xbe.sections.values())		imgoptheader.DataDirectory[2] = dirBase		imgoptheader.DataDirectory[3] = 0				fp.write('PE\0\0')		fp.write(imgheader.pack())		fp.write(imgoptheader.pack())				sectpos = fp.tell() + (len(imgsectheader) * len(self.xbe.sections))				for sect in self.xbe.sections.values():			imgsectheader.Name = sect.name			imgsectheader.VirtualSize = sect.size			imgsectheader.VirtualAddress = sect.addr - self.xbe.base			imgsectheader.SizeOfRawData = len(sect.data)			imgsectheader.RawData = sectpos			imgsectheader.Characteristics = READABLE			imgsectheader.Characteristics |= (sect.flags & XBE.EXECUTABLE and EXECUTABLE) or 0			imgsectheader.Characteristics |= (sect.flags & XBE.WRITABLE and WRITABLE) or 0			imgsectheader.Characteristics |= (sect.flags & XBE.PRELOAD and INITDATA) or 0			fp.write(imgsectheader.pack())			sectpos += len(sect.data)				for sect in self.xbe.sections.values():			fp.write(sect.data)