# Windows PowerShell を用いた指定ファイル書き換え例
# C#言語のソースコードを Windows PowerShell 上で定義して、その処理を実行させる
# 以下の例は「うさみみハリケーン」付属の解析練習用「UsaTest2.EXE」を対象としている
# 書き換え前に、下記対象ファイル「UsaTest2.EXE」のパスを、実行環境に合わせて修正する
# 以下のテキスト全体をコピーして、Windows PowerShell の画面に貼り付けると書き換えが実行される
# 初回書き換え時に「UsaTest2.EXE」のバックアップ「UsaTest2.EXE.bak」を作成する
# 起動した実行ファイルや、他のアプリケーションで排他的に使用中のファイルは、書き換えに失敗する
# 「#」は Windows PowerShell でのコメントアウトで、複数行ならば<# #>で囲む
# 書き換え対象ファイルのパスを指定(実行環境に合わせた修正が必要)
$outputPath ="C:\APP\UsaMimi_v044\UsaTest2.EXE"
# 書き換え処理(メソッド)をC#言語で定義
Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Text;
public class BinaryWriterExample
{
public static void WriteBinaryFile(string filePath)
{
// 「//」はC#でのコメントアウトで、複数行ならば/* */で囲む
// 指定されたファイルが存在するか確認する
if(File.Exists(filePath) == false)
{
Console.WriteLine("指定ファイルが存在しません");
return;
}
// バックアップを作成する(上書きなし)
if(File.Exists(filePath + ".bak") == false)
File.Copy(filePath, filePath + ".bak");
using (FileStream fs = new FileStream(filePath, FileMode.Open))
using (BinaryWriter writer = new BinaryWriter(fs))
{
// オフセットを指定する
writer.Seek(0x993, SeekOrigin.Begin);
// 整数値を書き込む例
// これは「UsaTest2.EXE」で固定アドレスのパラメータに設定された上限(値1000)を変更している
writer.Write(999999999);
// 別のオフセットを指定する
// 書き込み後に、オフセットが書き込み箇所の直後に自動で変更される
writer.Seek(0x2000, SeekOrigin.Begin);
// 浮動小数点数を書き込む例
writer.Write(1.250F);
writer.Write((double)1.250);
// 文字コードを指定して文字列を書き込む例
var outbuffer = Encoding.Unicode.GetBytes("ABC123あいう猫耳");
writer.Write(outbuffer);
Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
outbuffer = sjisEnc.GetBytes("ABC123あいう猫耳");
writer.Write(outbuffer);
outbuffer = Encoding.UTF8.GetBytes("ABC123あいう猫耳");
writer.Write(outbuffer);
//writer.Write("あいうえお");//これだと文字数情報が付加されてしまう
// バイト列を書き込む例
byte[] dataToWrite = new byte[] { 0x01, 0x02, 0xFF, 0x42 };
writer.Write(dataToWrite);
Console.WriteLine("指定ファイルを書き換えました");
}
}
}
"@
# 書き換え実行(メソッド呼び出し)
[BinaryWriterExample]::WriteBinaryFile($outputPath)
Write-Host "処理を終了しました"
| Copyright © 2025 Digital Travesia |