#!/usr/bin/python import time import sys import struct import binascii # ----------------------------------------------------------------------------------------- # main decrypt class based on hrose sources (brett19 and bdaan # author: evill33t # ----------------------------------------------------------------------------------------- class decrypt(): # ----------------------------------------------------------------------------------------- # Convert byte to hex # ----------------------------------------------------------------------------------------- def convert_to_hex(self,byte): return hex(ord(byte))[2:].upper().zfill(2) # ----------------------------------------------------------------------------------------- # Build a checksum table from a copy of TRose.exe # ----------------------------------------------------------------------------------------- def _buildchecksum(self): # open file and read last 512 bytes try: trose = open(self._trose,'rb') trose.seek(len(trose.read())-0x200) # seek to file end - 512 trose_content = trose.read() trose.close() except: self.log.write('error','openening '+self._trose) raise self.log.write('info','got file content') key = [] key_ct = [0x94, 0x20, 0x5F, 0x53, 0x14, 0xF2, 0x61, 0x11, 0x54, 0xFF, 0x72, 0x99, 0x44, 0xF4, 0xA1, 0xAA, 0xBA, 0xC2, 0x54, 0x52, 0x6F, 0x73, 0x65, 0x2E, 0x65, 0x78, 0x65] key_len = 0x0f for i in xrange(0,key_len+1): key.append(key_ct[i] ^ int(self.convert_to_hex(trose_content[0x18A + i]),16)) self.log.write('debug','key',key) multiplier = 1 checksum_length = 0 i=int(self.convert_to_hex(trose_content[0x0f]),16) while i > 0: tmp = (key[i-1]-0x30)*multiplier; multiplier *= 0x0a checksum_length += tmp i -= 1 csumtable = [0x34, 0x5C, 0x3D, 0x52, 0xCE, 0xF3, 0x12, 0xD4, 0x05, 0x91, 0xEE, 0xFF, 0x49, 0xC2, 0xD2] return_list = [] for i in xrange(0,checksum_length): return_list.append(None) i = 0 tmp = 0 for i in xrange(0,checksum_length): return_list[i] = hex(csumtable[tmp] ^ int(self.convert_to_hex(trose_content[0x87 + i]),16)) if tmp==0x0e: tmp=0 else: tmp +=1 self.log.write('debug','checksumlen',return_list) return return_list # ----------------------------------------------------------------------------------------- # Build a crypttable and cryptstatus from our checksum # ----------------------------------------------------------------------------------------- def _buildcrypttable(self): for i in xrange(0,0x008): crypttable[i]=0 for i in xrange(0,0x100): crypttable[i+8]=i csumpos=0 modifier=0 for i in xrange(0,0x40*4): curpos = crypttable[i+8] modifier = (checksum[csumpos] + curpos + modifier) & 0xff crypttable[8+i] = crypttable[modifier+8] crypttable[modifier+8] = curpos; csumpos=++csumpos%checksumlen # ----------------------------------------------------------------------------------------- # Decrypt a packet # ----------------------------------------------------------------------------------------- def cryptpacket(self): pass def __init__(self,filename,log,debug=0): self.log = log self.debug = debug self._trose = filename self.checksum = self._buildchecksum() def __del__(self): self.log.write('debug','decrypt exit')