- Регистрация
- 04.04.2015
- Сообщения
- 3 835
- Благодарностей
- 3 552
- Баллы
- 113
Методы идентификации пользователей
В предыдущей статье мы рассмотрели львиную долю параметров, которые могут подвергнуть нашу анонимность угрозе. Но с тех пор произошли некоторые изменения, плюс за этот период тема была изучена ещё более тщательно и мне есть чем с Вами поделиться.
В этой статье мы рассмотрим качественную эмуляцию не только для десктопа, но и мобильных устройств.
Каждый параметр, отвечающий за идентификацию пользователя помечен цветным маркером по степени важности.
Важным считается тот, что уводит пользователя в зону риска при идентификации реальных значений.
■ - Безопасный
■ - В зоне риска
■ - Полная идентификация
⦿ Новое \ Обновлено
Информация о браузере
■ ⦿ Useragent и свойства навигатора
- ⦿ Firefox (Desktop, Mobile and Tablet)
- ⦿ Chrome (Desktop)
- ⦿ Internet Explorer (Desktop)
- ⦿ Edge (Desktop)
- ⦿ Safari (Desktop)
■ ⦿ Набор плагинов
■ ⦿ Имя окна
■ ⦿ Другое
- ⦿ Язык
- Hardware Concurrency
- Do Not Track
- Touchscreen Type (Touchscreen Support)
- Adblock
- devicePixelRatio
- ⦿ Battery
Хранилища
■ ⦿ Кэш
- ETag
- ⦿ Last-Modified
■ ⦿ IndexedDB
■ Куки (Web cookies).
■ ⦿ Super Cookie
- LSO Cookies
- Evercookies \ Zombie Cookie
■ ⦿ HSTS Super cookies (HTTP Strict Transport Security)
Связь и местоположение
■ ⦿ IP адрес (Прокси)
- ⦿ Происхождение прокси
■ WebRTC (Утечка IP)
■ ⦿ Flash (Утечка IP)
■ Геолокация
■ Таймзона
Отпечатки
■ ⦿ WebGL (одинаковые на продукции Apple)
■ Fingerprint Canvas
■ Browser Fingerprint
■ ⦿ AudioContext Fingerprint
■ ⦿ Системные шрифты (Fonts Fingerprint)
■ ⦿ Firefox Resources Reader
■ ⦿ WebRTC (Камера, Микрофон)
■ ⦿ ClientRect Fingerprint
■ ⦿ Ubercookies Fingerprint
■ ⦿ IP Stack fingerprint \ Passive OS Fingerprint
Информация о браузере
■ Useragent и свойства навигатора
Как Вы уже знаете UA - это строка, которая используется клиентскими приложениям в качестве своего имени. В прошлой части мы рассмотрели метод генерации useragent'a браузера Firefox, код которого мы сейчас обновим, добавив актуальные версии, а так же способы генерации актуальных useragent'ов других браузеров: Chrome, Edge, Internet Explorer и Safari.
Общие составные части данной строки:
- Mozilla/5.0 — Основной токен, указывающий версию совместимости и является общим практически для каждого браузера на сегодняшний день.
- [Platform] – Описывает родную платформу, на которой работает браузер. Например: Windows, Mac, Linux или Android. Обратите внимание, что эта строка может состоять из нескольких маркеров, разделённых «;».
Firefox
Desktop
Из чего состоит строка?
Mozilla / 5.0 ([Platform]; rv: [GeckoVersion]) Gecko / [GeckoTrail] Firefox / [FirefoxVersion]
- rv:[GeckoVersion] — Указывает версию выпуска Gecko. В последних версиях браузера GeckoVersion такая же, как FirefoxVersion.
- Gecko / [GeckoTrail] — Указывает на то, что браузер основан на Gecko. На десктопах [GeckoTrail] является константой «20100101»
- Firefox / [FirefoxVersion] – Заявляет, что используется браузер Firefox определённой версии.
C#:
// Выбираем случайную версию Firefox
Random r = new Random();
//Формируем набор buildID нашего Firefox (у каждой версии свой)
Tuple<string, string>[] buildIDSet = {
Tuple.Create("57", "20171112125346"),
Tuple.Create("56", "20171024165158"), // 56.0.2
Tuple.Create("56", "20171002220106"), // 56.0.1
Tuple.Create("56", "20170926190823"),
Tuple.Create("55", "20170802111421"),
Tuple.Create("54", "20170608105825"),
Tuple.Create("53", "20170413192749"),
Tuple.Create("52", "20171206101620"), // 52.5.2
Tuple.Create("52", "20171107091003"), // 52.5.0
Tuple.Create("52", "20170316213829"),
Tuple.Create("51", "20170125094131"),
Tuple.Create("50", "20161104212021"),
Tuple.Create("49", "20161019084923")
};
// Версия
int currentBuild = r.Next(buildIDSet.Length);
string version = buildIDSet[currentBuild].Item1;
// Устанавливаем BuildID
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, buildIDSet[currentBuild].Item2);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// Формируем набор версий операционной системы Windows
// 6.0 Windows Vista
// 6.1 Windows 7
// 6.2 Windows 8
// 6.3 Windows 8.1
// 10.0 Windows 10
string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
// Определяем "битность" самого приложения
string platformApp = string.Empty;
if(platform=="Win32"){
platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
} else {
platformApp = "; Win64; x64";
}
// OC
project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
project.Profile.UserAgentPlatform = platform;
// Устанавливаем Useragent
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}; rv:{2}.0) Gecko/20100101 Firefox/{2}.0", winOC, platformApp, version);
project.Profile.UserAgentAppVersion = "5.0 (Windows)";
project.Profile.UserAgentAppName = "Netscape";
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = "20100101";
Генерация useragent'a Firefox для мобильных телефонов и планшетов ничем особо не отличается от десктопной версии, меняются лишь параметры OS. Набор билдов остаётся прежним.
C#:
// Выбор дейвайса: Мобильный телефон или Планшет
// Должна быть активирована только одна строка
string device = Macros.TextProcessing.Spintax("{Mobile|Tablet}"); // Cлучайный
//string device = "Mobile"; // Мобильный
//string device = "Tablet"; // Мобильный
// Выбираем случайную версию Firefox
Random r = new Random();
//Формируем набор buildID нашего Firefox (у каждой версии свой)
Tuple<string, string>[] buildIDSet = {
Tuple.Create("57", "20171112125346"),
Tuple.Create("56", "20171024165158"), // 56.0.2
Tuple.Create("56", "20171002220106"), // 56.0.1
Tuple.Create("56", "20170926190823"),
Tuple.Create("55", "20170802111421"),
Tuple.Create("54", "20170608105825"),
Tuple.Create("53", "20170413192749"),
Tuple.Create("52", "20171206101620"), // 52.5.2
Tuple.Create("52", "20171107091003"), // 52.5.0
Tuple.Create("52", "20170316213829"),
Tuple.Create("51", "20170125094131"),
Tuple.Create("50", "20161104212021"),
Tuple.Create("49", "20161019084923")
};
// Версия
int currentBuild = r.Next(buildIDSet.Length);
string version = buildIDSet[currentBuild].Item1;
// Устанавливаем BuildID
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, buildIDSet[currentBuild].Item2);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// Формируем набор версий операционной системы Android
// https://ru.wikipedia.org/wiki/История_версий_Android
string AndroidOC = Macros.TextProcessing.Spintax("{4.4.4|5.0|5.0.1|5.0.2|5.1|5.1.1|6.0|6.0.1|7.0|7.1|7.1.1|7.1.2|8.0|8.1}");
string platform = string.Format(@"Linux {0}", Macros.TextProcessing.Spintax("{armv7l|armv8l}")); // 32bit and 64bit
// Определяем "битность" самого приложения
string platformApp = string.Empty;
// OC
project.Profile.UserAgentOsCpu = platform;
project.Profile.UserAgentPlatform = platform;
// Устанавливаем Useragent
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Android {0}; {2}; rv:{1}.0) Gecko/20100101 Firefox/{1}.0", AndroidOC, version, device);
project.Profile.UserAgentAppVersion = string.Format(@"5.0 (Android {0})", AndroidOC);
project.Profile.UserAgentAppName = "Netscape";
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = "20100101";
Mozilla/5.0 ([Platform]) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[ChromeVer] Safari/537.36
- AppleWebKit/537.36 (KHTML, like Gecko) — Указывает на то, что браузер основан на Webkit. Данный движок изначально был предложен компанией Apple в 2001 году, как форк KHTML, это и объясняет упоминание яблочного бренда в данной строке. 537.36 актуальная версия движка, начиная с 2013 года.
- Chrome/[ChromeVer] – Заявляет, что используется браузер Chrome определённой версии.
- Safari/537.36 — Имеет свою историческую причину. Подробнее можете почитать здесь.
Браузер содержит достаточно большое кол-во билдов (то, что перечислено в ChromeBuild - это ещё не всё), поэтому я вынес эту в отдельную таблицу в виде файла chrome-builds.data, который Вы можете скачать здесь. Разместить его необходимо рядом с шаблоном.
C#:
Random r = new Random();
Tuple<string, int, int>[] ChromeBuild = {
Tuple.Create("55", 2841, 2883),
Tuple.Create("56", 2884, 2924),
Tuple.Create("57", 2925, 2987),
Tuple.Create("58", 2988, 3029),
Tuple.Create("59", 3030, 3071),
Tuple.Create("60", 3072, 3112),
Tuple.Create("61", 3113, 3163),
Tuple.Create("62", 3164, 3202),
Tuple.Create("63", 3203, 3239),
Tuple.Create("64", 3240, 3282),
Tuple.Create("65", 3283, 3290)
};
int random = r.Next(0, ChromeBuild.Length);
string version = ChromeBuild[random].Item1;
string build = Convert.ToString(r.Next(ChromeBuild[random].Item2, ChromeBuild[random].Item3));
string build2 = string.Empty;
int randomNumber = r.Next(0, ChromeBuild.Length);
foreach (string line in File.ReadLines(string.Format(@"{0}chrome-builds.data", project.Path)))
{
if (line.Contains(string.Format(@"{0}.{1}", ChromeBuild[randomNumber].Item1, ChromeBuild[randomNumber].Item3)))
{
project.SendInfoToLog(string.Format(@"{0}.{1}", ChromeBuild[2].Item1, ChromeBuild[2].Item2));
string[] temp = line.Split(new[] {','}, StringSplitOptions.None);
string lastBuild = line.Split(';')[1].Split(',')[r.Next(0, temp.Length)];
if (lastBuild.Contains("-")) {lastBuild = Convert.ToString(r.Next(int.Parse(lastBuild.Split('-')[0]), int.Parse(lastBuild.Split('-')[1])+1));}
build2 = lastBuild;
}
}
// Формируем набор версий операционной системы Windows
// 6.0 Windows Vista
// 6.1 Windows 7
// 6.2 Windows 8
// 6.3 Windows 8.1
// 10.0 Windows 10
string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
// Определяем "битность" самого приложения
string platformApp = string.Empty;
if(platform=="Win32"){
platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
} else {
platformApp = "; Win64; x64";
}
// Устанавливаем Useragent
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{2} Safari/537.36", winOC, platformApp, string.Format(@"{0}.0.{1}.{2}", version, build, build2));
project.Profile.UserAgentAppVersion = project.Profile.UserAgent.Replace(@"Mozilla/", "");
project.Profile.UserAgentAppName = "Netscape";
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = "20030107"; // Дата первого релиза браузера. Данное значение является константой.
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
// Устанавливаем BuildID
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, null);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, "Google Inc.");
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// OC
project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
project.Profile.UserAgentPlatform = platform;
Из чего состоит строка?
11 версия: Mozilla/5.0 ([Platform]; Trident/[TridentVersion]; rv:[IEVersion]) like Gecko
Более ранние версии: Mozilla/5.0 (compatible; MSIE [IEVersion]; [Platform]; Trident/[TridentVersion])
- [IEVersion] — Указывает версию IE. В последних версиях браузера GeckoVersion такая же, как FirefoxVersion.
- Trident/[TridentVersion] — Идентифицирует версию MSHTML (Trident)
C#:
// Выбираем случайную версию Firefox
string version = Macros.TextProcessing.Spintax("{11|10|9}");
//Формируем набор buildID нашего Firefox (у каждой версии свой) [Идея хранения позаимствована у doc'a, за что ему большая благодарность!]
Dictionary <string, string> buildIDSet = new Dictionary <string, string>();
buildIDSet.Add("11", "7.0");
buildIDSet.Add("10", "6.0");
buildIDSet.Add("9", "5.0");
//buildIDSet.Add("8", "4.0");
// Устанавливаем BuildID
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, null);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// Формируем набор версий операционной системы Windows
// 6.0 Windows Vista
// 6.1 Windows 7
// 6.2 Windows 8
// 6.3 Windows 8.1
// 10.0 Windows 10
string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
// Определяем "битность" самого приложения
string platformApp = string.Empty;
if(platform=="Win32"){
platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
} else {
platformApp = "; Win64; x64";
}
// Устанавливаем Useragent
if (winOC=="10.0") {
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}; Trident/{2}.0; rv:11.0) like Gecko", winOC, platformApp, buildIDSet["11"]);
project.Profile.UserAgentAppName = "Netscape";
} else {
project.Profile.UserAgent = string.Format("Mozilla/5.0 (compatible; MSIE {0}.0; Windows NT {1}{2}; Trident/{3}.0)", version, winOC, platformApp, buildIDSet[version]);
project.Profile.UserAgentAppName = "Microsoft Internet Explorer";
}
project.Profile.UserAgentAppVersion = project.Profile.UserAgent.Replace(@"Mozilla/", "");
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = null;
// OC
project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
project.Profile.UserAgentPlatform = platform;
Edge
Браузер от компании Microsoft, так же известен как Spartan, пришедший на смену Internet Explorer. Доступен только пользователям Windows 10 (и выше, в будущем), так как является не приложением, а неотъемлемой частью ОС Win 10. Работает на движке EdgeHTML, совместимый с WebKit, именно поэтому в строке useragent фигурирует упоминание AppleWebKit, Chrome и Safari.
Из чего состоит строка?
Mozilla/5.0 ([Platform]) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[ChromeVersion] Safari/537.36 Edge/[EdgeVersion]
- [ChromeVersion] — Указывает версию Chrome.
- Edge/[EdgeVersion] — Идентифицирует версию EdgeHTML
C#:
Random r = new Random();
Tuple<string, string>[] EdgeBuild = {
Tuple.Create("16.16299", "58.0.3029.110"),
Tuple.Create("15.15063", "52.0.2743.116"),
Tuple.Create("14.14393", "51.0.2704.79")
};
int random = r.Next(0, EdgeBuild.Length);
// Формируем набор версий операционной системы Windows
// 10.0 Windows 10
string winOC = "10.0";
string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
// Определяем "битность" самого приложения
string platformApp = string.Empty;
if(platform=="Win32"){
platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
} else {
platformApp = "; Win64; x64";
}
// Устанавливаем Useragent
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{2} Safari/537.36 Edge/{3}", winOC, platformApp, EdgeBuild[random].Item2, EdgeBuild[random].Item1);
project.Profile.UserAgentAppVersion = project.Profile.UserAgent.Replace(@"Mozilla/", "");
project.Profile.UserAgentAppName = "Netscape";
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = "20030107"; // Дата первого релиза браузера. Данное значение является константой.
// Устанавливаем BuildID
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, null);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// OC
project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
project.Profile.UserAgentPlatform = platform;
Последняя версия Safari 5.1.7 под Windows вышла 9 мая 2012 года, более данная платформа не поддерживается.
C#:
Random r = new Random();
Tuple<string, string>[] SafariBuild = {
Tuple.Create("5.1.7", "534.57.2"),
Tuple.Create("5.1.5", "534.55.3"),
Tuple.Create("5.1.4", "534.54.16")
};
int random = r.Next(0, SafariBuild.Length);
// Формируем набор версий операционной системы Windows
// 6.0 Windows Vista
// 6.1 Windows 7
// 6.2 Windows 8
// 6.3 Windows 8.1
// 10.0 Windows 10
string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
// Определяем "битность" самого приложения
string platformApp = string.Empty;
if(platform=="Win32"){
platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
} else {
platformApp = "; Win64; x64";
}
// Устанавливаем Useragent
//Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}) AppleWebKit/537.36 (KHTML, like Gecko) Version/{2} Safari/{3}", winOC, platformApp, SafariBuild[random].Item1, SafariBuild[random].Item2);
project.Profile.UserAgentAppVersion = project.Profile.UserAgent.Replace(@"Mozilla/", "");
project.Profile.UserAgentAppName = "Netscape";
project.Profile.UserAgentAppCodeName = "Mozilla";
project.Profile.UserAgentProduct = "Gecko";
project.Profile.UserAgentProductSub = "20030107"; // Дата первого релиза браузера. Данное значение является константой.
// Устанавливаем BuildID
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, null);
// Устанавливаем Vendor
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, "Apple Computer, Inc.");
// Устанавливаем VendorSub
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
// OC
project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
project.Profile.UserAgentPlatform = platform;
Старый код генерации разрешения, глубины и видимой области по прежнему актуален. Найти его Вы можете в первой частью статьи об анонимности, но данное решение было актуально для десктопов.
Сейчас мы поговорим о мобильных устройствах.
Здесь генерация случайного значения уже не подойдет так как каждое устройство имеет определённый набор параметров в данном направлении, а так же режим отображения: альбомная и портретная ориентация.
В последние годы все флагманы на Android имели Full HD разрешение (1080х1920) и QHD (1440х2560). В 2017 году на рынке стали появляться "безрамочные" устройства с нестандартными разрешениями, например:
- iPhone X: 1125 x 2436px
- Samsung Galaxy Note 8: 1440x 960px
- Samsung Galaxy S8: 1440x2960px
- Sony Xperia XZ Premium: 3840 x 2160px
Далее на что стоит обратить внимание, это ориентация устройства (нет, не сексуальная).
Устанавливается она с помощью Screen.lockOrientation()
JavaScript:
window.screen.lockOrientation("portrait-primary");
■ Набор плагинов
Как скрывать плагины мы научились, а до установки новых так и не добрались - исправляем ситуацию!
В данном примере мы рассмотрим добавления плагина от Adobe Flash.
C#:
List<PluginMimeType> lstMimes = new List<PluginMimeType>();
PluginMimeType mime = new ZennoLab.CommandCenter.PluginMimeType("application/x-shockwave-flash", "Adobe Flash movie", "swf");
lstMimes.Add(mime);
PluginItem plugin = new ZennoLab.CommandCenter.PluginItem("Shockwave Flash", "NPSWF32_28_0_0_126.dll", "Shockwave Flash 28.0 r0", "18.0.0.241", lstMimes);
■ Имя окна
С помощью JS задаётся свойство "window.name", невидимое для пользователя, но доступное для считывания. Оно постоянно для окна в рамках текущей вкладки браузера, даже при открытии в ней новых ссылок, при условии, что новая страница не пересоздаёт это свойство. Как Вы уже догадались, оно может выступать в роли маркера для последующей идентификации.
При работе с новым профилем, закрывайте старую вкладку и создавайте новую.
Или Вы можете переназначить данное свойство через JS-кубик:
JavaScript:
window.name = 'здесь текст'
Во втором случае с перензачением Tab name, изначально неизвестно, как именно должна выглядеть строка и проверяется ли она на корректность.
■ Другое
Язык
Есть две конфигурации: язык пользовательского интерфейса браузера и язык, на котором пользователь предпочитает просматривать веб-страницы, который передаётся в HTTP-заголовке «HTTP_ACCEPT_LANGUAGE». Они часто идентичны, но это не является строгим правилом. Например, итальянский пользователь использует браузер с англоязычным пользовательским интерфейсом, но предпочитает просматривать веб-страницы на итальянском языке.
Данный параметр не ударит по Вашей анонимности, но рекомендуется указывать его корректно. Повторюсь, что различие языков - это скорее косвенный признак низкого приоритета, чем явный.
Когда предпочтения браузера включает в себя несколько языков, назначается q=value (приоритетность) для каждого из них.
Подробнее об языковых приоритетах можете почитать здесь.
Скачать таблицу кодов языка: drive.google.com
C#:
Random r = new Random();
// Формируем набор возможных вариантов Accept-Language
// Здесь присутствует как русский язык, так и иностранный.
// Если необходимо, чтобы выборка была по какому-то определенному признаку - закоментируйте или удалите не нужные строки.
string[] acceptLanguageSet = {
"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",
"ru-RU,ru;q=0.9,en;q=0.8",
"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
"en-US,en;q=0.5",
"en-US,en;q=0.8,es;q=0.6",
"en-US,en;q=0.8,nl;q=0.6,el;q=0.4,de;q=0.2"
};
// Устанавливаем Accept-Language
string acceptLanguage = acceptLanguageSet[r.Next(0, acceptLanguageSet.Length)].ToString();
project.Profile.AcceptLanguage = acceptLanguage;
// Устанавливаем настройки языка
project.Profile.UserAgentBrowserLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
project.Profile.UserAgentLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
Do Not Track
Touchscreen Type (Touchscreen Support)
Adblock
devicePixelRatio
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
Battery
Данная фукнкция позволяет получить информацию о статусе зарядки от сети или работы от батареи и времени до отключения устройства.
Её истинное предназначение заключалось в предоставлении посетителеям разных версий сайта взависимости от оставшегося заряда девайса, например: отключалось автоматическое воспроизведение видео, а карты становились менее детализированными.
Но за маской создания более энергоэфективных и легкий веб-сайтов, скрывалась и потенциальзая угроза идентификации:
Исследователи из Принстонского университета Стив Инглхард (Steve Engelhard) и Арвинд Нараянан (Arvind Narayanan) опубликовали доклад, в котором рассказали, что при помощи данного API можно отслеживать пользователей, вычислить человека даже после смены IP-адреса, юзерагента и других публичных данных.
Свойство battery устарело и было заменено Navigator.getBattery() в Firefox 50, а из Firefox 52 данная функция и вовсе была удалена .
Итого: включить Battery API, используя 52-й движок невозможно.
Для более старого движка, который используется в ZennoPoster - 45, доступны такие методы:
Отключение. Вариант #1
C#:
// Актуально для 45-го движка
instance.HideNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Battery);
instance.HideNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.GetBattery);
C#:
// Актуально для 45-го движка
instance.SetBrowserPreference("dom.battery.enabled", false);
C#:
// Актуально для 45-го движка
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.GetBattery);
instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Battery);
■ Кэш
ETag
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
Last-Modified
В первую очередь Last-Modified нужен для снижения нагрузки на сервер и ускорения индексации страниц сайта. Он сообщает клиенту информацию о последних изменениях страницы. Причём же здесь деаномизация? Спросите Вы.
Его особенность заключается в том, что заголовок не имеет жёсткой привязки к формату, хоть и должен представлять дату, поэтому там может оказаться, всё что угодно, например, выданный Вам идентификатор, но вряд ли этим кто-то будет злоупотреблять. И всё же раз такая вероятность есть, хоть и небольшая, об этом стоит знать.
Избавиться от маркера достаточно просто - очистить кэш.
C#:
// Аналог на кубике находится в "Добавить действие" -> "Браузер" -> "Настройки"
instance.ClearCache(); // Очищаем кэш
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ IndexedDB
Теперь Вы можете не только блокировать запись в IndexedDB, но и просто очистить хранилище, а так же подгружать данные IDB под каждый профиль индивидуально. Это хорошие новости т.к. блокировка являлась достаточно специфическим решением т.к. некоторые сайты хранят там важную информацию для корректной работы сайта.
C#:
// Аналог на кубике находится в "Добавить действие" -> "Браузер" -> "Настройки"
instance.ClearCache(); // Очищаем кэш, а вместе с ним и IndexedDB
Индивидуальное хранение данных IndexedDB, реализуется через метод instance.SaveIndexedDb
C#:
string nameIDB = project.Variables["profile"].Value; // Название для файла с IndexedDB. В проекте необходимо создать переменную с названием profile, либо заменить на свою.
instance.SaveIndexedDb(string.Format(@"{0}{1}.db", project.Path, nameIDB)); // Сохранит в папке с шаблоном
// Загрузка данных хранилища IndexedDB
//instance.LoadIndexedDb(string.Format(@"{0}{1}.db", project.Path, nameIDB));
■ Куки (Web cookies)
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ Super Cookie
LSO Cookies
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
Evercookies / Zombie Cookie
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ Изолированное хранилище Silverlight
Silverlight имеет много общего с Adobe Flash, только в отличие от флеша настройки приватности тут никак не завязаны на браузере, поэтому даже при тотальной очистке куков и кеша, сохраненные данные в Isolated Storage Silverlight, все равно останутся.
Хранилище является общим для всех окон браузера и профилей, установленных на одной машине.
Популярность хранения идентификаторов в IS кране сомнительная, но раз такая возможность есть - рассмотрим.
Изолированное хранилище располагается здесь:
- C:\Users\%Имя пользователя%\AppData\LocalLow\Microsoft\Silverlight\is\
Данный код удаляет все данные из Isolated Storage.
C#:
string isolaledStorage = Path.Combine(string.Format(@"{0}Low", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)), @"Microsoft\Silverlight\is");
DirectoryInfo dirInfo = new DirectoryInfo(isolaledStorage);
if (Directory.Exists(isolaledStorage)) {
foreach (FileInfo file in dirInfo.GetFiles()) file.Delete();
foreach (DirectoryInfo subDirectory in dirInfo.GetDirectories()) subDirectory.Delete(true);
return "Isolated Storage Silverlight - Очищено!";
}
else {
return "Isolated Storage Silverlight - Каталог не найден!";
}
В прошлой части статьи мы блокировали файл SiteSecurityServiceState.txt для записи, в котором хранились записи HSTS Super cookies, но в новых версиях ZennoPoster, начиная с 5.11.30, мы можем управлять ими встроенными методами, которые позволяют очищать, сохранять и загружать.
Поэтому прошлый метод уже неактуален, HSTS Super cookies очищаются вообще с обычными куками.
C#:
// Аналог на кубике находится в "Добавить действие" -> "Браузер" -> "Настройки"
instance.ClearCookie(); // Очищаем куки
Тестирование: http://www.radicalresearch.co.uk/lab/hstssupercookies
Связь и местоположение
■ ⦿ IP адрес (Прокси)
В прошлом выпуске мы поговорили о типах прокси и данных, которые они передают.
Но задумывались ли Вы об их происхождении и как это может влиять на работу?
Происхождение прокси
Чёткого разделения нет, всё условно и субъективно
- Серверные
- Живые (Residential)
- Мобильные
Живые (Residential) - вот, например, Ваш реальный IP адрес за которым Вы сейчас находитесь относится как раз к этой категории. То есть это адреса полученные от интернет-провайдера, а не дата-центра. Как правило цены на них гораздо выше.
Мобильные - 3G\4G прокси, поднятые на модемах или специальном оборудовании. Их особенность заключается в том, что у оператора мобильной связи всего в наличии несколько тысяч IP адресов, а абонентов - миллионы, и за одним IP адресом может находится несколько сотен человек. Улавливаете мысль?
Сервисы не банят такие IP адреса (могут, конечно, но никто делать это не будет) т.к. такие действия отсекают огромную часть аудитории, а не конкретного пользователя. У мобильных проксей этакий карт-бланш на спамность, но это не значит, что Вы сможете стрелять с двух рук, как Макс Пейн, - Ваши аккаунты по-прежнему могут забанить.
Так же их можно отнести к категории Живые (Residential).
Принадлежность IP адреса к жилому или корпоративному сектору определяется по графе "Хоста" и "Названию провайдера", которые легко можно получить, зная только айпишник. Например, здесь: https://2ip.ru/whois/
На определённом кол-во сайтов, кол-во которых будет расти в геометрической прогрессии, отношение к серверным IP адресам крайне скептическое и получить санкции Вы можете при первом лёгком чихе.
■ DNS (Domain Name System)
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ WebRTC (Утечка IP)
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ Flash (утечка IP)
Если у Вас включён Flash, высока вероятность утечки Вашего реального IP адреса.
Чтобы этого избежать, необходимо его отключить, как это предлагалось ранее, либо запретить подобного рода запросы к нашей системе.
Для этого нам необходимо будет подправить файл конфигурации mms.cfg, который находится здесь:
- Windows (32Bit): \System32\Macromed\ Flash\
- Windows (64Bit): C:\Windows\SysWOW64\Macromed \ Flash \
Пропишите в конце строку и сохраните файл:
C#:
DisableSockets=1
■ Геолокация
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ Таймзона
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
Отпечатки
■ WebGL
К сожалению, эмулировать отпечаток WebGL пока не представляется возможным, но я слышал краем уха, что разработка над этим ведётся Остаётся только ждать.
Небольшие изменения прозошли в конфиге нашего браузера с появлением Firefox 52.
Теперь для отключения WebGL, необходимо прописать ещё одну строку:
C#:
instance.SetBrowserPreference("webgl.enable-webgl2", false);
C#:
instance.SetBrowserPreference("webgl.disabled", true);
instance.SetBrowserPreference("webgl.enable-webgl2", false);
instance.SetBrowserPreference("webgl.disable-extensions", true);
instance.SetBrowserPreference("webgl.min_capability_mode", true);
C#:
// Аналог на кубике находится в "Добавить действие" -> "Браузер" -> "Настройки"
instance.UseJavaScripts = false; // Отключает JS
Тестирование: https://browserleaks.com/webgl
■ Fingerprint Canvas
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
Интересное:
https://bugzilla.mozilla.org/show_bug.cgi?id=967895
Mozilla Firefox запретит отслеживать пользователей через Canvas, начиная с 58-ой версии браузера.
■ Browser Fingerprint
По данному разделу нет изменений.
Ознакомиться с первой частью статьи об анонимности.
■ ⦿ AudioContext Fingerprint
Теперь не нужно мучить настройки звуковой карты, в последних версиях ZennoPoster появилась поддержка эмуляции аудио-отпечатка.
Всё, что от Вас требуется, это добавить и выполнить соответствующий кубик.
Тестирование: https://audiofingerprint.openwpm.com/
■ ⦿ Системные шрифты (Fonts Fingerprint)
В первой части статьи мы рассмотрели вариант физического добавления и удаления шрифтов в операционной системе через C# код. С тех пор в ZennoPoster появился удобный метод, но работает он только для JavaScript.
Flash по-прежнему может получить весь список шрифтов в Вашей системе. Я рекомендую отключать Flash / Java / Silverlight ещё на старте проекта, если эти технологии не требуются для корректной работы сайта с которым Вы взаимодействуете. Но если вдруг Вам нужен Flash, но доступ к шрифтам Вы давать не хотите - есть выход.
Adobe Flash можно запретить доступ к системной папке с шрифтами.
Для этого нам необходимо будет подправить файл конфигурации mms.cfg, который находится здесь:
- Windows (32Bit): \System32\Macromed\Flash\
- Windows (64Bit): C:\Windows\SysWOW64\Macromed \Flash\
Пропишите в конце строку и сохраните файл:
Код:
DisableDeviceFontEnumeration = 1
Схема resource:// - это список встроенных файлов Firefox, которые содержат настройки браузера по умолчанию.
Проблема в том, что часть этой информации доступна не только изнутри, но и сайтам, к которым подключается браузер.
Сайту может стать известна следующая информация:
- Настоящая платформа, на которой запущен браузер.
- Язык по умолчанию
- Данные о сборке
- Данные и контрольная суммы элементов: firefox.js, firefox-branding.js, firefox-l10n.js, webide-prefs.js, greprefs.js, services-sync.js
- И другие данные
На более ранних версия Firefox, можно использовать расширение, которое решает вопрос с утечкой ресурсов:
https://addons.mozilla.org/en-US/firefox/addon/no-resource-uri-leak/
Но в ZP подгрузить мы его не можем. Пытался адаптировать JS скрипт расширения под ZennoPoster, но не хватило знаний.
Подключайтесь, друзья!
Пока что, единственное решение - это отключить JavaScript.
C#:
// Аналог на кубике находится в "Добавить действие" -> "Браузер" -> "Настройки"
instance.UseJavaScripts = false; // Отключает JS
■ ⦿ WebRTC (Камера, Микрофон)
■ ⦿ ClientRect
getClientRects позволяет получить точное положение и размер пикселя DOM-элемента. В зависимости от разрешения, конфигурации шрифта и множества других параметров результаты getClientRects будут уникальными, что позволяет достаточно точно идентифицировать пользователя.
Воспользуемся эмуляцией:
Код:
instance.ClientRectWorkMode = ZennoLab.InterfacesLibrary.Enums.Browser.ClientRectMode.Emulate;
instance.ClientRectSeed = "";
■ ⦿ Ubercookies
Это своего рода улучшенная версия Evercookie (Zombie Cookie), разница лишь в том, что Ubercookie ничего не сохраняет. Он использует Javascript API для создания отпечатка Вашего оборудования и браузера:
- AudioContext Fingerprint
- ClientRect
Для этого необходимо выполнить код эмуляции одного или двух методов, описанных выше, для изменения конечного хэша.
Тестирование: http://ubercookie.robinlinus.com/
■ ⦿ IP Stack fingerprint \ Passive OS Fingerprint
В различных операционных системах используются отличные друг от друга методы реализации стэка TCP/IP, что позволяет с большой долей вероятности вычислить, какой ОС был сформирован сетевой пакет. Так как данный метод подразумевает только наблюдение за сетевым трафиком без отправки каких-либо запросов, такой метод фингерпринта называют пассивным.
При работе без прокси, мы можем ограничить подобную сетевую активность через Firewall. Точных настроек я подскажу, как не являюсь системным администратором, но для таких же зелёных как я в этом вопросе есть простое решение, например, Symantec Enpoint Protection. Прописывает необходимые правила из коробки.
И результатом такой идентификации будет "???"
Если же Вы работаете с проксями или эмулируете какое-либо устройство, отличное от десктопа, данный метод идентификации способен доставить немало хлопот. Под проверку попадает исходящее соединение от хоста т.е. от машины, где запущен прокси-сервер, а это значит выдать себя за пользователя Windows будет сложнее т.к. серверные прокси чаще всего поднимаются на Linux'e, а Residential выдадут хаотичный и неконтролируемый результат.
Это плохо:
Какие есть решения?
Поднять свои прокси по красоте с блекджеком и файрвольными-куртизанками
Покупать прокси у селлеров, где предоставляется услуга смены отпечатка операционной системы, либо его блокировка.
К сожалению, я не подкован по первому вопросу, поэтому я остановился на втором варианте.
Через пару часов поисков в моей таблице сравнений был всего один сервис больше никто таких услуг не предоставляет.
- Airsocks.in (борцы с реферальными ссылками могут выдохнуть )
На прокси можно повесить любой слепок операционной системы: Windows, Android, Linux, Mac OS и т.д.
Делается это через службу поддержки.
Это хорошо:
Продолжу изучать данную тему.
Тестирование: https://whoer.net/ru
P.S. Продолжение и обновление статьи в дальнейшем будет выходить вне конкурса. Не очень удобно ссылаться из одного места в другое, а несколько раз дублировать одно и тоже - не комильфо. Скомпилирую и буду вести тему в одном месте.
- Тема статьи
- Другое
- Номер конкурса статей
- Восьмой конкурс статей
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: