# 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 |