您可以使用win32 API读取调试对象的内存。要做到这一点,你需要在你的C#类进口2个KERNEL32.DLL功能:ReadProcessMemory和OpenProcess
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out int lpNumberOfBytesRead
);
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[Flags]
enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000
}
进程ID可以从DTE实例和内存地址通过评估& MyObject来获得。
int pid = _applicationObject.Debugger.CurrentProcess.ProcessID;
IntPtr phandle = OpenProcess((int)ProcessAccessFlags.VMRead, true, pid);
byte[] buffer = new byte[size];
int read;
ReadProcessMemory(phandle, (IntPtr)addr, buffer, (int)size, out read);
请注意,这只适用于如果你的人是32位进程。否则,您可以使用64位帮助程序从恶人中读取内存(为什么Visual Studio仍然是32位处理器?)。使用套接字与此进程进行通信。
谢谢汤姆。我做了,但是这是为了我想要的人工调试目的。我想在这里做的是创建一个VS2010加载项,可以评估该块内存中的数据,我不知道如何实现这一点。 – joeyzhao 2012-04-02 20:53:47