Advertisement
Guest User

HOARD datafile decryptor

a guest
Dec 23rd, 2011
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.63 KB | None | 0 0
  1. from __future__ import print_function
  2. import sys, os
  3.  
  4. def getEncryptionKey(filename):
  5.     # code to generate substitute key
  6.     #key1 = "lHqyhFGALH5Rv6yNpwvmEcrrK0GiUaevmSs14EVCgvDFntDKWSIn8kHegKeT"
  7.     #key2 = "SjQIOGLW7HEhZm3r3mXilisiv3o1vPaQzMco4hxBSGCjw8D1eC8y9rvZQmXx"
  8.     #key = ""
  9.    
  10.     #for index in range(0, 60):
  11.     #   ck1 = ord(key1[index]) if index%3 is not 1 else 0
  12.     #   ck2 = ord(key2[index]) if index%3 is not 0 else 0
  13.     #   key += chr(ck1 ^ ck2)
  14.    
  15.     #print(repr(key))
  16.    
  17.     if len(filename) > 60:
  18.         print("Filename '{0}' too long".format(filename), file=sys.stderr)
  19.         return None
  20.    
  21.     # \x6c\x6a\x20\x79\x4f\x01\x47\x57\x7b\x48\x45\x3a\x76\x6d\x4a\x4e\x33\x1a\x76\x69\x29\x63\x73\x1b\x4b
  22.     # \x33\x28\x69\x76\x31\x65\x51\x17\x53\x63\x5e\x34\x68\x2e\x43\x53\x31\x44\x6a\x19\x74\x44\x7a\x57\x43
  23.     # \x71\x6e\x39\x19\x48\x5a\x36\x4b\x58\x2c
  24.     staticKey = bytearray(b"lj yO\x01GW{HE:vmJN3\x1avi)cs\x1bK3(iv1eQ\x17Sc^4h.CS1Dj\x19tDzWCqn9\x19HZ6KX,")
  25.     filename = bytearray(filename.replace("\\", "/"), "utf-8")
  26.    
  27.     return bytearray([filename[i] ^ staticKey[i] for i in range(0, len(filename))])
  28.  
  29. def getSteamGameDir(appId):
  30.     import _winreg as winreg
  31.  
  32.     regkeys = [(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App {0}"),
  33.                (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App {0}")]
  34.    
  35.     path = None
  36.    
  37.     for regkey in regkeys:
  38.         try:
  39.             hKey = winreg.OpenKey(regkey[0], regkey[1].format(appId))
  40.             path = winreg.QueryValueEx(hKey, "InstallLocation")[0]
  41.             print("Found game directory in HKLM\\{0}: {1}".format(regkey[1].format(appId), path), file=sys.stderr)
  42.             hKey.Close()
  43.             break
  44.         except WindowsError as e:
  45.             continue
  46.    
  47.     if path is None:
  48.         print("Couldn't find the game path in the registry", file=sys.stderr)
  49.         return None
  50.    
  51.     return path
  52.  
  53. # performance results:
  54. # unbuffered read(1)s: 6.9s
  55. # buffered reads with fixed size: 3.8s
  56. # buffered reads with a multiple of keyLen: 2.1s
  57. # (the additional counter variable seems to cost a lot)
  58. def decryptFile(src, dest, key):
  59.     with open(src, 'rb') as srcFile:
  60.         with open(dest, 'wb') as destFile:
  61.             keyLen = len(key)
  62.             i = 0
  63.             read = bytearray(srcFile.read(4096*keyLen))
  64.             readLen = len(read)
  65.             write = bytearray()
  66.             while readLen is not 0:
  67.                 while i < readLen:
  68.                     write.append(read[i]^key[i%keyLen])
  69.                     i += 1
  70.                 i = 0
  71.                 destFile.write(write)
  72.                 read = bytearray(srcFile.read(4096*keyLen))
  73.                 readLen = len(read)
  74.                 write = bytearray()
  75.  
  76.  
  77. if __name__ == "__main__":
  78.     path = getSteamGameDir(63000)
  79.     if not path:
  80.         print("Could not find game directory, aborting...", file=sys.stderr)
  81.         sys.exit(-1)
  82.     encryptedDataPath = os.path.join(path, "encrypteddata")
  83.     dataPath = os.path.join(path, "data")
  84.     files = 0
  85.     skipped = 0
  86.     import time
  87.     timestart = time.time()
  88.     for dir in os.walk(encryptedDataPath):
  89.         for file in dir[2]:
  90.             relPath = os.path.join(dir[0][len(encryptedDataPath)+1:], file)
  91.             destDir = os.path.join(dataPath, dir[0][len(encryptedDataPath)+1:])
  92.             destPath = os.path.join(destDir, file)
  93.             if os.path.exists(destPath):
  94.                 print("Skipping existing file {0}".format(relPath), file=sys.stderr)
  95.                 skipped += 1
  96.                 continue
  97.             print("Decrypting {0}...".format(relPath), file=sys.stderr, end='')
  98.             if not os.path.exists(destDir):
  99.                 os.makedirs(destDir)
  100.             decryptFile(os.path.join(dir[0], file),
  101.                         destPath,
  102.                         getEncryptionKey(relPath))
  103.             print(" done", file=sys.stderr)
  104.             files += 1
  105.     print("Done. Decrypted {0} files ({1} skipped).".format(files, skipped), file=sys.stderr)
  106.     print("Took {0}.".format(time.time()-timestart), file=sys.stderr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement