Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Version.dll / Chrome++ для Chrome и иных Chromium браузеров

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

Открыть новую тему     Написать ответ в эту тему

insorg



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chrome++ DLL для портаблезации Chrome и иных Chromium-based браузеров.

Chrome-браузеры в файле "Secure Preferences" сохраняют хеш на основе конкретного пользователя конкретной установленной ОС. При запуске в другом пользователе или ОС браузер обнаруживает несоответствие старого хеша и затирает "Secure Preferences" целиком! Соответственно, теряются все установленные расширения и часть настроек, потому что именно от него они зависят. Так же могут затираться куки и сохранённые данные логинов+паролей. Именно Version.DLL не даёт браузеру потерять настройки с расширениями.
Помимо этого при использовании Version.dll отпадает необходимость указывать --user-data-dir=<путь>, по умолчанию она будет в ..\Data и ..\Cache (уровнем выше от chrome.exe). Эти пути можно менять на свои в ini файле. Так браузер можно запускать прямо по ехе, без дополнительных лаунчеров или батников.
 
Работоспособность проверена на: Brave, CentBrowser, Chromium (dev), GDIChromium, Google Chrome, Iron, Supermium, Ungoogled Chromium, Vivaldi и других.
* Существуют несколько "особенных", где version.dll затруднено либо бесполезно: MS Edge, QQ, 360EE.
 
Актуальные (Cr118+): Версия Описание Обновления Страница загрузки Прямые ссылки **    
Chrome++ от Bush2021 (release) Почитать История Скачать x86, x64, chrome++.ini    
Version.dll от nekto78 (release) Почитать История Скачать x86, x64, version.ini    
Vivaldi++ от ca-x (czyt) (release) Почитать История Скачать x86, x64    
Vivaldi++ от ca-x (czyt) (nightly) Почитать История Скачать x86, x64      
Chrome++ от jestxfot (release) Почитать История Скачать x86, x64

** Прямые ссылки - только для опытных пользователей. Если вы не знаете, какой файл нужен, читайте инструкцию и скачивайте релиз со страницы загрузки!
 
Архив версий (перезаливы)
 
Инструкция:
1. Положить version.dll возле chrome.exe / brave.exe / vivaldi.exe / <...>
2. Запустить браузер по exe
Готово! Пользоваться и радоваться результату.
По вкусу можно поковырять ini.
F.A.Q. по ini-файлам
 
Внимание!
• Для 32-битной версии использовать 32-битную version.dll, а для х64 - соответственно х64. Не путать!
Имя файла должно быть именно "version.dll"! Не "version.32.dll". Не "version.64.dll". Не "chrome++.dll". Не какое-то ещё. Только "version.dll"!
• Если хочется оставить старый настроенный профиль, не забывайте сначала сделать его бэкап! Затем при первом запуске нужно будет установить расширения заново. Не забывайте предварительно позаботиться о сохранении паролей/куков, если нужны.

Всего записей: 20030 | Зарегистр. 04-11-2010 | Отправлено: 02:18 02-01-2023 | Исправлено: insorg, 22:21 09-06-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
El Sanchez
 

Цитата:
lz57005, nekto78, какой тип у COMPNAME для A и W функций? Почему WideString, а не string? Почему нет проверки nSize на необходимость иметь размер буфера не менее MAX_COMPUTERNAME_LENGTH символов, не включая завершающий null-символ, как это указано в документации? Почему WideName='' для функции ошибка? Почему при nSize < RequiredSize вы не выставляете LastError в ERROR_BUFFER_OVERFLOW, как это указано в документации? Зачем вы вообще перехватываете GetComputerName?

 
Это идея lz57005, смысл - используя функцию синхронизации и запуская несколько экземпляров браузера с разными заданными именами компьютера эмитировать запуск браузера с нескольких устройств. Тип у COMPNAME в 32-х битной версии по умолчанию для Делфи 2007 - это AnsiString, в 64-х битной по умолчанию WideString. Да, реализация функции несовершенна - это ответ на все остальные "почему". Посмотрел несколько браузеров, в них всегда используется только GetComputerNameW. Если всё же решу включить её реализацию в релиз, то доведу.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 20:17 03-10-2025 | Исправлено: nekto78, 20:20 03-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lz57005
 

