Способ получения UserAgent'ов браузеров через реестр: Создаём класс UserAgent.cs namespace UAgent { using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Management; using Microsoft.Win32; // Разработчик: r3xq1 public static class UserAgent { /// <summary> /// Метод для получения полного пути к браузеру по имени /// </summary> /// <param name="name">Имя браузера</param> /// <returns>Полный путь к браузеру</returns> private static string GetBrowserName(string name) { const string REG = @"Software\Clients\StartMenuInternet", COM = @"\shell\open\command"; string result = string.Empty; RegistryKey Apps; // Проверяем админ права if (Privilegies.IsAdmin) { try { // Если права есть, сначала проходимся по Локальной машине и собираем using (Apps = Registry.LocalMachine.OpenSubKey(REG, true)) { foreach (string subdir in Apps.GetSubKeyNames()) { using RegistryKey Path_To_Browsers = Apps?.OpenSubKey(string.Concat(subdir, COM)); string value = Path_To_Browsers?.GetValue("")?.ToString().Trim('"') ?? Path_To_Browsers?.GetValue("Path")?.ToString().Trim('"'); result = value.Contains(name) ? value : result; } } } catch { } } try { // Если прав нету, собираем из текущего пользователя ( или если есть права, то собираем из неё тоже ) using (Apps = Registry.CurrentUser.OpenSubKey(REG, true)) { foreach (string subdir in Apps.GetSubKeyNames()) { using RegistryKey Path_To_Browsers = Apps?.OpenSubKey(string.Concat(subdir, COM)); string value = Path_To_Browsers?.GetValue("")?.ToString().Trim('"') ?? Path_To_Browsers?.GetValue("")?.ToString().Trim('"'); result = value.Contains(name) ? value : result; } } } catch { } return result; } /// <summary> /// Метод для получения версии Widows OS /// </summary> private static string OsVersion { get { string result; try { result = $"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}"; } catch { result = string.Empty; using var OsSystem = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_OperatingSystem"); using ManagementObjectCollection ColOs = OsSystem?.Get(); foreach (ManagementBaseObject osElement in ColOs) { result = osElement["Version"]?.ToString(); } string[] array = result.Split('.'); result = $"{array[0]}.{ array[1]}"; } return result; } } /// <summary> /// Метод для получения текущей платформы Windows /// </summary> private static string WinPlatform { get { string result = string.Empty; try { switch (Environment.OSVersion.Platform) { case PlatformID.Win32Windows: result = "Windows NT"; break; case PlatformID.Win32NT: result = "Windows NT"; break; case PlatformID.Win32S: result = "Windows 3.1"; break; case PlatformID.WinCE: result = "Windows CE"; break; } } catch { } return result; } } private static string ArchitectureAgent => Environment.Is64BitOperatingSystem ? "Win64; x64" : "Win32; x86"; private static string OSBit => Environment.Is64BitOperatingSystem ? "x64" : "x86"; public static void GetData(string savepath) { string[] browsers = new string[] { "Chrome", "Firefox", "Opera", "Edge", "Internet Explorer", "Waterfox", "Dragon", "Palemoon", "Seamonkey" }; try { using var Agent = new StreamWriter(savepath); foreach (string names in browsers) { string PathToBrowser = GetBrowserName(names), FileVersion = FileVersionInfo.GetVersionInfo(PathToBrowser).FileVersion; string[] array = FileVersion.Split('.'); string FileVersionShort = $"{array[0]}.{array[1]}", ProdVersion = FileVersionInfo.GetVersionInfo(PathToBrowser).ProductVersion; if (PathToBrowser.Contains("Chrome")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36"); } if (PathToBrowser.Contains("Opera")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36 OPR/{ProdVersion}"); } if (PathToBrowser.Contains("Edge")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36 Edg/{ProdVersion}"); } if (PathToBrowser.Contains("Firefox")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersion}) Gecko/20100101 Firefox/{FileVersion}"); } if (PathToBrowser.Contains("Internet Explorer")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; WOW64; Trident/7.0; rv:{FileVersionShort}) like Gecko"); } if (PathToBrowser.Contains("Waterfox")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} Waterfox/{ProdVersion}"); } if (PathToBrowser.Contains("Dragon")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} IceDragon/{ProdVersion}"); } if (PathToBrowser.Contains("Palemoon")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} PaleMoon/{ProdVersion}"); } if (PathToBrowser.Contains("Seamonkey")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} SeaMonkey/{ProdVersion}"); } // Запись всех браузеров и их версии // Agent.WriteLine($"Browser: {PathToBrowser} \r\nFileVersion: {FileVersion} \r\nProductVersion: {ProdVersion}\r\n"); } } catch { } } } } Код namespace UAgent { using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Management; using Microsoft.Win32; // Разработчик: r3xq1 public static class UserAgent { /// <summary> /// Метод для получения полного пути к браузеру по имени /// </summary> /// <param name="name">Имя браузера</param> /// <returns>Полный путь к браузеру</returns> private static string GetBrowserName(string name) { const string REG = @"Software\Clients\StartMenuInternet", COM = @"\shell\open\command"; string result = string.Empty; RegistryKey Apps; // Проверяем админ права if (Privilegies.IsAdmin) { try { // Если права есть, сначала проходимся по Локальной машине и собираем using (Apps = Registry.LocalMachine.OpenSubKey(REG, true)) { foreach (string subdir in Apps.GetSubKeyNames()) { using RegistryKey Path_To_Browsers = Apps?.OpenSubKey(string.Concat(subdir, COM)); string value = Path_To_Browsers?.GetValue("")?.ToString().Trim('"') ?? Path_To_Browsers?.GetValue("Path")?.ToString().Trim('"'); result = value.Contains(name) ? value : result; } } } catch { } } try { // Если прав нету, собираем из текущего пользователя ( или если есть права, то собираем из неё тоже ) using (Apps = Registry.CurrentUser.OpenSubKey(REG, true)) { foreach (string subdir in Apps.GetSubKeyNames()) { using RegistryKey Path_To_Browsers = Apps?.OpenSubKey(string.Concat(subdir, COM)); string value = Path_To_Browsers?.GetValue("")?.ToString().Trim('"') ?? Path_To_Browsers?.GetValue("")?.ToString().Trim('"'); result = value.Contains(name) ? value : result; } } } catch { } return result; } /// <summary> /// Метод для получения версии Widows OS /// </summary> private static string OsVersion { get { string result; try { result = $"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}"; } catch { result = string.Empty; using var OsSystem = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_OperatingSystem"); using ManagementObjectCollection ColOs = OsSystem?.Get(); foreach (ManagementBaseObject osElement in ColOs) { result = osElement["Version"]?.ToString(); } string[] array = result.Split('.'); result = $"{array[0]}.{ array[1]}"; } return result; } } /// <summary> /// Метод для получения текущей платформы Windows /// </summary> private static string WinPlatform { get { string result = string.Empty; try { switch (Environment.OSVersion.Platform) { case PlatformID.Win32Windows: result = "Windows NT"; break; case PlatformID.Win32NT: result = "Windows NT"; break; case PlatformID.Win32S: result = "Windows 3.1"; break; case PlatformID.WinCE: result = "Windows CE"; break; } } catch { } return result; } } private static string ArchitectureAgent => Environment.Is64BitOperatingSystem ? "Win64; x64" : "Win32; x86"; private static string OSBit => Environment.Is64BitOperatingSystem ? "x64" : "x86"; public static void GetData(string savepath) { string[] browsers = new string[] { "Chrome", "Firefox", "Opera", "Edge", "Internet Explorer", "Waterfox", "Dragon", "Palemoon", "Seamonkey" }; try { using var Agent = new StreamWriter(savepath); foreach (string names in browsers) { string PathToBrowser = GetBrowserName(names), FileVersion = FileVersionInfo.GetVersionInfo(PathToBrowser).FileVersion; string[] array = FileVersion.Split('.'); string FileVersionShort = $"{array[0]}.{array[1]}", ProdVersion = FileVersionInfo.GetVersionInfo(PathToBrowser).ProductVersion; if (PathToBrowser.Contains("Chrome")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36"); } if (PathToBrowser.Contains("Opera")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36 OPR/{ProdVersion}"); } if (PathToBrowser.Contains("Edge")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; {ArchitectureAgent}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{FileVersion} Safari/537.36 Edg/{ProdVersion}"); } if (PathToBrowser.Contains("Firefox")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersion}) Gecko/20100101 Firefox/{FileVersion}"); } if (PathToBrowser.Contains("Internet Explorer")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; WOW64; Trident/7.0; rv:{FileVersionShort}) like Gecko"); } if (PathToBrowser.Contains("Waterfox")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} Waterfox/{ProdVersion}"); } if (PathToBrowser.Contains("Dragon")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} IceDragon/{ProdVersion}"); } if (PathToBrowser.Contains("Palemoon")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} PaleMoon/{ProdVersion}"); } if (PathToBrowser.Contains("Seamonkey")) { Agent.WriteLine($"Mozilla/5.0 ({WinPlatform} {OsVersion}; rv:{FileVersionShort}) Gecko/20100101 Firefox/{FileVersionShort} SeaMonkey/{ProdVersion}"); } // Запись всех браузеров и их версии // Agent.WriteLine($"Browser: {PathToBrowser} \r\nFileVersion: {FileVersion} \r\nProductVersion: {ProdVersion}\r\n"); } } catch { } } } } Создаём класс Privilegies.cs для проверки Админ прав namespace UAgent { using System.Security.Principal; public static class Privilegies { public static bool IsAdmin { get { try { using var identity = WindowsIdentity.GetCurrent(); if (null != identity) { var principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } catch { } return false; } } } } Код namespace UAgent { using System.Security.Principal; public static class Privilegies { public static bool IsAdmin { get { try { using var identity = WindowsIdentity.GetCurrent(); if (null != identity) { var principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } catch { } return false; } } } } Класс GlobalPaths.cs - где хранятся все пути namespace UAgent { using System; using System.IO; using System.Reflection; public static class GlobalPaths { public static string CurrDir => Environment.CurrentDirectory; public static string AgentsLog => Path.Combine(CurrDir, "Agents.txt"); public static string AssemblyPath => Assembly.GetExecutingAssembly().Location; public static string StartupPath => Path.GetDirectoryName(AssemblyPath); public static string GetFileName => Path.GetFileName(AppDomain.CurrentDomain.FriendlyName); public static string AppData => Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); public static string SelfHelper => Path.Combine(AppData, "Self.bat"); } } Код namespace UAgent { using System; using System.IO; using System.Reflection; public static class GlobalPaths { public static string CurrDir => Environment.CurrentDirectory; public static string AgentsLog => Path.Combine(CurrDir, "Agents.txt"); public static string AssemblyPath => Assembly.GetExecutingAssembly().Location; public static string StartupPath => Path.GetDirectoryName(AssemblyPath); public static string GetFileName => Path.GetFileName(AppDomain.CurrentDomain.FriendlyName); public static string AppData => Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); public static string SelfHelper => Path.Combine(AppData, "Self.bat"); } } Использование: namespace UAgent { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "UserAgent Grabber by r3xq1"; Console.WriteLine("Инициализация..."); UserAgent.GetData(GlobalPaths.AgentsLog); Console.WriteLine("Закончили сбор Юзерагентов! Посмотрите рядом файл \".txt\""); Console.ReadLine(); } } } Код namespace UAgent { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "UserAgent Grabber by r3xq1"; Console.WriteLine("Инициализация..."); UserAgent.GetData(GlobalPaths.AgentsLog); Console.WriteLine("Закончили сбор Юзерагентов! Посмотрите рядом файл \".txt\""); Console.ReadLine(); } } } Есть некоторые недоработки в этом примере. Так же можно попробовать сгенерировать через какой-нибудь онлайн сервис ( при открытом браузере )
Я чекал исходники редлайна(мне предоставили последний билдец), там как то всё по проще. --- Сообщение объединено с предыдущим 1 июл 2021 using System; using System.Diagnostics; using System.Net; using System.Threading; namespace RedLine.Client.Logic.Others { // Token: 0x02000060 RID: 96 public static class UserAgentDetector { // Token: 0x060001FE RID: 510 RVA: 0x0000617C File Offset: 0x0000437C public static string GetUserAgent() { try { UserAgentDetector.StartServer(UserAgentDetector.port); Process.Start(string.Format("", UserAgentDetector.port)); long ticks = DateTime.Now.Ticks; while (UserAgentDetector.useragent == null && new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds < 60.0) { Thread.Sleep(100); } } catch { } return UserAgentDetector.useragent; } // Token: 0x060001FF RID: 511 RVA: 0x0000620C File Offset: 0x0000440C private static void StartServer(int port) { string[] array = new string[] { string.Format("", port) }; HttpListener httpListener = new HttpListener(); foreach (string uriPrefix in array) { httpListener.Prefixes.Add(uriPrefix); } httpListener.Start(); new Thread(new ParameterizedThreadStart(UserAgentDetector.Listen)).Start(httpListener); } // Token: 0x06000200 RID: 512 RVA: 0x00006274 File Offset: 0x00004474 private static void Listen(object listenerObj) { HttpListener httpListener = listenerObj as HttpListener; HttpListenerContext context = httpListener.GetContext(); UserAgentDetector.useragent = context.Request.Headers["User-Agent"]; HttpListenerResponse response = context.Response; response.Redirect(""); response.Close(); httpListener.Stop(); } // Token: 0x0400015C RID: 348 private static int port = new Random().Next(13000, 14000); // Token: 0x0400015D RID: 349 private static string useragent; } } C# using System; using System.Diagnostics; using System.Net; using System.Threading; namespace RedLine.Client.Logic.Others { // Token: 0x02000060 RID: 96 public static class UserAgentDetector { // Token: 0x060001FE RID: 510 RVA: 0x0000617C File Offset: 0x0000437C public static string GetUserAgent() { try { UserAgentDetector.StartServer(UserAgentDetector.port); Process.Start(string.Format("", UserAgentDetector.port)); long ticks = DateTime.Now.Ticks; while (UserAgentDetector.useragent == null && new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds < 60.0) { Thread.Sleep(100); } } catch { } return UserAgentDetector.useragent; } // Token: 0x060001FF RID: 511 RVA: 0x0000620C File Offset: 0x0000440C private static void StartServer(int port) { string[] array = new string[] { string.Format("", port) }; HttpListener httpListener = new HttpListener(); foreach (string uriPrefix in array) { httpListener.Prefixes.Add(uriPrefix); } httpListener.Start(); new Thread(new ParameterizedThreadStart(UserAgentDetector.Listen)).Start(httpListener); } // Token: 0x06000200 RID: 512 RVA: 0x00006274 File Offset: 0x00004474 private static void Listen(object listenerObj) { HttpListener httpListener = listenerObj as HttpListener; HttpListenerContext context = httpListener.GetContext(); UserAgentDetector.useragent = context.Request.Headers["User-Agent"]; HttpListenerResponse response = context.Response; response.Redirect(""); response.Close(); httpListener.Stop(); } // Token: 0x0400015C RID: 348 private static int port = new Random().Next(13000, 14000); // Token: 0x0400015D RID: 349 private static string useragent; } } --- Сообщение объединено с предыдущим 1 июл 2021 бля. ебучий случай. ща --- Сообщение объединено с предыдущим 1 июл 2021 https://pastebin.com/vtmxEan0
r3xq1, вот тоже чекал, думал, что у меня одного не воркает. Думаю щас, а чё они не убрали это вообще?