# Windows PowerShell を用いた指定プロセスのプロセスメモリ書き換え例
# 以下の例は「うさみみハリケーン」付属の解析練習用「UsaTest2_x64.exe」を対象としている
# 「UsaTest2_x64.exe」のプロセスで、固定アドレスのパラメータ現在値を値9999に書き換える
# 「UsaTest2_x64.exe」起動後に、以下全体をコピーして、Windows PowerShell の画面に貼り付けると書き換えが実行される
# 対象プロセスが管理者権限で起動されたならば、 Windows PowerShell にも管理者権限が必要となる
# 「#」は Windows PowerShell でのコメントアウトで、複数行ならば<# #>で囲む
# 書き換え処理に必要なWindows API関数を使用可能にする
Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class Kernel32 {
[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten);
}
"@
# 対象プロセスのプロセスIDを取得する(ID手入力あるいはプロセス名からID取得)
<#
# プロセスIDを手入力する場合
$processID = 0 # ここに対象のプロセスのIDを入力してください
#>
# プロセス名からプロセスIDを取得する場合
$Procs = [System.Diagnostics.Process]::GetProcessesByName("UsaTest2_x64");
# プロセス名が一致した最初のプロセスのIDを取得
foreach ($proc in $Procs) {
$processID = $proc.Id;
break;
}
# 対象プロセスをオープン
$process = [System.Diagnostics.Process]::GetProcessById($processID)
if ($process) {
try {
# 書き込み先のメモリアドレス
$addressToWrite = 0x00014021403C # ここに書き込み先のメモリアドレスを入力してください
# 書き込むデータ(バイト列)
$dataToWrite = [byte[]]@(0x0F, 0x27, 0x00, 0x00) # ここに書き込むデータを入力してください
# 書き込み対象プロセスのハンドルを取得
$processHandle = $process.Handle
# WriteProcessMemory関数を呼び出してプロセスメモリにデータのバイト列を書き込む
[IntPtr]$bytesWritten = 0
$result = [Kernel32]::WriteProcessMemory($processHandle, [IntPtr]$addressToWrite, $dataToWrite, $dataToWrite.Length, [ref]$bytesWritten)
if ($result) {
Write-Host "プロセスメモリの書き換えに成功しました"
} else {
Write-Host "プロセスメモリの書き換えが失敗しました"
}
} catch {
# 対象プロセスが起動されていない、権限の不一致、あるいはアドレスやデータの指定に問題あり
Write-Host "書き換え処理に失敗しました 対象プロセスの起動や権限、書き込みアドレス・データを再確認してください"
} finally {
# 対象プロセスをクローズ
$process.Close()
}
} else {
Write-Host "対象プロセスが見つかりません"
}
| Copyright © 2025 Digital Travesia |