Цитата:
Event: INFO:extension_garbage_collector.cc:184 Garbage collection for extensions on file thread is complete.

 
Сегодня перепроверил перехват функций записи в реестр (из модуля advapi32.dll), функции активно используются браузером и их перехват работает даже при том что имя модуля и функций не прописаны в таблице импорта (скорее всего подключаются динамически). Странно, где-то в описании методов перехвата функций читал что это невозможно. А уже собирался исключать их из прокси, хорошо что проверил. Однако перехват ReportEvent и RegisterEventSource в макстоне с двигуном 109 и в яндексе с двугуном 124 еще никак себя не проявил, а проявился в центе с двигуном 132 и катс с двигуном 141. Так что буду добавлять в реализацию.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 14:02 04-10-2025 | Исправлено: nekto78, 20:54 04-10-2025
lz57005



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
El Sanchez
 

Цитата:
какой тип у COMPNAME для A и W функций? Почему WideString, а не string?  
 
String это абстракция, при работе с winapi для избежания путаницы лучше чётко указывать AnsiString и WideString для неюникодных и юникодых реализаций функций.

Цитата:
Почему нет проверки nSize на необходимость иметь размер буфера не менее MAX_COMPUTERNAME_LENGTH символов, не включая завершающий null-символ, как это указано в документации?

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

Цитата:
Почему WideName='' для функции ошибка?

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

Цитата:
Почему при nSize < RequiredSize вы не выставляете LastError в ERROR_BUFFER_OVERFLOW, как это указано в документации?

Потому что мы тут не отладкой занимаемся собственного процесса, зачем вообще что-то писать в LastError в этом прикладном решении, функция булева какой смысл вообще смотреть lasterror если нормальная сложившаяся практика:
  nsize:=0;
  GetComputerNameW(nil,nsize);
  GetComputerNameW(@bufW,nsize);  
  Как раз таки вначале узнать размер, именно поэтому функция декларируется с var nsize, к тому же опять так браузеры корректно работают без обработки всех исключений и полного следования документации просто подставляя hardcoded строку "Windows NT" вместо имени компьютера в случае ошибок.

Цитата:
Зачем вы вообще перехватываете GetComputerName?

Изначально имя компьютера является одним из триггеров чтобы сбросить профиль,  как если бы пользователь переместил его физически. Однако не сообщать имя компьютера приводит к тому что если пользоваться различными аспектами синхронизаций онлайн аккаунта, мы получаем или постоянную перезапись данных если создаем чистый профиль и копируем его и пользуемся параллельно, потому что одно и тоже имя компа, один и тот же sync id, или получаем несколько одноименных клонов с именем Windows NT, но разными synс id, если создавать новый профиль у каждой копии с нуля.  
Я в отличии от большинства хочу добиться не обрезанной портативки когда все компоненты параноидально  заглушены, синхронизацией и облачными вкладками не пользуются и прочее, что популярно в среде сборщиков портативок, а полноценного опыта использования браузера как будто он установлен в систему, со всем его удобным функционалом, но без таких вещей как отвал профиля, т.к. синхронизируются не все настройки и это неудобно настраивать каждый раз, невозможность следить в системе и журнале событий в том числе даже на момент запуска, невозможность подцепить групповые политики если они настроены на рабочем компе. Собственно на текущий момент я это решил загружая прокси dll nekto78 как плагин в PurePortable(он на текущий момент отвечает за невозможность читать отдельные ветки реестра, также я разделил невозможность писать в папки профиля и очистку между двумя этими dll), а то чего мне не хватает даже в этой связке я и предложил автору реализовать.
Я вообще не программист)) и мимо проходил, а вы устроили допрос)) с вашим подходом лучше делайте пулл реквесты автору, вместо ссылок на документацию, если уж вам небезразличен проект))
 
 

