我遇到了一个问题,在我修改它后,Chromedriver将在启动时立即死亡,而不是被网站检测到。
为了访问我的银行网站上的数据,我构建了一个基于java的工具,它使用Selenium和Chromedriver。我的银行正在使用一些机器人检测软件,所以如果你只是运行常规的chromedriver,你就会被检测到,它会抛出一个通用的错误。在我旧的英特尔Mac上,为了解决这个问题,我只需运行这个命令,一切都会正常工作:
perl -pi -e 's/cdc_/dog_/g' `which chromedriver`
当我在我的苹果硅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
还原命令,它将再次开始运行。
╭─ 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仍然会启动,但bot检测逻辑将不起作用。
我在修改之前和之后在chromedriver之间做了一个差异,并且没有看到重大差异(英特尔和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
我看了看控制台,似乎运行perl命令足以修改包,使代码签名无效。根据控制台,进程被终止的原因是:
Exception Type: EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid))
目前还不清楚为什么这在英特尔机器上没有问题。
我在谷歌上搜索了一下,可以去掉旧的签名并强制使用"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代码签名需求。