如何使用脚本下载 Chrome 个独立的可执行文件而不损坏文件?

How to download Chrome standalone executables using a script without getting broken files?

几周前,我使用 curl 创建了一个批处理脚本,用于下载我能找到的所有 Chrome 可执行文件,以防万一 Chrome 被更新搞砸了。

在 运行 脚本之后,我没有检查可执行文件是否 运行 正常,因为我假设它们不会有问题。因此,在让脚本堆积 Chrome 版本之后,就在几天前,当我尝试安装旧版本的 Chrome 时,我大吃一惊。 None 脚本下载的文件有效。每次我尝试 运行 它们时,我都会收到“未知安装程序错误”。

这是脚本:

@echo off
set date_and_time=#1_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%.#2
md "%USERPROFILE%\Chrome_old_versions\"
set dirct="%USERPROFILE%\Chrome_old_versions\Chrome_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%"
md "%dirct%"
cd "%dirct%"
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup64}.{exe} -o %date_and_time% 
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/beta/{googlechromebeta}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/release2/q/canary/{googlechrome}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/dev/{googlechromedev}.{dmg} -o %date_and_time%

这让我很好奇为什么它不起作用,所以我在 Chrome 中访问了 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,这让我得到了一个完美运行的 exe。奇怪的是,通过 Chrome 下载的两个 exe 和 curl 都具有相同的 sha 512 哈希值。 当我感到困惑时,我尝试了 wget 和 powershell 脚本。

对于wget,我试过:

wget https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe --no-check-certificate

,这让我再次遇到“未知安装程序错误”。

感谢@John Seerden,然后我使用了他的 powershell script,它下载了一个 googlechromestandaloneenterprise64.msi 可运行的可执行文件。 看到这里,我将他脚本中的googlechromestandaloneenterprise64.msi URL换成https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,还是报错

$uri = "https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi"

if (-not $PSScriptRoot) {
    $PSScriptRoot = Split-Path -Parent -Path $script:MyInvocation.MyCommand.Definition
}
$outFile = "$PSScriptRoot\googlechromestandaloneenterprise64.msi"

Start-BitsTransfer -Source $uri -Destination $outFile

Start-Process -FilePath $outFile -Args "/qn" -Wait

我什至尝试使用 wget 和 curl 下载 https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi,但仍然出现错误。

谷歌搜索后,我找到了 this post,它说明了有关获取未标记安装程序的内容,我认为它是通过 curl 或 wget 等第 3 方程序下载的,结束了在提示“未知安装程序错误”时。

经过更多谷歌搜索后,我找到了 post,但我没有使用 Charles,而是使用 Chrome Dev Tools 从“网络”选项卡获取 curl 请求。这也不起作用,同样的错误。

有没有什么方法可以通过脚本下载完全正常的 运行 Chrome 可执行文件,或者有什么方法可以修复损坏的可执行文件? 我宁愿不求助于无头的东西 Chrome.

