当 cdc_ 修改时,Chromedriver 在 Apple Silicon 上被杀死

Chromedriver killed on Apple Silicon when cdc_ modified

我运行遇到一个问题,在我将 Chromedriver 修改为不被网站检测为机器人后,它会在启动时立即死亡。

为了在我的银行网站上访问我的数据,我构建了一个基于 java 的工具,该工具使用 Selenium 和 Chromedriver。我的银行正在使用一些机器人检测软件,所以如果你只是 运行 常规的 chromedriver,你会被检测到并且会抛出一个一般错误。在我的旧 Intel Mac 上,为了解决这个问题,我只需 运行 这个命令,一切都会起作用:

perl -pi -e 's/cdc_/dog_/g' `which chromedriver`

当我 运行 在我的 Apple Silicon Mac 上执行此操作时,chromedriver 在启动时立即被杀死

╭─ motopascyyy@mbp2022 ➜ ~
➜ perl -pi -e 's/cdc_/dog_/g' `which chromedriver`
╭─ motopascyyy@mbp2022 ➜ ~
➜ chromedriver
[1]    16612 killed     chromedriver

如果我使用 perl -pi -e 's/dog_/cdc_/g' /path/to/chromedriver 恢复命令,它将再次启动 运行ning。

╭─ motopascyyy@mbp2022 ➜ ~
137 x  perl -pi -e 's/dog_/cdc_/g' `which chromedriver`
╭─ motopascyyy@mbp2022 ➜ ~
➜ chromedriver
Starting ChromeDriver 101.0.4951.41 (93c720db8323b3ec10d056025ab95c23a31997c9-refs/branch-heads/4951@{#904}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

根据对几个不同线程的建议,我更改了 perl 命令以查找 $cdc_ 而不是 $dog_,虽然 chromedriver 仍会启动,但机器人检测逻辑不会没用。

chromedriver修改前后对比了一下,没有发现大的区别(Intel和Appel Silicon看起来都一样)

63464c63464
<   var key = '$cdc_asdjflasutopfhvcZLmcfl_';
---
>   var key = '$dog_asdjflasutopfhvcZLmcfl_';
63504c63504
<   const Symbol = window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol || window.Symbol;
---
>   const Symbol = window.dog_adoQpoasnfa76pfcZLmcfl_Symbol || window.Symbol;
63531c63531
<     const Array = window.cdc_adoQpoasnfa76pfcZLmcfl_Array || window.Array;
---
>     const Array = window.dog_adoQpoasnfa76pfcZLmcfl_Array || window.Array;
63688c63688
<   const Promise = window.cdc_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;
---
>   const Promise = window.dog_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;
63757c63757
<   const Promise = window.cdc_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;
---
>   const Promise = window.dog_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;
63829c63829
<     const Promise = window.cdc_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;
---
>     const Promise = window.dog_adoQpoasnfa76pfcZLmcfl_Promise || window.Promise;

有没有其他人遇到过类似的问题?

编辑 2022-05-09

我查看了控制台,似乎 运行ning perl 命令修改了包足以使代码签名无效。根据控制台,进程被杀死是因为:

Exception Type:        EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid))

不清楚为什么这在 Intel 机器上不是问题。

做了一些 google-ing 并且可以删除旧签名并强制使用“ad-hoc”签名。之后,chromedriver 就可以运行供个人使用了。

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
codesign --remove-signature /path/to/chromedriver
codesign --force --deep -s - /path/to/chromedriver

这会修改可执行文件、删除签名并添加新签名。以下是我收集这些命令的链接:

https://eclecticlight.co/2020/11/03/code-signatures-3-fixing-signature-problems/ https://www.purebasic.fr/english/viewtopic.php?t=78137

今天刚买的M1遇到了同样的问题,我一直在原地转圈。我买了那个M1 Powerbook来开发爬虫作业,所以我很沮丧。感谢您让我了解 M1 代码签名要求。