documents:proglang:powershell:powershell-007
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:powershell:powershell-007 [2026/05/08 12:00] – ↷ documents:os:windows:powershell:powershell-007 から documents:proglang:powershell:powershell-007 へページを移動しました。 k896951 | documents:proglang:powershell:powershell-007 [2026/05/13 07:21] (現在) – [ファイル調査4:バイナリパッチをあてる] k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 103.ファイル調査4:バイナリパッチをあてる ====== | ||
| + | |||
| + | 2025-10-05 Copilotが生成 | ||
| + | |||
| + | ===== これは何? ===== | ||
| + | |||
| + | バイナリファイルの特定位置(オフセット)に対して、任意のバイト列を書き込む処理を PowerShell で試してみた記録。 | ||
| + | テキストファイルの置換とは違い、バイナリを直接いじるので慎重さが必要。位置と内容が分かっていれば、スクリプトで一括処理も可能。 | ||
| + | |||
| + | ===== 試したコード(共通構文) ===== | ||
| + | |||
| + | <code powershell> | ||
| + | # ファイルをバイナリとして読み込む | ||
| + | $bytes = [System.IO.File]:: | ||
| + | |||
| + | # パッチ定義(オフセットとバイト列のペア) | ||
| + | $patches = @( | ||
| + | @{ Offset = 0x10; Data = [byte[]](0xFE, | ||
| + | @{ Offset = 0x20; Data = [byte[]](0xBA, | ||
| + | @{ Offset = 0x30; Data = [byte[]](0xDE, | ||
| + | ) | ||
| + | |||
| + | # パッチ適用 | ||
| + | foreach ($patch in $patches) { | ||
| + | $offset = $patch.Offset | ||
| + | $data = $patch.Data | ||
| + | for ($i = 0; $i -lt $data.Length; | ||
| + | $bytes[$offset + $i] = $data[$i] | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # 上書き保存 | ||
| + | [System.IO.File]:: | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== PowerShell 7.5での動作 ===== | ||
| + | |||
| + | PowerShell 7.5 では、上記コードはそのまま動作する。`pwsh` 環境でも `[System.IO.File]:: | ||
| + | |||
| + | 確認には `Format-Hex` を使うと便利。 | ||
| + | |||
| + | Get-Content .\target.bin -Encoding Byte | Format-Hex | ||
| + | |||
| + | ===== PowerShell 5.1での動作 ===== | ||
| + | |||
| + | Windows PowerShell 5.1 でも基本的に同じコードで動作する。ただし、`Format-Hex` は 5.1 以降で追加されたコマンドレットなので、古い環境では使えない場合がある。 | ||
| + | |||
| + | また、`[byte[]]` のキャストやハッシュテーブルの扱いがやや厳密なので、環境によっては `$patch.Data` の部分で型が正しく扱われているか確認するのが吉。 | ||
| + | |||
| + | ===== 気づいたこと ===== | ||
| + | * オフセット指定でのバイナリ編集は、パターン検索より確実。 | ||
| + | * 複数箇所のパッチも、配列で定義すればスッキリ書ける。 | ||
| + | * 範囲外アクセスには注意。`$offset + $data.Length` が `$bytes.Length` を超えないように。 | ||
| + | * バックアップは忘れずに。壊れたら復旧できない。 | ||
| + | |||
| + | ===== まとめ ===== | ||
| + | |||
| + | PowerShell でもバイナリパッチは可能。7.5 でも 5.1 でも基本的な構文は共通で、位置と内容が分かっていればスクリプトで一括処理できる。まずは壊してもいいファイルで試してみるのが安心。 | ||
documents/proglang/powershell/powershell-007.txt · 最終更新: by k896951