我使用 WinMerge 比较了这两个独立的 Chrome exe,版本分别为 86.0.4240.111 - 64 位和 87.0.4280.66 - 64 位 ChromeStandaloneSetup64_28-10-2020_14.24.03_valid_Copy_old_version.exe (从 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe - broken exe aka missing the download URL tags within the exe) and ChromeStandaloneSetup64_valid_Copy_latest_version.exe (downloaded from https://www.google.com/chrome/?standalone=1&platform=win64 下载 - 有效的 exe aka exe,其中包含下载 URL 标签。

作为比较,这里有一个带标签的下载 URL:

https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B04A7785F-B8A2-B4AA-7A45-17861EB0DE70%7D%26lang%3Dro%26browser%3D4%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Ddefaultbrowser/chrome/install/ChromeStandaloneSetup64.exe

这是一个未标记的下载 URL:

https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe

在 WinMerge 中,我在 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(右侧的文件)中搜索“&lang=ro&browser”,然后我转到编辑 > Select 线差 (F4),然后合并 > 复制到左侧。接下来,我转到文件 > 另存为 > 将左侧另存为...

然后我在新的 Windows 7 虚拟机 (VM) 中 运行 生成的 exe(已修补的 exe,版本为 86.0.4240.111 64 位),这次它安装正确。出于测试目的,我关闭了网络,当转到 Chrome > 帮助 > 关于 Chrome 中的 3 点菜单时,确实,Chrome 是旧版本。之后,我打开网络,它一直更新到最新版本,87.0.4280.66 64位,运行没问题。

尽管 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(有效的 exe)带有区域标识符备用数据流(ADS),但与损坏的 exe 不同,生成的 exe 是损坏的 exe,缺少 ADS,运行 在虚拟机中完全没问题。关于 ADS,我下载了相同的有效 Chrome exe 两次(87.0.4280.66 64 位),我注意到 ADS 具有相同的确切值。

我还做了额外的测试,我注意到如果生成的 exe 缺少 appguid 和 iid 字段,它将无法安装。

我做的另一件事是弄乱各个字段中的值,所以我将 appguid 和 iid 字段设置为如下所示:

appguid={00000000-0000-0000-0000-000000000000}&iid={00000000-0000-0000-0000-000000000000}

,导致可执行文件无法安装,得到错误代码:0x80070057。

当我处理完 exe 编辑后,我开始处理 URL。

至于这个给定的URL,来自https://www.google.com/chrome/?standalone=1&platform=win64 (有效的 exe):

https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B04A7785F-B8A2-B4AA-7A45-17861EB0DE70%7D%26lang%3Dro%26browser%3D4%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Ddefaultbrowser/chrome/install/ChromeStandaloneSetup64.exe

我精简了 appguid 和 iid,得到:

https://dl.google.com/tag/s/lang%3Dro%26browser%3D4%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Ddefaultbrowser/chrome/install/ChromeStandaloneSetup64.exe

,导致exe文件损坏,得到与上述相同的错误代码,错误代码:0x80070057。

接下来我要做的是 https://codebeautify.org/generate-random-data-from-regexp 并使用此模式生成 运行dom appguid 和 iid(使用十六进制值,因为我注意到它在那些字段中被使用) :

[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[ 0-9A-F]{12}

,然后使用两个不同的数字:

038C42B4-AF87-AD38-990A-4384A7E29E04 - 对于 appguid

EC7C4A9D-76CB-FBA7-D1C2-70EB689DA8F4 - 对于 iid

,我得到了这个 link:

https://dl.google.com/tag/s/appguid%3D%7B038C42B4-AF87-AD38-990A-4384A7E29E04%7D%26iid%3D%7BEC7C4A9D-76CB-FBA7-D1C2-70EB689DA8F4%7D%26lang%3Dro%26browser%3D4%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Ddefaultbrowser/chrome/install/ChromeStandaloneSetup64.exe

,在安装过程中出现“无法连接到 Internet。如果您使用防火墙,请将 GoogleUpdate.exe 列入白名单”的错误。

所以,由于 appguid 和 iid 来自 Chrome 的更高版本(appguid 和 iid 从 87.0.4280.66 中获取并插入到 86.0.4240.111),我假设,只有在以下情况下安装才会成功完成包含在 exe 本身中的 appguid 和 iid,通过安装期间的计算,将产生与存储在 exe 中某处的值相匹配的结果,或者在安装期间也得到计算的值。我之所以这样说,是因为当我安装来自损坏的 exe 的生成的有效独立 Chrome exe 时,网络已关闭,并且该系统上没有预先安装 Chrome。或者这两个值可能以某种方式与操作系统相关联。

我的结论是,我想我最终会用那些 appguid 和 iid 修改批处理文件中的 URLs,除非我决定仔细查看 URLs Chrome 即将发布的版本,以便更好地了解所有这些是如何工作的。

这些:

8A69D345-D564-463C-AFF1-A69D9E530F96 - 适用于 appguid

04A7785F-B8A2-B4AA-7A45-17861EB0DE70 - 用于 iid

$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "http://dl.google.com/chrome/install/375.126/chrome_installer.exe" -OutFile $Path$Installer; Start-Process -FilePath $Path$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path$Installer

该过程完成后,您将在桌面上看到“Google Chrome”图标。单击并 运行 它