填坑黑苹果(VMware装MacOS) - 修改 Unlocker 补丁源码版

时间:2022-04-22 18:48:27

最近闲的突然想找点事来折腾一下, 于是随着苹果的发布会就盯上自己手上的 iPhone, 也想弄个 Mac 来搞 IOS. 于是就有了这个填坑故事.

为什么要修改补丁源码:

  1. 不再苦苦去寻找和下载 drawn.iso 文件, 虽然我会告诉你这里可以下载到官网的;
  2. 遇到个错误, 既然也是搞 python 的, 那自己当然也要动手动手了.

1. 安装前

1. 安装环境

  • Windows 10
  • VMware Pro 14

2. 系统硬件配置

  • 内存推荐 16G 以上
  • 硬盘预留 40G 以上
  • CPU推荐 i5 8th以上

3. 安装 MacOS 必备包

  • VMware Pro 14

填壹号坑: Unlocker 的最新版本 v3.0.2 仅支持 VMware 的 12~14 版本(终端输出的, 本人之前用的是15的, 总是报各种错, 所以就发现了这个坑).

一定要使用 Pro 版本, Player 版本安装的黑苹果不稳定, 经常会自动重启..

VMware pro 14 官网下载地址

  • MacOS 系统镜像 (6G左右大小)
  1. cdr [推荐], 懒人安装包, 因为易装, 麻烦少.

填贰号坑: 试过使用神马HFSExplorer将dmg 转cdr的工具, 结果那工具不行, 老是弹出 error 框. 于是就搜索下载别人发的 cdr包进行安装

  1. dmg, 原始镜像, 没有试过这个格式的安装, 不了解填这个坑
  2. ISO, 可以使用 UltraISO 工具将 dmg 格式转为 iso 格式, 然后进行安装, 但是中途遇到了 boot 问题, 于是换用cdr 进行安装
  • MacOS Unlocker for VMware, 简称 Unlocker

能够让 VMware 选择 Mac 系统进行安装的补丁

Unlocker 在 github 的下载地址

windows 选择第一个 unlocker302.zip 进行下载即可

2. 安装

1. 安装 VMware Pro 14, 并注册

此处网络上教程挺多, 安装也不复杂, 过程很顺利

注册看个人了, 惯用方式是网上搜索密钥进行注册, 密钥如:
ZC5XK-A6E0M-080XQ-04ZZG-YF08D ;
ZY5H0-D3Y8K-M89EZ-AYPEG-MYUA8 .

2. 安装 Unlocker

  1. 使用超级管理员运行 cmd.

在任务栏的搜索框中, 搜索 cmd, 然后右击使用管理员运行 cmd

解压已经下载的 unlocker, 并在 刚才打开的终端中 cd 到目录下

执行 win-install.cmd

  1. 终端报错了

看到终端有 Successfully, Finished 等词, 先不要高兴太早, 因为那整句话是否定的.

报错内容有:

  • ***.*** 文件权限问题

    哪一个文件的权限出了问题, 就找到它并给它添加权限就可以了.

    操作步骤: 右击选择属性 --> 选择安全选项卡 --> 点击编辑 --> 选择 Everyone (组或用户名) --> 允许完全控制.

  • 没有找到 drawn*.* 文件

    看了一下终端是访问了 http://*** 链接之后才报的错误, 认为是访问超时了结果重试了几次都不行, 然后打开浏览器进行访问该链接, 结果浏览器返回 not found. 一脸懵逼, 简直坑爹啊

    填叁号坑: 解决办法 - 修改源码后重新编译打包exe
    修改文件: gettools.py, 修改后的完整代码放在最后, 有中文注释.
    思路: 访问问题, 那就修改访问的链接; 由于VMware 服务器识别 UA, 所以伪装 UA.
    打包exe: 需要 python3.x 环境, 依赖包: requests, PyInstaller; 打包命令 pyinstaller -F gettools.py
    替换 gettools.exe 文件: 打包 exe 后, 会生成 dist 文件夹, 找到里面的 exe 文件, 替换 unlocker 文件夹中的 gettools.exe 文件

    补充: 安装依赖包的命令: pip3 install requests; pip3 install PyInstaller; 打包exe 前, 需要打开终端并切换目录到 gettools.py 文件所在目录下.

3. 安装 mac

  1. 运行 VMware 并创建新的虚拟机
  2. CD/DVD 处选择 cdr 文件, 然后启动虚拟系统
  3. 安装虚拟系统过程中出现的问题
  • 虚拟系统启动, 虚拟机报错问题:

打开 ***.vmx 文本文件, 添加 smc.version = "0" 配置项

  • 安装盘问题:

选择菜单栏上的实用工具 --> 然后选择 VMware 硬盘 --> 点击抹掉按钮 --> 输入一个英文名称即可

  1. 安装 VMTools

关机mac, 在 CD/DVD 处选择 VMware Pro 安装目录下的 darwn.iso (Unlocker 生成的文件), 我的安装目录是 C:Program Files (x86)VMwareVMware Workstation

开机, 打开桌面上的光盘进行安装, 所以 drawn.iso 是用来安装 VMTools 插件的.

4. 屏幕大小, 分辨率问题

在VMware里装 VMTools 后发现全屏时的分辨率是 950 (HiDPI) 的, 在设置/显示器/缩放中, 点击1920 的死活切换不了

打开终端依次输入以下命令:

cd /Library/Preferences, 切换目录.
plutil -p com.apple.windowserver.plist 查看现在的plist设置, 值应该是 1.
sudo plutil -replace DisplayResolutionEnabled -bool "NO" com.apple.windowserver.plist 修改plist 设置为 0.

重启生效.

gettools.py

from __future__ import print_function

import os
import shutil
import sys
import tarfile
import zipfile

# 添加处, 方便伪装 User-Agent
import requests


# 添加处
def download_drawn(url, path):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
    }
    resp = requests.get(url, headers=headers, timeout=180)
    with open(path, "wb") as fp:
        fp.write(resp.content)


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 latern')
        sys.exit(1)

    # Setup url and file paths
    url = 'http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/'
    dest = os.path.dirname(os.path.abspath(__file__))

    # Re-create the tools folder
    shutil.rmtree(dest   '/tools', True)
    os.mkdir(dest   '/tools')

    # 删改处
    urlpost15 = url   '11.1.0/13668589'   '/packages/com.vmware.fusion.tools.darwin.zip.tar'
    urlpre15 = url   '11.1.0/13668589'   '/packages/com.vmware.fusion.tools.darwinPre15.zip.tar'

    # Download the darwin.iso tgz file
    print('Retrieving Darwin tools from: '   urlpost15)
    # 修改处
    download_drawn(urlpost15, convertpath(dest   '/tools/com.vmware.fusion.tools.darwin.zip.tar'))

    # 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()

    # 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)
    # 修改处
    download_drawn(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__':
    main()