Перейти к содержимому

Движок

Наш браузерный движок

ARMANOS Browser это сборка Chromium, которую мы компилируем сами. Машина вашего профиля стоит внутри самого браузера, в его коде на C++, и сайт получает её ещё до того, как выполнит первую строку своего скрипта.
ARMANOS Browser 153.0.7978.0
Движок
39 файлов исходников, в одном и том же порядке
Правок в Chromium
9, и каждое подтверждено, а не просто названо
Умений у движка
macOS Apple Silicon и Intel, Windows, Linux
Сборки
До 37, прямо в программе
Замеров у профиля

Наша собственная сборка Chromium

ARMANOS Browser 153.0.7978.0 мы собираем из Chromium сами. Это не дополнение, не расширение и не ключ запуска, а сам браузер.

Страница спрашивает браузер, и браузер отвечает ей значениями вашего профиля, а не значениями вашего компьютера. Версию профиль называет ту, которая его правда рисует, и никакую другую.

Установщик без движка внутри к вам не уедет.

СистемаЧто программа запускает на вашем диске
macOS, Apple SiliconContents/MacOS/ARMANOS Browser внутри пакета
macOS, Intelтот же путь внутри сборки для Intel
Windows 10 и 11, 64 битаresources/engines/armanos-browser/armanos-browser.exe
Ubuntu 22.04 и новее, 64 битаresources/engines/armanos-browser/chrome

Ответ готов раньше первого скрипта

Скрипт сайта здесь не успевает первым. Когда он спрашивает navigator.platform, браузер уже отвечает ему значением вашего профиля.

Все значения профиля держатся вместе и выводятся из его шаблона, номера и страны выхода прокси. Поэтому завтра и на другом компьютере тот же профиль остаётся той же машиной.

  1. 1

    Что входит в машину профиля

    Экран, строки видеокарты, шрифты, часовой пояс, языки, число приборов и числа сети.

  2. 2

    Значения доезжают один раз

    Они уходят в браузер при запуске, вместе с папкой профиля, его прокси и списком языков.

  3. 3

    Вкладка, открытая позже, не отличается

    Страница, открытая через десять минут, видит ту же машину, что и первая.

  4. 4

    Странице нечего переопределять

    Она выполняется после и ни одного подменённого прототипа не находит.

Что читает сайт

В самом Chromium мы правим 39 файлов и добавляем 10 своих. Каждую строку в таблице ниже сайт читает из вашего профиля, а не из вашей машины.

Два правила держатся по всей таблице. Один и тот же рисунок читается у профиля всегда одинаково, а не по-новому на каждый вызов, и числа округляются так же, как их округляет обычный Chrome.

ПоверхностьЧто получает страница
Чтение холстапостоянная поправка на getImageData, toDataURL и toBlob
Звукпостоянная поправка на буфер и на спектр
Строки WebGLвидеокарта профиля и строка с картой, которая существует
Пиксели WebGLта же поправка, что у холста, поэтому два чтения сходятся
WebGPUбуферы со снятой картинкой, а не обычные вычисления
Шрифтытолько семейства профиля, остальное подменяется запасным
Часовой пояспояс страны, в которой выходит прокси
Опознание navigatorсистема, User agent, поставщик, ядра, память, касания
Подсказки клиентаSec-CH-UA и getHighEntropyValues() из тех же значений
Экранразмер, рабочая область, глубина цвета и плотность пикселей
Приборы записи и выводачисло микрофонов, выходов звука и камер
Голоса синтеза речисписок голосов по языку профиля
Сведения о сетискорость, задержка и вид связи
Предел памятипредел кучи в согласии с заявленной памятью

Где работу берёт движок, а где страница

Не всё пока перенесено в браузер. То, что он ещё не закрывает, закрывает сама программа из страницы, и тоже до первого скрипта сайта.

Два слоя на одном значении мешали бы друг другу: один рисунок прочитался бы двумя способами, и это заметнее, чем каждый из них поодиночке. Поэтому там, где работу берёт браузер, страница от неё отходит.

Что несёт именно эта сборка

Список ниже не написан от руки, а снят с самой сборки. Сборка, которая умения не несёт, его и не заявит.

  • webgl-readpixels

    шум чтения пикселей WebGL внутри движка

  • intl

    часовой пояс, язык, календарь и разделители

  • fonts

    список шрифтов по профилю, а не по машине

  • devices

    число приборов записи и вывода

  • voices

    голоса синтеза речи по заявленному языку

  • net

    скорость, задержка и вид связи

  • memory

    предел кучи в согласии с заявленной памятью

  • webgpu

    шум снимка картинки через WebGPU

  • net-mobile-fields

    три поля связи Android: type, downlinkMax, ontypechange

