- Published on
Sửa đổi mã nguồn Chromium Vượt qua kiểm tra trình duyệt không có giao diện phổ biến
- Authors
- Name
- Hoàng Hữu Mạnh
Giới thiệu
- Trình duyệt không có giao diện (headless browser) là trình duyệt không có giao diện người dùng, nhưng khi sử dụng làm công cụ thu thập dữ liệu (crawler), nó có thể xuất hiện một số đặc điểm nhận dạng và bị các trang web nhận diện là bot.
- Ở đây, chúng ta sẽ thay đổi mã nguồn của Chromium để xóa bỏ những đặc điểm nhận dạng này.
webdriver
I. Sửa đổi - Mở file
third_party/blink/renderer/core/frame/navigator.cc
//bool Navigator::webdriver() const {
// if (RuntimeEnabledFeatures::AutomationControlledEnabled())
// return true;
//
// bool automation_enabled = false;
// probe::ApplyAutomationOverride(GetExecutionContext(), automation_enabled);
// return automation_enabled;
//}
bool Navigator::webdriver() const {
return false;
}
rtt
II. Sửa đổi - Mở file
third_party/blink/renderer/modules/netinfo/network_information.cc
//uint32_t NetworkInformation::rtt() {
// MaybeShowWebHoldbackConsoleMsg();
// std::optional<base::TimeDelta> override_rtt =
// GetNetworkStateNotifier().GetWebHoldbackHttpRtt();
// if (override_rtt) {
// return GetNetworkStateNotifier().RoundRtt(Host(), override_rtt.value());
// }
//
// if (!IsObserving()) {
// return GetNetworkStateNotifier().RoundRtt(
// Host(), GetNetworkStateNotifier().HttpRtt());
// }
//
// return http_rtt_msec_;
//}
uint32_t NetworkInformation::rtt() {
return 150;
}
Notification.permission
III. Sửa đổi - Mở file
third_party/blink/renderer/modules/notifications/notification.cc
String Notification::PermissionString(
mojom::blink::PermissionStatus permission) {
switch (permission) {
case mojom::blink::PermissionStatus::GRANTED:
return "granted";
case mojom::blink::PermissionStatus::DENIED:
//return "denied";
return "default";
case mojom::blink::PermissionStatus::ASK:
return "default";
}
NOTREACHED();
//return "denied";
return "default";
}
user-agent
IV. Sửa đổi Đối với trình duyệt không có giao diện (Headless Chrome):
- Mở file
C:\\src\\chromium\\src\\headless\\lib\\browser\\headless_browser_impl.cc
Sửa đổi:
//const char kHeadlessProductName[] = "HeadlessChrome";
const char kHeadlessProductName[] = "Chrome";
V. Kiểm tra plugin đối với trình duyệt không có giao diện
- Sửa đổi file
third_party/blink/renderer/modules/plugins/navigator_plugins.cc
// static
//DOMPluginArray* NavigatorPlugins::plugins(Navigator& navigator) {
// return NavigatorPlugins::From(navigator).plugins(navigator.DomWindow());
//}
// static
DOMPluginArray* NavigatorPlugins::plugins(Navigator& navigator) {
DOMPluginArray* pluginsArray = NavigatorPlugins::From(navigator).plugins(navigator.DomWindow());
pluginsArray->UpdatePluginData();
return pluginsArray;
}
- Sửa đổi tiếp file
third_party/blink/renderer/modules/plugins/dom_plugin_array.cc
void DOMPluginArray::UpdatePluginData() {
if (should_return_fixed_plugin_data_) {
dom_plugins_.clear();
//if (IsPdfViewerAvailable()) {
// See crbug.com/1164635 and https://github.com/whatwg/html/pull/6738.
// To reduce fingerprinting and make plugins/mimetypes more
// interoperable, this is the spec'd, hard-coded list of plugins:
Vector<String> plugins{"PDF Viewer", "Chrome PDF Viewer",
"Chromium PDF Viewer", "Microsoft Edge PDF Viewer",
"WebKit built-in PDF"};
for (auto name : plugins)
dom_plugins_.push_back(MakeFakePlugin(name, DomWindow()));
//}
return;
}
}