需要幫助將包含在文本文件中的所有十六進制字符轉換爲字符串或ASCII。十六進制字符出現在PowerShell十六進制字符串轉換
USER1 DOMAIN1 7374726f6e6770617373776f7264403130
用戶2域2 7374726f6e6770617373776f7264403120
轉換後,它會顯示爲
USER1 DOMAIN1 strongpassword @ 10
文本文件包含多個密碼的標準格式,全部排成一排
需要幫助將包含在文本文件中的所有十六進制字符轉換爲字符串或ASCII。十六進制字符出現在PowerShell十六進制字符串轉換
USER1 DOMAIN1 7374726f6e6770617373776f7264403130
用戶2域2 7374726f6e6770617373776f7264403120
轉換後,它會顯示爲
USER1 DOMAIN1 strongpassword @ 10
文本文件包含多個密碼的標準格式,全部排成一排
Get-Content file.txt | Foreach-Object{
$user,$domain,$pass = $_.Split()
$pass = for($i=0; $i -lt $pass.length; $i+=2)
{
[char][int]::Parse($pass.substring($i,2),'HexNumber')
}
$user,$domain,(-join $pass) -join ' '
}
作爲如何做到這一點的一個例子:
$text = 'user1 domain1 7374726f6e6770617373776f7264403130'
$p = [Regex]::Match($text, '\w+$').Value
$pass = ((0..(($p.length - 1)/2) | % {[Char]([Convert]::toint16($p.SubString($_ * 2, 2), 16))}) -Join '')
$text = $text -Replace '\w+$', $pass
$text
像這樣:
$h = 7374726f6e6770617373776f7264403130
-join ($h -split '(..)' | ? { $_ } | % { [char][convert]::ToUInt32($_,16) })
$pass=""
$t="7374726f6e6770617373776f7264403130"
$t -split '(.{2})' |%{ if ($_ -ne "") { $pass+=[CHAR]([CONVERT]::toint16("$_",16)) }}
write host $pass
的第一個反應是與用戶,域,返回的行的唯一一個和密碼己解碼。
第二個反應是最優雅的Perl。
以下是兩者的組合:
[regex]$regEx = '(\S+)$';
$scriptBlock = { param ($match); -join ($match.Groups[1].Value -split '(..)' | ? { $_; } | % { [Char]([Convert]::ToInt16($_, 16)); }); }
Get-Content file.txt | % { $regEx.Replace($_, $scriptBlock); }
的腳本塊可以被格式化爲可讀性而不是簡潔/類似Perl混淆。 :)
$scriptBlock = {
param ($match);
-join (
$match.Groups[1].Value -split '(..)' | ? { $_; } | % {
[Char]([Convert]::ToInt16($_, 16));
}
);
};
另一種選擇。這具有爲您提供可以使用Format-Table查看或使用Export-Csv導出的對象的優點。此外,這裏的ConvertForm-Hexadecimal實現非常快速,即使對於非常大的字符串也可以很好地工作。
function ConvertFrom-Hexadecimal([string] $hexString)
{
[byte[]] $data = @()
if ([string]::IsNullOrEmpty($hexString) -eq $true -or $hexString.Length % 2 -ne 0)
{
throw New-Object FormatException("Hexadecimal string must not be empty and must contain an even number of digits to be valid.");
}
$hexString = $hexString.ToUpperInvariant()
$data = New-Object byte[] -ArgumentList ($hexString.Length/2)
for ([int] $index = 0; $index -lt $hexString.Length; $index += 2)
{
[int] $highDigitValue = if ($hexString[$index] -le ([char] '9')) { $hexString[$index] - ([char] '0') } else { $hexString[$index] - ([char] 'A') + 10 }
[int] $lowDigitValue = if ($hexString[$index + 1] -le ([char] '9')) { $hexString[$index + 1] - ([char] '0') } else { $hexString[$index + 1] - ([char] 'A') + 10 }
if ($highDigitValue -lt 0 -or $lowDigitValue -lt 0 -or $highDigitValue -gt 15 -or $lowDigitValue -gt 15)
{
throw New-Object FormatException("An invalid digit was encountered. Valid hexadecimal digits are 0-9 and A-F.")
}
else
{
[byte] $value = [byte](($highDigitValue -shl 4) -bor ($lowDigitValue -band 0x0F))
$data[$index/2] = $value;
}
}
return ,$data
}
$fileName = '.\testfile.txt'
$passwordColumn = @{ name = 'Password'; expression = { $bytes = ConvertFrom-Hexadecimal $_.EncodedPassword; [System.Text.Encoding]::ASCII.GetString($bytes); } }
$users = Import-Csv -Delimiter ' ' -Header User, Domain, EncodedPassword -Path $fileName | Select *, $passwordColumn
$users | ft -AutoSize
文本文件包含多個密碼,都排成一排,所以我們不能這樣定義,我想一個變量 – Nik