2014-01-05 4 views
7

powershellのみを使用してコマンドラインからバイナリ16進数の編集を実行しようとしています。このスニップで16進数置換を部分的に成功させました。 123456が複数回発生し、特定の場所でのみ置換が発生したと想定されると、問題が発生します。Powershellでバイナリファイルを16進数で編集する方法

注:snipには、Convert-ByteArrayToHexStringConvert-HexStringToByteArrayの機能が必要です。

http://www.sans.org/windows-security/2010/02/11/powershell-byte-array-hex-convert

$readin = [System.IO.File]::ReadAllBytes("C:\OldFile.exe"); 
$hx = Convert-ByteArrayToHexString $readin -width 40 -delimiter ""; 
$hx = $hx -replace "123456","FFFFFF"; 
$hx = "0x" + $hx; 
$writeout = Convert-HexStringToByteArray $hx; 
set-content -value $writeout -encoding byte -path "C:\NewFile.exe"; 

どのように我々は、この大ざっぱな-replaceコマンドを置き換えるためのPowerShellへのオフセット位置を指定することができます。

答えて

13

すでにバイト配列があるので、任意のオフセットでバイトを変更するだけで済みます。

$bytes = [System.IO.File]::ReadAllBytes("C:\OldFile.exe") 
$offset = 23 

$bytes[$offset] = 0xFF 
$bytes[$offset+1] = 0xFF 
$bytes[$offset+2] = 0xFF 

[System.IO.File]::WriteAllBytes("C:\NewFile.exe", $bytes)