【发布时间】:2020-10-25 11:38:05
【问题描述】:
如何写入/读取任何进程的内存?
据我了解,我必须使用 WriteProcessMemory / ReadProcessMemory winapi 函数。
这是我的开始:
Add-Type -TypeDefinition '
using System;
using System.Runtime.InteropServices;
public class winapi{
[DllImport("kernel32.dll")]public static extern Boolean WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
IntPtr lpBuffer,
UInt32 nSize,
ref UInt32 lpNumberOfBytesWritten
);
[DllImport("kernel32.dll")]public static extern Boolean ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
IntPtr lpBuffer,
UInt32 dwSize,
ref UInt32 lpNumberOfBytesRead
);
}
'
[IntPtr]$mem = [Runtime.InteropServices.Marshal]::AllocHGlobal(4)
$dataToWrite = "ABC"
[IntPtr]$hProcess = $pid
[IntPtr]$lpBaseAddress = $mem
[IntPtr]$lpBuffer
[UInt32]$nSize
[UInt32]$BytesWritten
$CallResult = [winapi]::WriteProcessMemory(
$hProcess,
$lpBaseAddress,
$lpBuffer,
$nSize,
[ref]$BytesWritten
)
$CallResult
[IntPtr]$hProcess = $pid
[IntPtr]$lpBaseAddress = $mem
[UInt32]$ReadSize = 4
[IntPtr]$lpBuffer = [Runtime.InteropServices.Marshal]::AllocHGlobal($ReadSize)
[UInt32]$BytesRead = 0
$CallResult = [winapi]::ReadProcessMemory(
$hProcess,
$lpBaseAddress,
$lpBuffer,
$ReadSize,
[ref]$BytesRead
)
$CallResult
# As I understand, here I should get "ABC"
[Runtime.InteropServices.Marshal]::FreeHGlobal($mem)
[Runtime.InteropServices.Marshal]::FreeHGlobal($lpBuffer)
我需要读取一些进程内存/写入进程内存。
如何正确做?
【问题讨论】:
-
在底部的
FreeHGlobal()调用之前添加$destArray = [byte[]]::new($BytesRead);[System.Runtime.InteropServices.Marshal]::Copy($lpBuffer, $destArray, 0, $BytesRead)- 将存储在非托管$lpBuffer中的读取内存复制到$destArray- 但它不会对应于$dataToWrite,因为你实际上并没有写任何东西 :) -
“如何正确操作?” 呃,第一步是搞清楚,读/写哪个地址。那是困难的部分。你问的问题是微不足道的部分,已经被问了数百次了。
标签: .net powershell winapi