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

This commit is contained in:
paolo-projects 2019-09-27 15:31:28 +02:00 committed by Paolo
parent b9c0059fcb
commit d4802acdd7
2 changed files with 128 additions and 100 deletions

View File

@ -71,112 +71,138 @@ def convertpath(path):
# OS path separator replacement funciton # OS path separator replacement funciton
return path.replace(os.path.sep, '/') return path.replace(os.path.sep, '/')
def main(): def main():
# Check minimal Python version is 2.7 # Check minimal Python version is 2.7
if sys.version_info < (2, 7): if sys.version_info < (2, 7):
sys.stderr.write('You need Python 2.7 or later\n') sys.stderr.write('You need Python 2.7 or later\n')
sys.exit(1) sys.exit(1)
dest = os.path.dirname(os.path.abspath(__file__)) dest = os.path.dirname(os.path.abspath(__file__))
# Re-create the tools folder # Re-create the tools folder
shutil.rmtree(dest + '/tools', True) shutil.rmtree(dest + '/tools', True)
os.mkdir(dest + '/tools') os.mkdir(dest + '/tools')
parser = CDSParser() parser = CDSParser()
success = False
n = 1
# Last published version doesn't ship with darwin tools # Last published version doesn't ship with darwin tools
# so in case of error fall back to the latest version that has them # so in case of error get it from the core.vmware.fusion.tar
while (success == False): print('Trying to get tools from the packages folder...')
print('Trying for the '+str(n)+'th time')
# Setup url and file paths # Setup url and file paths
url = 'http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/' url = 'http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/'
# Get the list of Fusion releases # Get the list of Fusion releases
# And get the last item in the ul/li tags # And get the last item in the ul/li tags
response = urlopen(url) response = urlopen(url)
html = response.read() html = response.read()
parser.clean() parser.clean()
parser.feed(str(html)) parser.feed(str(html))
url = url + parser.HTMLDATA[-n] + '/' url = url + parser.HTMLDATA[-1] + '/'
parser.clean() parser.clean()
# Open the latest release page # Open the latest release page
# And build file URL # And build file URL
response = urlopen(url) response = urlopen(url)
html = response.read() html = response.read()
parser.feed(str(html)) parser.feed(str(html))
urlpost15 = url + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwin.zip.tar' lastVersion = parser.HTMLDATA[-1]
urlpre15 = url + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwinPre15.zip.tar'
parser.clean()
# Download the darwin.iso tgz file urlpost15 = url + lastVersion + '/packages/com.vmware.fusion.tools.darwin.zip.tar'
print('Retrieving Darwin tools from: ' + urlpost15) urlpre15 = url + lastVersion + parser.HTMLDATA[-1] + '/packages/com.vmware.fusion.tools.darwinPre15.zip.tar'
try: parser.clean()
urlretrieve(urlpost15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'))
except: # Download the darwin.iso tgz file
print('Link didn\'t work, trying another one...') print('Retrieving Darwin tools from: ' + urlpost15)
n += 1 try:
continue # Try to get tools from packages folder
urlretrieve(urlpost15, convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'))
# Extract the tar to zip except:
tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'), 'r') # No tools found, get em from the core tar
tar.extract('com.vmware.fusion.tools.darwin.zip', path=convertpath(dest + '/tools/')) print('Tools aren\'t here... Be patient while I download and' +
tar.close() ' give a look into the core.vmware.fusion.tar file')
urlcoretar = url + lastVersion + '/core/com.vmware.fusion.zip.tar'
# Extract the iso and sig files from zip try:
cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip'), 'r') # Get the main core file
cdszip.extract('payload/darwin.iso', path=convertpath(dest + '/tools/')) urlretrieve(urlcoretar, convertpath(dest + '/tools/com.vmware.fusion.zip.tar'))
cdszip.extract('payload/darwin.iso.sig', path=convertpath(dest + '/tools/'))
cdszip.close()
# Move the iso and sig files to tools folder print('Extracting com.vmware.fusion.zip.tar...')
shutil.move(convertpath(dest + '/tools/payload/darwin.iso'), convertpath(dest + '/tools/darwin.iso')) tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.zip.tar'), 'r')
shutil.move(convertpath(dest + '/tools/payload/darwin.iso.sig'), convertpath(dest + '/tools/darwin.iso.sig')) tar.extract('com.vmware.fusion.zip', path=convertpath(dest + '/tools/'))
tar.close()
# Cleanup working files and folders print('Extracting files from com.vmware.fusion.zip...')
shutil.rmtree(convertpath(dest + '/tools/payload'), True) cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.zip'), 'r')
os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar')) cdszip.extract('payload/VMware Fusion.app/Contents/Library/isoimages/darwin.iso', path=convertpath(dest + '/tools/'))
os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip')) cdszip.extract('payload/VMware Fusion.app/Contents/Library/isoimages/darwinPre15.iso', path=convertpath(dest + '/tools/'))
cdszip.close()
# Download the darwinPre15.iso tgz file # Move the iso and sig files to tools folder
print('Retrieving DarwinPre15 tools from: ' + urlpre15) shutil.move(convertpath(dest + '/tools/payload/VMware Fusion.app/Contents/Library/isoimages/darwin.iso'), convertpath(dest + '/tools/darwin.iso'))
try: shutil.move(convertpath(dest + '/tools/payload/VMware Fusion.app/Contents/Library/isoimages/darwinPre15.iso'), convertpath(dest + '/tools/darwinPre15.iso'))
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 # Cleanup working files and folders
tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar'), 'r') shutil.rmtree(convertpath(dest + '/tools/payload'), True)
tar.extract('com.vmware.fusion.tools.darwinPre15.zip', path=convertpath(dest + '/tools/')) os.remove(convertpath(dest + '/tools/com.vmware.fusion.zip.tar'))
tar.close() os.remove(convertpath(dest + '/tools/com.vmware.fusion.zip'))
# Extract the iso and sig files from zip print('Tools retrieved successfully')
cdszip = zipfile.ZipFile(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip'), 'r') return
cdszip.extract('payload/darwinPre15.iso', path=convertpath(dest + '/tools/')) except:
cdszip.extract('payload/darwinPre15.iso.sig', path=convertpath(dest + '/tools/')) print('Odds are against you. Sorry.')
cdszip.close() return
# Move the iso and sig files to tools folder # Tools have been found, go with the normal way
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 # Extract the tar to zip
shutil.rmtree(convertpath(dest + '/tools/payload'), True) tar = tarfile.open(convertpath(dest + '/tools/com.vmware.fusion.tools.darwin.zip.tar'), 'r')
os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip.tar')) tar.extract('com.vmware.fusion.tools.darwin.zip', path=convertpath(dest + '/tools/'))
os.remove(convertpath(dest + '/tools/com.vmware.fusion.tools.darwinPre15.zip')) tar.close()
success = True
# 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'))
# 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'))
# 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()
# 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'))
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -44,6 +44,7 @@ Offset Length Struct Type Description
from __future__ import print_function from __future__ import print_function
import codecs import codecs
import os import os
import re
import struct import struct
import sys import sys
@ -55,7 +56,11 @@ if sys.version_info < (2, 7):
if sys.platform == 'win32' \ if sys.platform == 'win32' \
or sys.platform == 'cli': or sys.platform == 'cli':
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
from _winreg import * if sys.version_info > (3, 0):
from winreg import *
else:
from _winreg import *
def bytetohex(data): def bytetohex(data):
@ -301,9 +306,10 @@ def patchbase(name):
f = open(name, 'r+b') f = open(name, 'r+b')
# Entry to search for in GOS table # Entry to search for in GOS table
# Should work for 12 & 14 of Workstation... # Should work for Workstation 12-15...
darwin = b'\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00' \ darwin = re.compile(
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 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 # Read file into string variable
base = f.read() base = f.read()
@ -311,19 +317,15 @@ def patchbase(name):
# Loop through each entry and set top bit # Loop through each entry and set top bit
# 0xBE --> 0xBF (WKS 12) # 0xBE --> 0xBF (WKS 12)
# 0x3E --> 0x3F (WKS 14) # 0x3E --> 0x3F (WKS 14)
offset = 0 for m in darwin.finditer(base):
while offset < len(base): offset = m.start()
offset = base.find(darwin, offset)
if offset == -1:
break
f.seek(offset + 32) f.seek(offset + 32)
flag = ord(f.read(1)) flag = ord(f.read(1))
flag = set_bit(flag, 0) flag = set_bit(flag, 0)
flag = chr(flag) # flag = chr(flag)
f.seek(offset + 32) f.seek(offset + 32)
f.write(flag) f.write(bytes([flag]))
print('GOS Patched flag @: ' + hex(offset)) print('GOS Patched flag @: ' + hex(offset))
offset += 40
# Tidy up # Tidy up
f.flush() f.flush()