Advertisement
NWPlayer123

pyGecko Rewrite Prog 1

Sep 15th, 2015
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.15 KB | None | 0 0
  1. import socket, struct
  2.  
  3. class TCPGecko:
  4.     def __init__(self, *args):
  5.         self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
  6.         self.s.connect((str(args[0]), 7331)) #IP, 1337 reversed, Cafiine uses 7332+
  7.  
  8.     def readmem(self, address, length): #Number of bytes
  9.         if length == 0: raise BaseException("Reading memory requires a length (# of bytes)")
  10.         if not self.validrange(address, length): raise BaseException("Address range not valid")
  11.         if not self.validaccess(address, length, "read"): raise BaseException("Cannot read from address")
  12.         ret = ""
  13.         if length > 0x400:
  14.             print("Length is greater than 0x400 bytes, need to read in chunks")
  15.             print("Start address:   " + hexstr0(address))
  16.             for i in range(length / 0x400): #Number of blocks, ignores extra
  17.                 self.s.send(b"\x04") #cmd_readmem
  18.                 request = struct.pack(">II", address, address + 0x400)
  19.                 self.s.send(request)
  20.                 status = self.s.recv(1)
  21.                 if   status == "\xbd": ret += self.s.recv(0x400)
  22.                 elif status == "\xb0": ret += "\x00" * 0x400
  23.                 else: raise BaseException("Something went terribly wrong")
  24.                 address += 0x400;length -= 0x400
  25.                 print("Current address: " + hexstr0(address))
  26.             if length != 0: #Now read the last little bit
  27.                 self.s.send(b"\x04")
  28.                 request = struct.pack(">II", address, address + length)
  29.                 self.s.send(request)
  30.                 status = self.s.recv(1)
  31.                 if   status == "\xbd": ret += self.s.recv(length)
  32.                 elif status == "\xb0": ret += "\x00" * length
  33.                 else: raise BaseException("Something went terribly wrong")
  34.             print("Finished!")
  35.         else:
  36.             self.s.send(b"\x04")
  37.             request = struct.pack(">II", address, address + length)
  38.             self.s.send(request)
  39.             status = self.s.recv(1)
  40.             if   status == "\xbd": ret += self.s.recv(length)
  41.             elif status == "\xb0": ret += "\x00" * length
  42.             else: raise BaseException("Something went terribly wrong")
  43.         return ret
  44.            
  45.        
  46.     def get_symbol(self, rplname, symname, data = 0): #Don't need to specify data
  47.         self.s.send(b"\x71") #cmd_getsymbol
  48.         request = struct.pack(">II", 8, 8 + len(rplname) + 1) #Pointers
  49.         request += rplname.encode("UTF-8") + b"\x00"
  50.         request += symname.encode("UTF-8") + b"\x00"
  51.         size = struct.pack(">B", len(request))
  52.         data = struct.pack(">B", data)
  53.         self.s.send(size) #Read this many bytes
  54.         self.s.send(request) #Get this symbol
  55.         self.s.send(data) #Is it data?
  56.         address = self.s.recv(4)
  57.         return ExportedSymbol(address, self, rplname, symname)
  58.  
  59.     def call(self, address, *args):
  60.         arguments = list(args)
  61.         if len(arguments) > 8: #Use the big call function
  62.             while len(arguments) != 16:
  63.                 arguments.append(0)
  64.             self.s.send(b"\x72")
  65.             address = struct.unpack(">I", address)[0]
  66.             request = struct.pack(">I16I", address, *arguments)
  67.             self.s.send(request)
  68.             reply = self.s.recv(8)
  69.             return struct.unpack(">I", reply[:4])[0]
  70.         else: #Use the normal one that dNet client uses
  71.             while len(arguments) != 8:
  72.                 arguments.append(0)
  73.             self.s.send(b"\x70")
  74.             address = struct.unpack(">I", address)[0]
  75.             request = struct.pack(">I8I", address, *arguments)
  76.             self.s.send(request)
  77.             reply = self.s.recv(8)
  78.             return struct.unpack(">I", reply[:4])[0]
  79.  
  80.     def validrange(self, address, length):
  81.         if   0x01000000 <= address and address + length <= 0x01800000: return True
  82.         elif 0x0E000000 <= address and address + length <= 0x10000000: return True #Depends on game
  83.         elif 0x10000000 <= address and address + length <= 0x4B000000: return True #Doesn't quite go to 5
  84.         elif 0xE0000000 <= address and address + length <= 0xE4000000: return True
  85.         elif 0xE8000000 <= address and address + length <= 0xEA000000: return True
  86.         elif 0xF4000000 <= address and address + length <= 0xF6000000: return True
  87.         elif 0xF6000000 <= address and address + length <= 0xF6800000: return True
  88.         elif 0xF8000000 <= address and address + length <= 0xFB000000: return True
  89.         elif 0xFB000000 <= address and address + length <= 0xFB800000: return True
  90.         elif 0xFFFE0000 <= address and address + length <= 0xFFFFFFFF: return True
  91.         else: return False
  92.  
  93.     def validaccess(self, address, length, access):
  94.         if   0x01000000 <= address and address + length <= 0x01800000:
  95.             if access.lower() == "read":  return True
  96.             if access.lower() == "write": return False
  97.         elif 0x0E000000 <= address and address + length <= 0x10000000: #Depends on game, may be EG 0x0E3
  98.             if access.lower() == "read":  return True
  99.             if access.lower() == "write": return False
  100.         elif 0x10000000 <= address and address + length <= 0x4B000000:
  101.             if access.lower() == "read":  return True
  102.             if access.lower() == "write": return True
  103.         elif 0xE0000000 <= address and address + length <= 0xE4000000:
  104.             if access.lower() == "read":  return True
  105.             if access.lower() == "write": return False
  106.         elif 0xE8000000 <= address and address + length <= 0xEA000000:
  107.             if access.lower() == "read":  return True
  108.             if access.lower() == "write": return False
  109.         elif 0xF4000000 <= address and address + length <= 0xF6000000:
  110.             if access.lower() == "read":  return True
  111.             if access.lower() == "write": return False
  112.         elif 0xF6000000 <= address and address + length <= 0xF6800000:
  113.             if access.lower() == "read":  return True
  114.             if access.lower() == "write": return False
  115.         elif 0xF8000000 <= address and address + length <= 0xFB000000:
  116.             if access.lower() == "read":  return True
  117.             if access.lower() == "write": return False
  118.         elif 0xFB000000 <= address and address + length <= 0xFB800000:
  119.             if access.lower() == "read":  return True
  120.             if access.lower() == "write": return False
  121.         elif 0xFFFE0000 <= address and address + length <= 0xFFFFFFFF:
  122.             if access.lower() == "read":  return True
  123.             if access.lower() == "write": return True
  124.         else: return False
  125.        
  126.        
  127.                
  128. def hexstr0(data): #0xFFFFFFFF, uppercase hex string
  129.     return "0x" + hex(data).lstrip("0x").rstrip("L").zfill(8).upper()
  130.  
  131. class ExportedSymbol(object):
  132.     def __init__(self, address, rpc=None, rplname=None, symname=None):
  133.         self.address = address
  134.         self.rpc     = rpc
  135.         self.rplname = rplname
  136.         self.symname = symname
  137.         print(symname + " address: " + hexstr0(struct.unpack(">I", address)[0]))
  138.  
  139.     def __call__(self, *args):
  140.         return self.rpc.call(self.address, *args) #Pass in arguments, run address
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement