Движок
Наш браузерный движок
- 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 Silicon | Contents/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
Что входит в машину профиля
Экран, строки видеокарты, шрифты, часовой пояс, языки, число приборов и числа сети.
- 2
Значения доезжают один раз
Они уходят в браузер при запуске, вместе с папкой профиля, его прокси и списком языков.
- 3
Вкладка, открытая позже, не отличается
Страница, открытая через десять минут, видит ту же машину, что и первая.
- 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 130 | ARMANOS Browser, Chromium 153 | |
|---|---|---|
| Где ставится отпечаток | в странице, внедрённым скриптом | в C++, до первого скрипта |
| Разрешение шрифта | переписан замер, отрисовка нет | отзываются только семейства профиля |
| Рабочий поток совпадает с главным | да, кроме кода, который новый общий поток исполняет при запуске | Да |
| Кадр совпадает с родителем | – | Да |
| Наша блокировка трекеров и чистка ссылок | Да | Да |
| Сценарии и Синхронизатор | Да | Да |
| Есть на любой системе | Да | Да |

Что едет вместе с движком
Блокировка слежки, чистка ссылок и остальные защиты работают и в ARMANOS Browser. Их приносит в профиль небольшое расширение, которое программа собирает при запуске, и включать его отдельно не нужно.
Блокировка без следа на странице
Страница не видит ни следа этой блокировки и не ждёт нашего ответа на каждый запрос. Поэтому заминка в программе не может подвесить ваш сайт.
Блокировка трекеров
Список узлов, собственная слежка известных площадок и метки в ссылках.
Чистка ссылок
40 отслеживающих меток уходят из ссылки до того, как запрос покинет вашу машину.
WebRTC через прокси
В режиме WebRTC по умолчанию ваш настоящий адрес не утечёт мимо прокси по UDP. Режим «Настоящий» нарочно показывает его, и показать его может расширение с правом privacy.
Весь трафик на прокси
Мимо прокси не уходит ни один запрос, а незнакомый вид прокси даёт отказ вместо тихого выхода напрямую.
Пароль прокси мимо командной строки
Ваш пароль не появляется в командной строке процесса.
Автоматизация без приметы
Порт отладки доступен только с этой машины, а navigator.webdriver страница читает у вас ложным.
Что проверено до выпуска сборки
Сборка с проваленной проверкой к вам не уезжает. Проверка, которую не удалось запустить, считается проваленной, а не пропущенной.
Мерят готовый двоичный файл, тот самый, что лежит в установщике, и сличают его с ним же без вашего профиля. Чистым образцом служит не чужой браузер, а сам движок.
«Принято с оговоркой» значит, что не провалено ничего, но проверено не всё, и такую сборку мы называем так вслух.
- 1
Значения профиля правда доезжают
Движок запускают со страной выхода, читают то, что видит страница, и сличают с тем же движком без профиля.
- 2
Проверка идёт на четырёх профилях
Дефект рисунка холста бывает виден не у всех, и один удачный профиль пропустил бы негодную сборку.
- 3
Наш браузер и обычный Chrome сличают целиком
Необъяснимое лишнее свойство это отказ, а не мелочь.
- 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
Путь от профиля до открытого окна браузера, по шагам.
Что умеет программа
Профили, группы, команда, автоматизация и остальное, с файлами за ними.
Проверка отпечатка
Посмотрите, что прямо сейчас отдаёт ваш браузер в этой вкладке.
Прокси
Как выходит трафик профиля и что движок делает со страной выхода.
Запустите на своей машине
В ARMANOS откройте профиль и прочитайте стартовую страницу до того, как открывать сайты. Движок едет внутри программы.