Всего записей: 76 | Зарегистр. 09-04-2012 | Отправлено: 14:26 04-10-2025 | Исправлено: lz57005, 14:28 04-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lz57005

Цитата:
Я вообще не программист))


Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 14:40 04-10-2025
lz57005



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nekto78

Цитата:
Странно, где-то в описании методов перехвата функций читал что это невозможно.

Немного не понял что именно невозможно? Условно если в статическом импорте функции нет, значит где-то за чередой обёрток функций, как это часто бывает под винду, где-то будет loadlibrary и получение адреса функции и её использование, т.е. отложенный импорт или динамический как ты выразился, но если ты при загрузке твоей dll уже сделал loadlibrary и хукнул функцию, то когда это случается в самом процессе он уже получает существующий handle на dll после твоей загрузки, и адрес уже хукнутой функции, разница только в том что статически не импортируется нужно загружать самому и это должно происходить до того как это делает процесс, был опыт форка libportable для Firefox , и там как раз в один момент поменялась логика запуска и нужно было всего лишь добавить собственный loadlibrary т.к. процесс перестал это делать на момент попытки хука

Всего записей: 76 | Зарегистр. 09-04-2012 | Отправлено: 16:04 04-10-2025 | Исправлено: lz57005, 16:06 04-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lz57005

Цитата:
Немного не понял что именно невозможно?

В статье было написано что перехват функций динамически подключаемых библиотек, описанным в статье методом невозможен (там был описан метод поиска и исправления адресов в таблице импорта, еще было несколько слов о loadlibrary и о том что это очень сложно. С loadlibrary несколько экспериментов проводил когда делал поиск и замену последовательности байтов в памяти процесса и как с ней работать разобрался более и менее). И ни в одной статье, которые читал про перехват, о том что пишешь ты (хотя интуитивно уже появились догадки), так что спасибо за точную и проверенную информацию.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 16:49 04-10-2025 | Исправлено: nekto78, 16:52 04-10-2025
lz57005



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nekto78
Я если честно удивлён двум вещам, почему не Lazarus, не вижу смысла юзать проприетарные устаревшие версии Delphi в пет-пооектах, и что хуки это проще чем мне казалось, хотя возможно твоя реализация несовершенна, иначе непонятно почему ты не используешь https://github.com/MahdiSafsafi/DDetours, и почему там всё настолько сложно, и даже там упоминаются всякие ограничения и нюансы, ну или есть способы использовать тот же minhook в Delphi, который тоже выглядит весьма сложным.

Всего записей: 76 | Зарегистр. 09-04-2012 | Отправлено: 17:00 04-10-2025 | Исправлено: lz57005, 17:11 04-10-2025
El Sanchez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Тип у COMPNAME в 32-х битной версии по умолчанию для Делфи 2007 - это AnsiString, в 64-х битной по умолчанию WideString.

nekto78, зашибись. Т.е. в 32-х битной версии такое приведение COMPNAME к Widestring (WideName := Widestring(COMPNAME)) это норма?

Цитата:
Посмотрел несколько браузеров, в них всегда используется только GetComputerNameW

nekto78, про GetComputerNameEx не забудьте, а то ж тоже вызывается, даже чаще, чем GetComputerName.

Цитата:
при работе с winapi для избежания путаницы лучше чётко указывать AnsiString и WideString для неюникодных и юникодых реализаций функций.

lz57005, на скриншоте прям сильно помогло. WideString вообще для COM нужен.

Цитата:
Потому что мы тут не отладкой занимаемся собственного процесса, зачем вообще что-то писать в LastError в этом прикладном решении, функция булева какой смысл вообще смотреть lasterror если нормальная сложившаяся практика

lz57005, вызывающий в случае ошибки может и должен проверить код ошибки и действовать соответственно. Уверены, что после во-о-о-н того вызова GetComputerName, который потерпит неудачу из-за вашей реализации, состояние программы критично не поменяется? Меняя реализацию перехватываемой функции, вы ответственны за ход выполнения программы во всех местах её вызова.

Цитата:
нормальная сложившаяся практика:  
  nsize:=0;  
  GetComputerNameW(nil,nsize);  
  GetComputerNameW(@bufW,nsize);

lz57005, ужас какой, аж 2 вызова надо. В Chromium доки читают и сразу буфер размером MAX_COMPUTERNAME_LENGTH + 1 выделяют, ненормальные какие-то.

Цитата:
Изначально имя компьютера является одним из триггеров чтобы сбросить профиль,  как если бы пользователь переместил его физически.

lz57005, нет, профиль к имени не привязывается, оно нужно для расширений.
 
 
 
 
 
 
 
 
 

Всего записей: 517 | Зарегистр. 23-12-2008 | Отправлено: 17:17 04-10-2025
lz57005



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
El Sanchez
Эм, мы тут делаем, прикладную реализацию в свободное от собственного существования время,  оно функционально в таком виде)) уже, если вы ратуете за чистоту кода вправе предложить рефакторинг или не пользоваться полученным результатом. Нет краша, нет проблем. Да грустненький подход, я бы вообще в это не лез, но товарищи из поднебесной тратят время на реализация всяких доп фич типа bosskey,  вместо того чтобы домучать реалистичную портабелизацию, во всех аспектах, да и форкать c++ я не в силах. А тут проект от nekto78, а я в школе паскаль учил, и вместо нытья обычного юзера, добавь пожалуйста, решил предложить немного конструктивнее.
Так о чем я, если у вас достаточно времени чтобы настолько углубляться и полностью соответствовать документации то рад за вас, надеюсь в будущем увидеть вашу реализацию, мне всё равно кто и с какой компетенцией будет реализовывать, мне важен мой результат. Я, уже увидел в облачных вкладках имя компа дочитывая статью едя домой после работы вписанное мной в ini, чего хотел, если не дождусь сам попробую пресечь запись евентов и буду спокойно пользоваться в своем специфическом сценарии использования, благо не запрещено))

Всего записей: 76 | Зарегистр. 09-04-2012 | Отправлено: 17:33 04-10-2025 | Исправлено: lz57005, 17:36 04-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lz57005

Цитата:
почему не Lazarus, не вижу смысла юзать проприетарные устаревшие версии Delphi

Когда-то уже писал что хотелось компактности на выходе. Пробовал Lazarus - результат тогда не удовлетворил. И еще частенько проверяю, делаю  исправления и компиляцию в WinPE осях (а там как правило только лайтовые устаревшие версии Delphi работают).

Цитата:
почему ты не используешь https://github.com/MahdiSafsafi/DDetours

Мне с самого начала хотелось понять как работает перехват и как его реализовать с нуля без использования готовых модулей. И опять же хотелось компактности.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 17:42 04-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
El Sanchez

Цитата:
вызывающий в случае ошибки может и должен проверить код ошибки и действовать соответственно. Уверены, что после во-о-о-н того вызова GetComputerName, который потерпит неудачу из-за вашей реализации, состояние программы критично не поменяется? Меняя реализацию перехватываемой функции, вы ответственны за ход выполнения программы во всех местах её вызова.

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

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 20:29 04-10-2025 | Исправлено: nekto78, 20:50 04-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
5.10.2025. Небольшое обновление. Скачать можно по прямым ссылкам из шапки.
 
1. Добавил блокировку (ReportEvent и RegisterEventSource) функций записи в системный журнал. Пока что без возможности отключения.
2. Добавил определение имени ини файла по имени файла прокси библиотеки.
 
С GetComputerName еще повожусь некоторое время и с перехватом чтения из реестра посмотрю что можно сделать и с функцией определения параметров командной строки тоже стало интересно поэкспериментировать.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 10:06 05-10-2025 | Исправлено: nekto78, 10:48 05-10-2025
potomykto

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nekto78
Цитата:
5.10.2025. Небольшое обновление.
Перестали блокироваться файлы тут..
 
; Файлы данных
DeleteFile=.\User Data\ФАЙЛЫ

