- Published on
Sửa đổi mã nguồn Chromium để sửa phiên bản lớn
- Authors
- Name
- Hoàng Hữu Mạnh
- Blog trước đã hướng dẫn cách thay đổi phiên bản nhỏ của Chromium: Liên kết tới bài viết
- Tuy nhiên, đã có nhiều bạn thử mô phỏng trình duyệt trên điện thoại và WeChat, và cần mô phỏng một phiên bản Chromium cũ hơn.
- Tôi đã từng thử thay đổi phiên bản lớn, nhưng gặp một số vấn đề, vì vậy đã trì hoãn. Hôm nay tôi sẽ ghi lại quá trình nghiên cứu này.
I. Vị trí mã nguồn
Chắc chắn bạn đã tìm được các tệp chứa thông tin phiên bản nhân Chromium:
\components\version_info\version_info_with_user_agent.cc
\third_party\blink\renderer\core\frame\navigator_ua.cc
Thay đổi phiên bản nhân:
return base::StrCat(
//{"Chrome/", GetMajorVersionNumber(), ".0.", build_version, ".0"});
{"Chrome/", "106.0.5249.62"});
// ua_data->SetBrandVersionList(metadata.brand_version_list);
UserAgentBrandList uabl;
uabl.emplace_back("chromium", "106");
uabl.emplace_back("Chrome", "106");
ua_data->SetBrandVersionList(uabl);
// ua_data->SetUAFullVersion("106." + String(std::to_string(randomNum % 99)) +".6572.0");
ua_data->SetUAFullVersion("106." + String("0") +".5249.62");
Sau khi biên dịch, bạn có thể thấy rằng phiên bản lớn của trình duyệt đã thay đổi thành công.
- Kiểm tra chống nhận diện dấu vân tay:
- Kiểm tra bằng browserscan:
- Kiểm tra bằng creepjs:
Lưu ý: Việc thay đổi phiên bản nhân thành công, nhưng phát hiện rằng creepjs và browserscan không thể vượt qua việc kiểm tra chống nhận diện dấu vân tay.
II. Sự khác biệt giữa các phiên bản cũ và mới
- Creepjs đã chỉ rõ lý do không qua được kiểm tra, tính năng của phiên bản v106 khác biệt với tính năng của phiên bản trình duyệt hiện tại.
- Ví dụ về hàm
JSON.rawJSON
, phiên bản nhân v106 không có hàm này vì đây là tính năng mới trong phiên bản 115. Khi phát hiện hàm này trong trình duyệt phiên bản 106, rất rõ ràng đây là dấu hiệu thay đổi.
III. Xem mã nguồn của creepjs
- Mã nguồn của creepjs có thể được tìm thấy tại: https://github.com/abrahamjuliot/creepjs
- Tìm kiếm trong mã nguồn của creepjs trong tệp
\creepjs\src\features\index.ts
- Các tính năng JS mới trong từng phiên bản nhân:
const blinkJS = {
'76': ['Document.onsecuritypolicyviolation', 'Promise.allSettled'],
'77': ['Document.onformdata', 'Document.onpointerrawupdate'],
// Các tính năng khác...
};
- Các tính năng CSS mới trong từng phiên bản nhân:
const blinkCSS = {
'76': ['backdrop-filter'],
'77-80': ['overscroll-behavior-block', 'overscroll-behavior-inline'],
// Các tính năng khác...
};
- Các tính năng cửa sổ mới trong từng phiên bản nhân:
const blinkWindow = {
'80': ['CompressionStream', 'DecompressionStream', 'FeaturePolicy', 'FragmentDirective'],
// Các tính năng khác...
};
Lưu ý: Các tính năng mới ở trên chỉ là một số ví dụ, không phải là tất cả.
IV. Tổng kết
- Để thay đổi phiên bản lớn từ cao xuống thấp, bạn cần loại bỏ các tính năng của phiên bản cao hơn. Ngược lại, có thể nghiên cứu thêm nếu cần.
- Phiên bản lớn có thể điều chỉnh nhỏ, ví dụ giữa các phiên bản 123-125 hầu như không có sự thay đổi, tôi chọn chuyển qua lại giữa chúng.
- Để thay đổi giữa nhiều phiên bản, giải pháp cuối cùng mà tôi đề xuất là tải mã nguồn của phiên bản Chromium cũ, rồi biên dịch lại.