PowerShell - decode an F5 BIG-IP cookie
# Decode-BigIPCookie.ps1
# usage:
# Decode-BigIPCookie "375537930.544.0000"
function Decode-Cookie {
param ([string] $ByteArrayCookie)
### F5 itself for the formula: https://support.f5.com/kb/en-us/solutions/public/6000/900/sol6917.html
### $poolcookie="375537930.544.0000"
###
if ($ByteArrayCookie -match '^(\d+)\.(\d+)\.0000$') {
$ipEncoded = [int64] $matches[1]
$portEncoded = [int64] $matches[2]
# convert ipEnc to Hexadecimal
$ipEncodedHex = "{0:X8}" -f $ipEncoded
# then split into an array of four
$ByteArray=@()
$ipEncodedHex -split '([a-f0-9]{2})' | foreach {if ($_) {$ByteArray += $_.PadLeft(2,"0")}}
# now reverse the array (the byte order)
$ReversedBytes = -join ($ByteArray[$($ByteArray.Length-1)..0])
# and convert each 1-byte hex back to decimal
$ByteArray=@()
$ReversedBytes -split '([a-f0-9]{2})' | foreach {if ($_) {$ByteArray += $_.PadLeft(2,"0")}}
# seperated by "."'s.
$IPstring=""
$ByteArray | foreach { $IPstring += "$([convert]::ToByte($_,16))." }
$IP = $IPstring.trimend(".")
# convert $portEncoded to Hexadecimal
$portEncodedHex = "{0:X4}" -f $portEncoded
# reverse the order of the 2 bytes
$ByteArray=@()
$portEncodedHex -split '([a-f0-9]{2})' | foreach {if ($_) {$ByteArray += $_.PadLeft(2,"0")}}
$ReversedBytes = -join ($ByteArray[$($ByteArray.Length-1)..0])
# and convert to decimal
$PORT=[convert]::ToUint64($ReversedBytes,16)
write-output "$IP : $PORT"
}
else {
write-output "cookie string format is invalid."
write-output "usage:"
write-output " .\Decode-BigIPCookie '375537930.544.0000' "
}
}
if ($args.count -gt 0) {
Decode-Cookie $args
}
else {
write-output " usage:"
write-output " Decode-BigIPCookie '375537930.544.0000' "
}
Comments
- Anonymous
December 17, 2012
Thanks for the script! I changed [int] to [int64] in lines 13 and 14 to support higher ranged IP addresses.