Published on

Sửa đổi mã nguồn Chromium để sửa phiên bản lớn

Authors
  • avatar
    Name
    Hoàng Hữu Mạnh
    Twitter
  • 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

  1. 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
  2. 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.

  1. 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 browserscan

  • Kiểm tra bằng creepjs:

Kiểm tra bằng creepjs 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.

Kiểm tra sự khác biệt giữa các phiên bản

III. Xem mã nguồn của creepjs

  1. 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...
};
  1. 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...
};
  1. 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

  1. Để 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.
  2. 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.
  3. Để 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.