Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- import sys, os
- def getEncryptionKey(filename):
- # code to generate substitute key
- #key1 = "lHqyhFGALH5Rv6yNpwvmEcrrK0GiUaevmSs14EVCgvDFntDKWSIn8kHegKeT"
- #key2 = "SjQIOGLW7HEhZm3r3mXilisiv3o1vPaQzMco4hxBSGCjw8D1eC8y9rvZQmXx"
- #key = ""
- #for index in range(0, 60):
- # ck1 = ord(key1[index]) if index%3 is not 1 else 0
- # ck2 = ord(key2[index]) if index%3 is not 0 else 0
- # key += chr(ck1 ^ ck2)
- #print(repr(key))
- if len(filename) > 60:
- print("Filename '{0}' too long".format(filename), file=sys.stderr)
- return None
- # \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
- # \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
- # \x71\x6e\x39\x19\x48\x5a\x36\x4b\x58\x2c
- staticKey = bytearray(b"lj yO\x01GW{HE:vmJN3\x1avi)cs\x1bK3(iv1eQ\x17Sc^4h.CS1Dj\x19tDzWCqn9\x19HZ6KX,")
- filename = bytearray(filename.replace("\\", "/"), "utf-8")
- return bytearray([filename[i] ^ staticKey[i] for i in range(0, len(filename))])
- def getSteamGameDir(appId):
- import _winreg as winreg
- regkeys = [(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App {0}"),
- (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App {0}")]
- path = None
- for regkey in regkeys:
- try:
- hKey = winreg.OpenKey(regkey[0], regkey[1].format(appId))
- path = winreg.QueryValueEx(hKey, "InstallLocation")[0]
- print("Found game directory in HKLM\\{0}: {1}".format(regkey[1].format(appId), path), file=sys.stderr)
- hKey.Close()
- break
- except WindowsError as e:
- continue
- if path is None:
- print("Couldn't find the game path in the registry", file=sys.stderr)
- return None
- return path
- # performance results:
- # unbuffered read(1)s: 6.9s
- # buffered reads with fixed size: 3.8s
- # buffered reads with a multiple of keyLen: 2.1s
- # (the additional counter variable seems to cost a lot)
- def decryptFile(src, dest, key):
- with open(src, 'rb') as srcFile:
- with open(dest, 'wb') as destFile:
- keyLen = len(key)
- i = 0
- read = bytearray(srcFile.read(4096*keyLen))
- readLen = len(read)
- write = bytearray()
- while readLen is not 0:
- while i < readLen:
- write.append(read[i]^key[i%keyLen])
- i += 1
- i = 0
- destFile.write(write)
- read = bytearray(srcFile.read(4096*keyLen))
- readLen = len(read)
- write = bytearray()
- if __name__ == "__main__":
- path = getSteamGameDir(63000)
- if not path:
- print("Could not find game directory, aborting...", file=sys.stderr)
- sys.exit(-1)
- encryptedDataPath = os.path.join(path, "encrypteddata")
- dataPath = os.path.join(path, "data")
- files = 0
- skipped = 0
- import time
- timestart = time.time()
- for dir in os.walk(encryptedDataPath):
- for file in dir[2]:
- relPath = os.path.join(dir[0][len(encryptedDataPath)+1:], file)
- destDir = os.path.join(dataPath, dir[0][len(encryptedDataPath)+1:])
- destPath = os.path.join(destDir, file)
- if os.path.exists(destPath):
- print("Skipping existing file {0}".format(relPath), file=sys.stderr)
- skipped += 1
- continue
- print("Decrypting {0}...".format(relPath), file=sys.stderr, end='')
- if not os.path.exists(destDir):
- os.makedirs(destDir)
- decryptFile(os.path.join(dir[0], file),
- destPath,
- getEncryptionKey(relPath))
- print(" done", file=sys.stderr)
- files += 1
- print("Done. Decrypted {0} files ({1} skipped).".format(files, skipped), file=sys.stderr)
- print("Took {0}.".format(time.time()-timestart), file=sys.stderr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement