2013-06-21 4 views
2

Нужна помощь для преобразования всех шестнадцатеричных символов, содержащихся в текстовом файле, в строку или ASCII. Hex символы отображаются в стандартном форматеПреобразование PowerShell в строку

user1 domain1 7374726f6e6770617373776f7264403130
user2 domain2 7374726f6e6770617373776f7264403120

После преобразования он должен показать, как

user1 domain1 strongpassword @ 10

текстовый файл содержит несколько паролей , все расположены в строке

ответ

2
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 ' ' 
} 
1

Как об этом в качестве примера, как это сделать:

$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 
2

Как это:

$h = 7374726f6e6770617373776f7264403130 

-join ($h -split '(..)' | ? { $_ } | % { [char][convert]::ToUInt32($_,16) }) 
+0

текстовый файл содержит несколько паролей, все из которых расположены в строке, поэтому мы не можем определить переменную, как это, я полагаю, – Nik

0
$pass="" 
$t="7374726f6e6770617373776f7264403130" 
$t -split '(.{2})' |%{ if ($_ -ne "") { $pass+=[CHAR]([CONVERT]::toint16("$_",16)) }} 
write host $pass 
0

Первый ответ был единственным, который возвращается в линию с пользователем, домен, и пароль гекс-декодируется.

Второй ответ был самым похожим на Perl в элегантности.

Вот сочетание двух:

[regex]$regEx = '(\S+)$'; 
$scriptBlock = { param ($match); -join ($match.Groups[1].Value -split '(..)' | ? { $_; } | % { [Char]([Convert]::ToInt16($_, 16)); }); } 
Get-Content file.txt | % { $regEx.Replace($_, $scriptBlock); } 

ScriptBlock может быть отформатирован для удобства чтения вместо краткость/Perl-подобного запутывания.)

$scriptBlock = { 
    param ($match); 
    -join ( 
     $match.Groups[1].Value -split '(..)' | ? { $_; } | % { 
      [Char]([Convert]::ToInt16($_, 16)); 
     } 
    ); 
}; 
0

Другая альтернатива. Это дает вам возможность предоставить объект, который можно просмотреть с помощью 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