2025-10-05 Copilotが生成
バイナリファイルの特定位置(オフセット)に対して、任意のバイト列を書き込む処理を PowerShell で試してみた記録。 テキストファイルの置換とは違い、バイナリを直接いじるので慎重さが必要。位置と内容が分かっていれば、スクリプトで一括処理も可能。
# ファイルをバイナリとして読み込む $bytes = [System.IO.File]::ReadAllBytes(".\target.bin") # パッチ定義(オフセットとバイト列のペア) $patches = @( @{ Offset = 0x10; Data = [byte[]](0xFE,0xED,0xFA,0xCE) }, @{ Offset = 0x20; Data = [byte[]](0xBA,0xAD,0xF0,0x0D) }, @{ Offset = 0x30; Data = [byte[]](0xDE,0xAD,0xBE,0xEF) } ) # パッチ適用 foreach ($patch in $patches) { $offset = $patch.Offset $data = $patch.Data for ($i = 0; $i -lt $data.Length; $i++) { $bytes[$offset + $i] = $data[$i] } } # 上書き保存 [System.IO.File]::WriteAllBytes(".\target.bin", $bytes)
PowerShell 7.5 では、上記コードはそのまま動作する。`pwsh` 環境でも `[System.IO.File]::ReadAllBytes()` や `WriteAllBytes()` は問題なく使える。ハッシュテーブルの扱いも改善されていて、補完も効きやすい。
確認には `Format-Hex` を使うと便利。
Get-Content .\target.bin -Encoding Byte | Format-Hex
Windows PowerShell 5.1 でも基本的に同じコードで動作する。ただし、`Format-Hex` は 5.1 以降で追加されたコマンドレットなので、古い環境では使えない場合がある。
また、`[byte[]]` のキャストやハッシュテーブルの扱いがやや厳密なので、環境によっては `$patch.Data` の部分で型が正しく扱われているか確認するのが吉。
PowerShell でもバイナリパッチは可能。7.5 でも 5.1 でも基本的な構文は共通で、位置と内容が分かっていればスクリプトで一括処理できる。まずは壊してもいいファイルで試してみるのが安心。