From d4802acdd7ff5b1e90c5cd11dc0795fb56dc3ff1 Mon Sep 17 00:00:00 2001 From: paolo-projects Date: Fri, 27 Sep 2019 15:31:28 +0200 Subject: [PATCH] Applied @mkitchingh patch to unlocker.py and updated gettools.py to look into core com.vmware.fusion.zip if tools are not found. Rebuilt unlocker.exe and gettools.exe --- gettools.py | 202 +++++++++++++++++++++++++++++----------------------- unlocker.py | 26 +++---- 2 files changed, 128 insertions(+), 100 deletions(-) diff --git a/gettools.py b/gettools.py index 0eb82da..75eebdd 100755 --- a/gettools.py +++ b/gettools.py @@ -71,112 +71,138 @@ def convertpath(path): # OS path separator replacement funciton return path.replace(os.path.sep, '/') - def main(): - # Check minimal Python version is 2.7 - if sys.version_info < (2, 7): - sys.stderr.write('You need Python 2.7 or later\n') - sys.exit(1) + # Check minimal Python version is 2.7 + if sys.version_info < (2, 7): + sys.stderr.write('You need Python 2.7 or later\n') + sys.exit(1) - dest = os.path.dirname(os.path.abspath(__file__)) + dest = os.path.dirname(os.path.abspath(__file__)) - # Re-create the tools folder - shutil.rmtree(dest + '/tools', True) - os.mkdir(dest + '/tools') + # Re-create the tools folder + shutil.rmtree(dest + '/tools', True) + os.mkdir(dest + '/tools') - parser = CDSParser() - success = False - n = 1 + parser = CDSParser() - # Last published version doesn't ship with darwin tools - # so in case of error fall back to the latest version that has them - while (success == False): - print('Trying for the '+str(n)+'th time') + # Last published version doesn't ship with darwin tools + # so in case of error get it from the core.vmware.fusion.tar + print('Trying to get tools from the packages folder...') - # Setup url and file paths - url = 'http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/' + # Setup url and file paths + url = 'http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/' - # Get the list of Fusion releases - # And get the last item in the ul/li tags - - response = urlopen(url) - html = response.read() - parser.clean() - parser.feed(str(html)) - url = url + parser.HTMLDATA[-n] + '/' - parser.clean() + # Get the list of Fusion releases + # And get the last item in the ul/li tags + + response = urlopen(url) + html = response.read() + parser.clean() + parser.feed(str(html)) + url = url + parser.HTMLDATA[-1] + '/' + parser.clean() - # Open the latest release page - # And build file URL - response = urlopen(url) - html = response.read() - parser.feed(str(html)) - - urlpost15 = url + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwin.zip.tar' - urlpre15 = url + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwinPre15.zip.tar' - parser.clean() + # Open the latest release page + # And build file URL + response = urlopen(url) + html = response.read() + parser.feed(str(html)) + + lastVersion = parser.HTMLDATA[-1] + + urlpost15 = url + lastVersion + '/packages/com.vmware.fusion.tools.darwin.zip.tar' + urlpre15 = url + lastVersion + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwinPre15.zip.tar' + parser.clean() - # Download the darwin.iso tgz file - print('Retrieving Darwin tools from: ' + urlpost15) - try: - urlretrieve(urlpost15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar')) + # Download the darwin.iso tgz file + print('Retrieving Darwin tools from: ' + urlpost15) + try: + # Try to get tools from packages folder + urlretrieve(urlpost15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar')) - except: - print('Link didn\'t work, trying another one...') - n += 1 - continue + except: + # No tools found, get em from the core tar + print('Tools aren\'t here... Be patient while I download and' + + ' give a look into the core.vmware.fusion.tar file') + urlcoretar = url + lastVersion + '/core/com.vmware.fusion.zip.tar' + + try: + # Get the main core file + urlretrieve(urlcoretar, convertpath(dest + '/tools/com.vmware.fusion.zip.tar')) + + print('Extracting com.vmware.fusion.zip.tar...') + tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.zip.tar'), 'r') + tar.extract('com.vmware.fusion.zip', path=convertpath(dest + '/tools/')) + tar.close() + + print('Extracting files from com.vmware.fusion.zip...') + cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.zip'), 'r') + cdszip.extract('payload/VMware Fusion.app/Contents/Library/isoimages/darwin.iso', path=convertpath(dest + '/tools/')) + cdszip.extract('payload/VMware Fusion.app/Contents/Library/isoimages/darwinPre15.iso', path=convertpath(dest + '/tools/')) + cdszip.close() + + # Move the iso and sig files to tools folder + shutil.move(convertpath(dest + '/tools/payload/VMware Fusion.app/Contents/Library/isoimages/darwin.iso'), convertpath(dest + '/tools/darwin.iso')) + shutil.move(convertpath(dest + '/tools/payload/VMware Fusion.app/Contents/Library/isoimages/darwinPre15.iso'), convertpath(dest + '/tools/darwinPre15.iso')) + + # Cleanup working files and folders + shutil.rmtree(convertpath(dest + '/tools/payload'), True) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.zip.tar')) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.zip')) + + print('Tools retrieved successfully') + return + except: + print('Odds are against you. Sorry.') + return + + # Tools have been found, go with the normal way + + # Extract the tar to zip + tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'), 'r') + tar.extract('com.vmware.fusion.tools.darwin.zip', path=convertpath(dest + '/tools/')) + tar.close() - # Extract the tar to zip - tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'), 'r') - tar.extract('com.vmware.fusion.tools.darwin.zip', path=convertpath(dest + '/tools/')) - tar.close() + # Extract the iso and sig files from zip + cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip'), 'r') + cdszip.extract('payload/darwin.iso', path=convertpath(dest + '/tools/')) + cdszip.extract('payload/darwin.iso.sig', path=convertpath(dest + '/tools/')) + cdszip.close() - # Extract the iso and sig files from zip - cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip'), 'r') - cdszip.extract('payload/darwin.iso', path=convertpath(dest + '/tools/')) - cdszip.extract('payload/darwin.iso.sig', path=convertpath(dest + '/tools/')) - cdszip.close() + # Move the iso and sig files to tools folder + shutil.move(convertpath(dest + '/tools/payload/darwin.iso'), convertpath(dest + '/tools/darwin.iso')) + shutil.move(convertpath(dest + '/tools/payload/darwin.iso.sig'), convertpath(dest + '/tools/darwin.iso.sig')) - # Move the iso and sig files to tools folder - shutil.move(convertpath(dest + '/tools/payload/darwin.iso'), convertpath(dest + '/tools/darwin.iso')) - shutil.move(convertpath(dest + '/tools/payload/darwin.iso.sig'), convertpath(dest + '/tools/darwin.iso.sig')) + # Cleanup working files and folders + shutil.rmtree(convertpath(dest + '/tools/payload'), True) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar')) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip')) - # Cleanup working files and folders - shutil.rmtree(convertpath(dest + '/tools/payload'), True) - os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar')) - os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip')) + # Download the darwinPre15.iso tgz file + print('Retrieving DarwinPre15 tools from: ' + urlpre15) + urlretrieve(urlpre15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar')) - # Download the darwinPre15.iso tgz file - print('Retrieving DarwinPre15 tools from: ' + urlpre15) - try: - urlretrieve(urlpre15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar')) - except: - print('Link didn\'t work, trying another one...') - n += 1 - continue + # Extract the tar to zip + tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar'), 'r') + tar.extract('com.vmware.fusion.tools.darwinPre15.zip', path=convertpath(dest + '/tools/')) + tar.close() - # Extract the tar to zip - tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar'), 'r') - tar.extract('com.vmware.fusion.tools.darwinPre15.zip', path=convertpath(dest + '/tools/')) - tar.close() + # Extract the iso and sig files from zip + cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip'), 'r') + cdszip.extract('payload/darwinPre15.iso', path=convertpath(dest + '/tools/')) + cdszip.extract('payload/darwinPre15.iso.sig', path=convertpath(dest + '/tools/')) + cdszip.close() - # Extract the iso and sig files from zip - cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip'), 'r') - cdszip.extract('payload/darwinPre15.iso', path=convertpath(dest + '/tools/')) - cdszip.extract('payload/darwinPre15.iso.sig', path=convertpath(dest + '/tools/')) - cdszip.close() + # Move the iso and sig files to tools folder + shutil.move(convertpath(dest + '/tools/payload/darwinPre15.iso'), + convertpath(dest + '/tools/darwinPre15.iso')) + shutil.move(convertpath(dest + '/tools/payload/darwinPre15.iso.sig'), + convertpath(dest + '/tools/darwinPre15.iso.sig')) - # Move the iso and sig files to tools folder - shutil.move(convertpath(dest + '/tools/payload/darwinPre15.iso'), - convertpath(dest + '/tools/darwinPre15.iso')) - shutil.move(convertpath(dest + '/tools/payload/darwinPre15.iso.sig'), - convertpath(dest + '/tools/darwinPre15.iso.sig')) - - # Cleanup working files and folders - shutil.rmtree(convertpath(dest + '/tools/payload'), True) - os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar')) - os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip')) - success = True + # Cleanup working files and folders + shutil.rmtree(convertpath(dest + '/tools/payload'), True) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar')) + os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip')) if __name__ == '__main__': main() diff --git a/unlocker.py b/unlocker.py index decbc51..b786fa3 100755 --- a/unlocker.py +++ b/unlocker.py @@ -44,6 +44,7 @@ Offset Length Struct Type Description from __future__ import print_function import codecs import os +import re import struct import sys @@ -55,7 +56,11 @@ if sys.version_info < (2, 7): if sys.platform == 'win32' \ or sys.platform == 'cli': # noinspection PyUnresolvedReferences - from _winreg import * + if sys.version_info > (3, 0): + from winreg import * + else: + from _winreg import * + def bytetohex(data): @@ -301,9 +306,10 @@ def patchbase(name): f = open(name, 'r+b') # Entry to search for in GOS table - # Should work for 12 & 14 of Workstation... - darwin = b'\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00' \ - '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + # Should work for Workstation 12-15... + darwin = re.compile( + b'\x10\x00\x00\x00[\x10|\x20]\x00\x00\x00[\x01|\x02]\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') # Read file into string variable base = f.read() @@ -311,19 +317,15 @@ def patchbase(name): # Loop through each entry and set top bit # 0xBE --> 0xBF (WKS 12) # 0x3E --> 0x3F (WKS 14) - offset = 0 - while offset < len(base): - offset = base.find(darwin, offset) - if offset == -1: - break + for m in darwin.finditer(base): + offset = m.start() f.seek(offset + 32) flag = ord(f.read(1)) flag = set_bit(flag, 0) - flag = chr(flag) +# flag = chr(flag) f.seek(offset + 32) - f.write(flag) + f.write(bytes([flag])) print('GOS Patched flag @: ' + hex(offset)) - offset += 40 # Tidy up f.flush()