Встроенный движок слабее

Проверялка не просто читает значения. Она сличает заявленное с измеренным, и подмена на уровне страницы как раз и создаёт расстояние между ними.

Поэтому в программе есть второй движок, «Встроенный движок» на экране «Движок», и она честно говорит, какой из них работает: Chromium через Electron, веха 130, с защитой, внедрённой скриптом. На него профиль откатывается, когда ARMANOS Browser не смог подняться.

Об этом вы узнаете сразу. Профиль всё равно откроется, а вы увидите уведомление с именем профиля и причиной.

Встроенный движок, Chromium 130ARMANOS Browser, Chromium 153
Где ставится отпечатокв странице, внедрённым скриптомв C++, до первого скрипта
Разрешение шрифтапереписан замер, отрисовка нетотзываются только семейства профиля
Рабочий поток совпадает с главнымда, кроме кода, который новый общий поток исполняет при запускеДа
Кадр совпадает с родителем–Да
Наша блокировка трекеров и чистка ссылокДаДа
Сценарии и СинхронизаторДаДа
Есть на любой системеДаДа
Экран выбора браузерного движка: два движка, ARMANOS Browser отмечен как установленный и работающий, ниже путь к найденному файлу
Отмечен тот движок, который работает у вас сейчас, а ниже поле «Браузеров одновременно» и путь к его файлу.

Что едет вместе с движком

Блокировка слежки, чистка ссылок и остальные защиты работают и в ARMANOS Browser. Их приносит в профиль небольшое расширение, которое программа собирает при запуске, и включать его отдельно не нужно.

Блокировка без следа на странице

Страница не видит ни следа этой блокировки и не ждёт нашего ответа на каждый запрос. Поэтому заминка в программе не может подвесить ваш сайт.

  • Блокировка трекеров

    Список узлов, собственная слежка известных площадок и метки в ссылках.

  • Чистка ссылок

    40 отслеживающих меток уходят из ссылки до того, как запрос покинет вашу машину.

  • WebRTC через прокси

    В режиме WebRTC по умолчанию ваш настоящий адрес не утечёт мимо прокси по UDP. Режим «Настоящий» нарочно показывает его, и показать его может расширение с правом privacy.

  • Весь трафик на прокси

    Мимо прокси не уходит ни один запрос, а незнакомый вид прокси даёт отказ вместо тихого выхода напрямую.

  • Пароль прокси мимо командной строки

    Ваш пароль не появляется в командной строке процесса.

  • Автоматизация без приметы

    Порт отладки доступен только с этой машины, а navigator.webdriver страница читает у вас ложным.

Что проверено до выпуска сборки

Сборка с проваленной проверкой к вам не уезжает. Проверка, которую не удалось запустить, считается проваленной, а не пропущенной.

Мерят готовый двоичный файл, тот самый, что лежит в установщике, и сличают его с ним же без вашего профиля. Чистым образцом служит не чужой браузер, а сам движок.

«Принято с оговоркой» значит, что не провалено ничего, но проверено не всё, и такую сборку мы называем так вслух.

  1. 1

    Значения профиля правда доезжают

    Движок запускают со страной выхода, читают то, что видит страница, и сличают с тем же движком без профиля.

  2. 2

    Проверка идёт на четырёх профилях

    Дефект рисунка холста бывает виден не у всех, и один удачный профиль пропустил бы негодную сборку.

  3. 3

    Наш браузер и обычный Chrome сличают целиком

    Необъяснимое лишнее свойство это отказ, а не мелочь.

  4. 4

    Заявленное умение подтверждено

    В применяемом списке правок нет заглушек, и ни одно умение не объявлено просто так.

Проверьте на своей машине

Каждый профиль открывается на стартовой странице, где перечислены проверялки, которыми эта работа и так пользуется: BrowserScan, BrowserLeaks, CreepJS, Pixelscan и определение адреса. Лежит эта страница на вашем же компьютере, поэтому об открытии профиля не узнаёт никто посторонний.

Внутри программы автопроверка отпечатка (меню профиля > Проверить отпечаток) снимает до 37 значений с живой страницы и показывает, сошлось ли каждое с тем, что вы задали профилю. Окно без защиты она мерить откажется, а не покрасит в красный впустую.

navigator.platform
Win32
navigator.userAgent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
Ядра и память
12 логических ядер, 8 ГБ
Экран
1920 x 1080, рабочая высота 1040, плотность 1
Производитель WebGL
Google Inc. (AMD)
Рендерер WebGL
ANGLE (AMD, AMD Radeon RX 6600 (0x000073FF) Direct3D11 vs_5_0 ps_5_0, D3D11)
Часовой пояс
America/New_York
Языки
en-US, en
Шрифты
25 семейств, все виндовые
Приборы
1 микрофон, 3 выхода звука, 1 камера
Сеть
4g, 10 Мбит/с, задержка 200 мс
Голоса синтеза речи
только английские
maxTouchPoints
0