Всего записей: 68 | Зарегистр. 09-03-2025 | Отправлено: 10:52 05-10-2025 | Исправлено: potomykto, 10:53 05-10-2025
MaraGame24



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
potomykto
Цитата:
Перестали блокироваться файлы тут..
Аналогично )))
Chromium 140...

Всего записей: 2458 | Зарегистр. 25-11-2023 | Отправлено: 11:35 05-10-2025 | Исправлено: MaraGame24, 11:36 05-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
potomykto MaraGame24

Цитата:
Перестали блокироваться файлы тут..
 ; Файлы данных
DeleteFile=.\User Data\ФАЙЛЫ


Цитата:
Аналогично )))
Chromium 140...

 
Предполагаю что в 64-х битной версии? Поскольку 32-х битная работает исправно. 64-х битную проверил в Яндексе с двигуном 120 и Центе с двигуном 134 - файлы удаляются, т.е. работает исправно. Тут надо учитывать что из-за ресурсоёмкости двига он продолжает работать после закрытия окна браузера еще некоторое время (до нескольких секунд в зависимости от версии двига).
 
Пишите точно. Функции блокировки файлов не предусмотрено изначально, предусмотрена функция удаления файлов в момент запуска и завершения работы браузера. Версию и названия браузера и ОС тоже пишите.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 12:15 05-10-2025 | Исправлено: nekto78, 19:19 05-10-2025
potomykto

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nekto78
Цитата:
Предполагаю что в 64-х битной версии?
В ней...
Цитата:
Пишите точно.
Именно в версии 5.10.2025. перестали удаляться файлы, которые удалялись в предыдущей версии.DLL при старте браузера...
Цитата:
Функции блокировки файлов не предусмотрено изначально
Не правильно выразились...Конечно УДАЛЯТЬСЯ...
 
Проверялось на чистом профиле...

Всего записей: 68 | Зарегистр. 09-03-2025 | Отправлено: 12:36 05-10-2025 | Исправлено: potomykto, 12:36 05-10-2025
Holtek

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, в чём проблема, у меня не работают варианты с Version.dll ни с одним браузером, для хрома помог только вариант с injectpe от Bush2021, что не так с моей системой? Разрядность x64, длл соответствующая... пробовал даже вариант для x32  

Всего записей: 183 | Зарегистр. 27-07-2007 | Отправлено: 00:44 06-10-2025 | Исправлено: Holtek, 00:47 06-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Holtek

Цитата:
Подскажите, в чём проблема, у меня не работают варианты с Version.dll ни с одним браузером, для хрома помог только вариант с injectpe от Bush2021, что не так с моей системой?

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

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 09:17 06-10-2025 | Исправлено: nekto78, 09:35 06-10-2025
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
nekto78

Цитата:
Сегодня перепроверил перехват функций записи в реестр (из модуля advapi32.dll), функции активно используются браузером и их перехват работает даже при том что имя модуля и функций не прописаны в таблице импорта (скорее всего подключаются динамически). Странно, где-то в описании методов перехвата функций читал что это невозможно.

Если в вашей dll уже есть в импорте advapi32, перехват будет работать.

----------
Разум когда-нибудь победит

Всего записей: 3773 | Зарегистр. 09-02-2003 | Отправлено: 13:54 06-10-2025
nekto78



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
Если в вашей dll уже есть в импорте advapi32, перехват будет работать.

Приветствую.
32-х битную версию 1.0.5.8 слегка исправил (приложил перекомпиленный system.dcu) так чтобы в статическом импорте не было advapi32 и добавил в коде динамическое его подключение, перехват функций из него работает, проверил. В 32-х битной версии 1.0.5.7 advapi32 присутствует в статическом импорте и перехват так же работает. В 64-х битной версии изначально в статическом импорте advapi32 не было и там с самого начала реализован динамический импорт и перехват функций из него тоже работает.

Всего записей: 673 | Зарегистр. 10-02-2006 | Отправлено: 14:22 06-10-2025 | Исправлено: nekto78, 14:30 06-10-2025
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

Компьютерный форум Ru.Board » Компьютеры » Программы » Version.dll / Chrome++ для Chrome и иных Chromium браузеров


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru