Public/Helpers/Get-CurrentUserAgent.ps1
function Get-CurrentUserAgent { [CmdletBinding()] [OutputType([string])] param( [Parameter(Mandatory = $false)] [switch]$IncrementCount ) Write-Verbose -Message "Starting function Get-CurrentUserAgent" try { # Initialize user agent tracking if not exists if ($null -eq $script:SessionVariables.CurrentUserAgent) { Write-Verbose -Message "Initializing user agent tracking variables" $script:SessionVariables.CurrentUserAgent = $null $script:SessionVariables.UserAgentLastChanged = $null $script:SessionVariables.UserAgentRequestCount = 0 $script:SessionVariables.UserAgentRotationEnabled = $true # Enable by default } # If a custom user agent is set and no rotation, always return that if (-not [string]::IsNullOrEmpty($script:SessionVariables.CustomUserAgent) -and -not $script:SessionVariables.UserAgentRotationEnabled) { Write-Verbose -Message "Using fixed custom user agent: $($script:SessionVariables.CustomUserAgent)" if ($IncrementCount) { $script:SessionVariables.UserAgentRequestCount++ } return $script:SessionVariables.CustomUserAgent } # Only do rotation logic if enabled if ($script:SessionVariables.UserAgentRotationEnabled) { $currentTime = Get-Date $userAgentRotationInterval = $script:SessionVariables.UserAgentRotationInterval ?? [TimeSpan]::FromMinutes(30) $maxRequestsPerAgent = $script:SessionVariables.MaxRequestsPerAgent ?? 50 $shouldRotateUserAgent = $false # Check if we need to rotate if ($null -eq $script:SessionVariables.CurrentUserAgent) { # First time - select initial user agent $shouldRotateUserAgent = $true Write-Verbose -Message "First time initialization - selecting initial user agent" } elseif ($script:SessionVariables.UserAgentLastChanged -and ($currentTime - $script:SessionVariables.UserAgentLastChanged) -gt $userAgentRotationInterval) { # Time-based rotation $shouldRotateUserAgent = $true Write-Verbose -Message "Rotating user agent due to time interval ($userAgentRotationInterval)" } elseif ($maxRequestsPerAgent -and $script:SessionVariables.UserAgentRequestCount -ge $maxRequestsPerAgent) { # Request count-based rotation $shouldRotateUserAgent = $true Write-Verbose -Message "Rotating user agent due to request count limit ($maxRequestsPerAgent)" } if ($shouldRotateUserAgent) { try { # Select a new random user agent or default to a BlackCat one if no userAgents available if ($script:SessionVariables.userAgents -and $script:SessionVariables.userAgents.agents -and $script:SessionVariables.userAgents.agents.Count -gt 0) { $userAgent = ($script:SessionVariables.userAgents.agents | Get-Random).value } else { $userAgent = "Mozilla/5.0 (BlackCat Security Tool)" } $script:SessionVariables.CurrentUserAgent = $userAgent $script:SessionVariables.UserAgentLastChanged = $currentTime $script:SessionVariables.UserAgentRequestCount = 0 $script:SessionVariables.UserAgent = $userAgent Write-Verbose -Message "Selected new user agent: $userAgent" } catch { # Fallback to default user agent if there's an error $defaultUA = "Mozilla/5.0 (BlackCat Security Tool)" $script:SessionVariables.CurrentUserAgent = $defaultUA $script:SessionVariables.UserAgent = $defaultUA Write-Message -FunctionName $MyInvocation.MyCommand.Name -Message "Error selecting user agent: $_" -Severity 'Warning' Write-Verbose -Message "Using default user agent: $defaultUA" return $defaultUA } } } # Increment the request counter if needed if ($IncrementCount) { $script:SessionVariables.UserAgentRequestCount++ Write-Verbose -Message "Incremented request count to: $($script:SessionVariables.UserAgentRequestCount)" } # Make sure the current user agent is set in the main SessionVariables if (-not [string]::IsNullOrEmpty($script:SessionVariables.CurrentUserAgent)) { $script:SessionVariables.UserAgent = $script:SessionVariables.CurrentUserAgent return $script:SessionVariables.CurrentUserAgent } else { # Fallback if everything fails $defaultUA = "Mozilla/5.0 (BlackCat Security Tool)" $script:SessionVariables.UserAgent = $defaultUA Write-Verbose -Message "Using fallback default user agent: $defaultUA" return $defaultUA } } catch { $defaultUA = "Mozilla/5.0 (BlackCat Security Tool)" $script:SessionVariables.CurrentUserAgent = $defaultUA $script:SessionVariables.UserAgent = $defaultUA Write-Message -FunctionName $MyInvocation.MyCommand.Name -Message "Error in Get-CurrentUserAgent: $_" -Severity 'Error' Write-Verbose -Message "Returning emergency default user agent due to error" return $defaultUA } <# .SYNOPSIS Gets the current user agent string to use for HTTP requests based on rotation settings. .DESCRIPTION This function manages user agent rotation for BlackCat module requests. It tracks when and how often to rotate user agents based on configured time intervals and request counts to avoid detection. It can use a fixed custom user agent or rotate through a pool of realistic browser user agents. .PARAMETER IncrementCount When specified, increments the request counter for the current user agent. This should be used when a request is actually being made. .EXAMPLE # Get the current user agent without incrementing the counter $userAgent = Get-CurrentUserAgent .EXAMPLE # Get current user agent and increment the request counter $userAgent = Get-CurrentUserAgent -IncrementCount .NOTES The function's behavior is controlled by settings configured via Set-UserAgentRotation. #> } |