Один профиль на шаблоне «Windows · Chrome», прокси выходит в США. Все значения выводятся из номера профиля, поэтому при следующем запуске и на другом компьютере они те же. Число приборов это потолок: прибор, который на машине есть, можно спрятать, а тот, которого нет, выдумать нельзя.

Стартовая страница профиля: крупно адрес выхода со страной и провайдером, карточка профиля с его настройками и карточка движка с версией браузера
Версия браузера и адрес выхода видны на стартовой странице.

Чего это не делает

  • Чтение пикселей WebGL закрыто для восьмибитного RGBA на обеих дорогах: и прямо в память, и через буфер упаковки, который забирают позже. Открытыми остаются две раскладки, и мы перечисляем их открытыми: RGB по три байта на пиксель и вещественные типы float и half-float. Шум умеет только четырёхбайтные пиксели, поэтому другая раскладка проходит мимо него.
  • Настоящая опись шрифтов машины по-прежнему видна через поиск по уникальному имени. Замер урезан списком профиля, а закрыть сам поиск можно только новой правкой в шрифтовом коде.
  • На macOS движок берёт язык приложения из системного списка языков, а не из своего ключа запуска, поэтому программа передаёт ему языки профиля при запуске. Первый список голосов синтеза приходит у этой сборки без верного голоса по умолчанию: он появляется со следующим событием voiceschanged, а Chrome 154 отдаёт его сразу.
  • Профилю, чей шаблон не совпадает с системой хозяина, дописываются хозяйские базовые шрифты, иначе текст не рисуется вовсе. Эти имена странице видны, и закрыть это можно, только разделив список шрифтов на отрисовку и на ответы.
  • Признак автоматизации гасится открытым ключом Chromium, а не правкой. Ключ работает и сторожится стендом, который читает значение с настоящей страницы, но сам ключ виден в командной строке процесса любому, кто на этой машине умеет её прочесть.
  • Мы продаём разделение и постоянную машину, а не невидимость. Сайт по-прежнему видит ваш адрес, ваше поведение и историю того аккаунта, в который вы входите, и движок об этом ничего не решает.

Как проверить

За каждым пунктом файл, который можно открыть, и стенд, который валит сборку, когда обещание перестаёт быть правдой.

Отпечаток подменяется в исходниках Chromium, правки применяются при сборке
engine/patches/series · apps/desktop/test/engine-patches-real.js
Шум чтения пикселей WebGL действительно вызывается, а не лежит в заплате мёртвым кодом
engine/patches/armanos-fp.cumulative.diff · apps/desktop/test/engine-patches-real.js
Каждое объявленное умение доказано признаком в правленом файле, а не списком
packages/shared/src/index.js · engine/scripts/опись-умений.js
Слой в странице отходит ровно там, где движок берёт работу на себя
apps/desktop/src/lib/дыры-страницы.js · apps/desktop/test/страница-отходит-когда-движок-умеет.js
Сборку принимают стенды, и неполная проверка не выдаётся за полную
engine/scripts/приёмка.sh · apps/desktop/test/сборочные-скрипты.js
Установщик не уезжает без движка и с движком чужой версии
apps/desktop/build/before-pack.js · apps/desktop/test/установщик-без-движка.js

Вопросы

Какую версию Chromium называет профиль?
Ту, которая его рисует, 153.0.7978.0. Браузер, назвавший веху, возможностей которой у него нет, сайт ловит одной строкой.
Можно запустить движок сам по себе?
Файл запустится, и без профиля он ведёт себя как обычный Chromium с вашей настоящей машиной. Машину профиля он получает только тогда, когда вы открываете профиль из программы.
Меняет ли обновление движка мои профили?
Нет. Машина профиля выведена из его номера, шаблона и поколения, с которым профиль создан, а поколение у профиля заморожено навсегда.
Что будет на сборке без нужного умения?
Эту поверхность закроет сама программа из страницы, а поля, которых сборка заполнить не может, странице не покажутся вовсе. Три поля связи Android, например, достаются только сборке, которая их несёт.
Движок одинаковый на всех четырёх системах?
Правки одни и те же, и все сборки называют одну версию. Различается упаковка вокруг него, а не то, что читает страница.

Запустите на своей машине

В ARMANOS откройте профиль и прочитайте стартовую страницу до того, как открывать сайты. Движок едет внутри программы.