Advertisement
Guest User

Untitled

a guest
Dec 11th, 2013
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.59 KB | None | 0 0
  1.  
  2. def split_as_size(arr,size):return arr[:size],arr[size:]
  3.  
  4. def bytes_to_int(bytes):
  5.     #fill this in later.
  6.     # I'm rusty on how python handles bytes tbh
  7.     r,place=0,len(bytes)-1
  8.     for i in range(place,0,-1):
  9.         r+= (255**place) * int(bytes[i])#I think this works.
  10.     return r
  11.  
  12. class IPS:
  13.     MAGIC = b'\x50\x41\x54\x43\x48'
  14.     END = b'\x45\x4f\x46'
  15.     @classmethod
  16.     def create_from_stream(cls,stream):
  17.         return cls.create_from_bytes(stream.read())
  18.     @classmethod
  19.     def create_from_bytes(cls,byte_array):
  20.         def extract_chunk(arr):
  21.             offset,arr=split_as_size(arr,3)
  22.             size,arr=split_as_size(arr,2)
  23.             data,arr=split_as_size(arr,size)
  24.             return Chunk(offset,data),arr
  25.         def pull_all_chunks(arr):
  26.             while len(arr)>3:
  27.                 chunk,byte_array=extract_chunk(arr)
  28.                 yield chunk
  29.         return cls(list(pull_all_chunks(byte_array)))
  30.     def __init__(self,chunks):self.chunks = chunks
  31.     def apply(self,arr):
  32.         for chunk in self.chunks:
  33.             arr[chunk.position:chunk.position+chunk.size]=chunk.data
  34.         return arr
  35.  
  36. if __name__=="__main__":
  37.     from sys import argv;argv=argv[1:]
  38.     from os.path import isfile
  39.     patches,target=[],None
  40.     for filename in argv:
  41.         if not isfile(filename):continue
  42.         if filename[:filename.rfind(".")].lower()=='ips':
  43.             patches.append(filename)
  44.         else:target=filename
  45.     if target and patches:
  46.         base_data = open(target,'rb').read()#read in the data to modify.
  47.         for patch in map(IPS.create_from_stream,map(lambda fn:open(fn,'rb'),patches)):
  48.             base_data=patch.apply(base_data)
  49.         with open('patched-{}-{}'.format("-".join(map(patch_name,patches)),target),'wb') as output:
  50.             output.write(base_data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement