Module: Ronin::Web::UserAgents::Chrome

Defined in:
lib/ronin/web/user_agents/chrome.rb

Overview

Represents every possible Chrome User-Agent string.

Constant Summary collapse

KNOWN_VERSIONS =

Known Chrome versions

File.readlines(
  File.join(DATA_DIR,'chrome','versions.txt'), chomp: true
)
SUPPORTED_OSES =

Supported Operating Systems.

[
  :windows,
  :macos,
  :linux,
  :android
]
KNOWN_OS_VERSIONS =

Known OS versions grouped by OS.

{
  windows: OS::Windows::VERSIONS.keys,
  macos:   OS::MacOS::VERSIONS,
  linux:   [],
  android: OS::Android::VERSIONS
}
SUPPORTED_OS_ARCHES =

Supported architectures grouped by OS.

{
  windows: OS::Windows::ARCHES.keys,
  macos:   OS::MacOS::ARCHES.keys,
  linux:   OS::Linux::ARCHES.keys,
  android: OS::Android::ARCHES.keys
}
SUPPORTED_LINUX_DISTROS =

Supported Linux Distros.

OS::Linux::DISTROS.keys

Class Method Summary collapse

Class Method Details

.build(chrome_version:, os:, os_version: nil, linux_distro: nil, arch: nil, android_device: nil) ⇒ String

Builds a new Chrome User-Agent string.

Parameters:

  • chrome_version (String)

    The Chrome/... version.

  • os (:windows, :macos, :linux, :android)

    The Operating System.

  • os_version (String, nil) (defaults to: nil)

    The Operating System version. Is required if os: is :windows, :macos, or :android.

  • linux_distro (:ubuntu, :fedora, :arch, String, nil) (defaults to: nil)

    The optional Linux Distro. Only supported if os: is :linux.

  • arch (:x86_64, :x86, :i686, :aarch64, :arm64, :arm) (defaults to: nil)

    The hardware architecture. Can be omitted if os: is :android.

  • android_device (String, nil) (defaults to: nil)

    The Android device. Only supported if os: is :android.

Returns:

  • (String)

    The new User-Agent string.



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
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/ronin/web/user_agents/chrome.rb', line 60

def self.build(chrome_version: ,
               os: ,
               os_version: nil,
               linux_distro: nil,
               arch: nil,
               android_device: nil)
  case os
  when :windows
    unless os_version
      raise(ArgumentError,"os: :windows also requires an os_version: value")
    end

    build_windows(
      chrome_version:  chrome_version,
      windows_version: os_version,
      arch:            arch
    )
  when :macos
    unless os_version
      raise(ArgumentError,"os: :macos also requires an os_version: value")
    end

    build_macos(
      chrome_version: chrome_version,
      macos_version:  os_version,
      arch:           arch || :intel
    )
  when :linux
    unless arch
      raise(ArgumentError,"os: :linux also requires an arch: value")
    end

    build_linux(
      chrome_version: chrome_version,
      linux_distro:   linux_distro,
      arch:           arch
    )
  when :android
    unless os_version
      raise(ArgumentError,"os: :android also requires an os_version: value")
    end

    build_android(
      chrome_version:  chrome_version,
      android_version: os_version,
      arch:            arch,
      android_device:  android_device
    )
  else
    raise(ArgumentError,"unsupported os: value (#{os.inspect})")
  end
end

.build_android(chrome_version:, android_version:, arch: nil, android_device: nil) ⇒ String

Builds a Chrome User-Agent string for Android.

Parameters:

  • chrome_version (String)

    The Chrome/... version.

  • android_version (String, nil)

    The Android version.

  • arch (:arm, :arm64, nil) (defaults to: nil)

    The optional hardware architecture.

  • android_device (String, nil) (defaults to: nil)

    The optional Android device.

Returns:

  • (String)

    The Chrome User-Agent string for Android.



285
286
287
288
289
290
291
292
293
294
# File 'lib/ronin/web/user_agents/chrome.rb', line 285

def self.build_android(chrome_version: , android_version: , arch: nil, android_device: nil)
  arch = OS::Android::ARCHES.fetch(arch)

  extensions = String.new("Linux")
  extensions << "; #{arch}" if arch
  extensions << "; Android #{android_version}"
  extensions << "; #{android_device}" if android_device

  return "Mozilla/5.0 (#{extensions}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Mobile Safari/537.36"
end

.build_linux(chrome_version:, arch:, linux_distro: nil) ⇒ String

Builds a Chrome User-Agent string for Linux.

Parameters:

  • chrome_version (String)

    The Chrome/... version.

  • arch (:x86_64, :x86, :i686, :aarch64, :arm64)

    The hardware architecture.

  • linux_distro (:ubuntu, :fedora, :arch, String, nil) (defaults to: nil)

    The optional Linux Distro.

Returns:

  • (String)

    The Chrome User-Agent string for Linux.



254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/ronin/web/user_agents/chrome.rb', line 254

def self.build_linux(chrome_version: , arch: , linux_distro: nil)
  linux_distro = OS::Linux::DISTROS.fetch(linux_distro,linux_distro)
  linux_arch   = OS::Linux::ARCHES.fetch(arch) do
                   raise(ArgumentError,"unknown arch: value (#{arch.inspect})")
                 end

  extensions = String.new("X11")
  extensions << "; #{linux_distro}" if linux_distro
  extensions << "; Linux #{linux_arch}"

  return "Mozilla/5.0 (#{extensions}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Safari/537.36"
end

.build_macos(chrome_version:, macos_version:, arch: :intel) ⇒ String

Builds a Chrome User-Agent string for macOS.

Parameters:

  • chrome_version (String)

    The Chrome/... version.

  • macos_version (String, nil)

    The macOS version.

  • arch (:x86_64, :x86, :i686, :aarch64, :arm64, :arm) (defaults to: :intel)

    The hardware architecture.

Returns:

  • (String)

    The Chrome User-Agent string for macOS.



230
231
232
233
234
235
236
237
# File 'lib/ronin/web/user_agents/chrome.rb', line 230

def self.build_macos(chrome_version: , macos_version: , arch: :intel)
  macos_version = OS::MacOS::VERSIONS_UNDERSCORED[macos_version]
  macos_arch    = OS::MacOS::ARCHES.fetch(arch) do
                    raise(ArgumentError,"unknown arch: value (#{arch.inspect})")
                  end

  return "Mozilla/5.0 (Macintosh; #{macos_arch} Mac OS X #{macos_version}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Safari/537.36"
end

.build_windows(chrome_version:, windows_version:, arch: nil) ⇒ String

Builds a Chrome User-Agent string for Windows.

Parameters:

  • chrome_version (String)

    The Chrome/... version.

  • windows_version (String, nil)

    The Windows version.

  • arch (:x86_64, :x86, :i686, :aarch64, :arm64, :arm) (defaults to: nil)

    The hardware architecture.

Returns:

  • (String)

    The Chrome User-Agent string for Windows.



203
204
205
206
207
208
209
210
211
212
213
# File 'lib/ronin/web/user_agents/chrome.rb', line 203

def self.build_windows(chrome_version: , windows_version: , arch: nil)
  windows_version = OS::Windows::VERSIONS.fetch(windows_version,windows_version)
  windows_arch    = OS::Windows::ARCHES.fetch(arch) do
                      raise(ArgumentError,"unknown arch: value (#{arch.inspect})")
                    end

  extensions = "Windows NT #{windows_version}"
  extensions << "; #{windows_arch}" if windows_arch

  return "Mozilla/5.0 (#{extensions}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{chrome_version} Safari/537.36"
end

.random(chrome_version: KNOWN_VERSIONS.sample, os: SUPPORTED_OSES.sample, os_version: KNOWN_OS_VERSIONS[os].sample, linux_distro: SUPPORTED_LINUX_DISTROS.sample, arch: SUPPORTED_OS_ARCHES[os].sample, android_device: OS::Android::DEVICES.sample) ⇒ String

Generates a random Chrome User-Agent string.

Parameters:

  • chrome_version (String) (defaults to: KNOWN_VERSIONS.sample)

    The Chrome/... version.

  • os (:windows, :macos, :linux, :android) (defaults to: SUPPORTED_OSES.sample)

    The Operating System.

  • os_version (String, nil) (defaults to: KNOWN_OS_VERSIONS[os].sample)

    The Operating System version. Is required if os: is :windows, :macos, or :android.

  • linux_distro (:ubuntu, :fedora, :arch, String, nil) (defaults to: SUPPORTED_LINUX_DISTROS.sample)

    The optional Linux Distro. Only supported if os: is :linux.

  • arch (:x86_64, :x86, :i686, :aarch64, :arm64, :arm) (defaults to: SUPPORTED_OS_ARCHES[os].sample)

    The hardware architecture. Can be omitted if os: is :android.

  • android_device (String, nil) (defaults to: OS::Android::DEVICES.sample)

    The Android device. Only supported if os: is :android.

Returns:

  • (String)

    The random User-Agent string.



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/ronin/web/user_agents/chrome.rb', line 172

def self.random(chrome_version: KNOWN_VERSIONS.sample,
                os:             SUPPORTED_OSES.sample,
                os_version:     KNOWN_OS_VERSIONS[os].sample,
                linux_distro:   SUPPORTED_LINUX_DISTROS.sample,
                arch:           SUPPORTED_OS_ARCHES[os].sample,
                android_device: OS::Android::DEVICES.sample)
  build(
    chrome_version: chrome_version,
    os: os,
    os_version: os_version,
    linux_distro: linux_distro,
    arch: arch,
    android_device: android_device
  )
end