2011-12-31 67 views
-2

我想在C#中制作一个内存扫描器。我听说我需要API函数WriteProcessMemoryReadProcessMemory用C写一个内存扫描器#

我打电话给他们:

[DllImport("kernel32.dll")] 
    public static extern bool ReadProcessMemory(
     IntPtr hProcess, 
     IntPtr lpBaseAddress, 
     byte[] lpBuffer, 
     UInt32 nSize, 
     ref UInt32 lpNumberOfBytesRead 
    ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool WriteProcessMemory(
     IntPtr hProcess, 
     IntPtr lpBaseAddress, 
     byte[] lpBuffer, 
     uint nSize, 
     out UIntPtr lpNumberOfBytesWritten); 

所有内存扫描仪我在谷歌发现是很难理解的例子。我读过很多文章,说要找到值addr,你需要在任何内存字节搜索。现在我需要让程序打开从内存中读取和写入的过程。

我可以使用GetProcessByName吗?

+0

简答:是的。长答案:是的。 – 2011-12-31 18:06:52

+0

[阅读并尝试了解此项目的来源](http://www.codeproject.com/KB/cs/sojaner_memory_scanner.aspx) – 2011-12-31 18:09:46

回答

2

是的,就像这样:

Process[] process = Process.GetProcessesByName("cmd"); 
byte[] memory = new byte[255]; 
uint bytesRead =0; 
bool succes = ReadProcessMemory(
      process[0].Handle, 
      process[0].MainModule.BaseAddress , 
      memory , 
      (uint) memory.Length , 
      ref bytesRead); 

你必须检查是否成功,是真实的。如果不是,你什么也没读。

+0

man另一个问题,我不需要检查过程是否工作。我想打开proggra程序以供以后读取和写入 – user1124295 2011-12-31 19:13:05

+0

@ user1124295任何正在运行的名为cmd的进程都由此代码示例'打开',并​​准备稍后读取和写入。所以你可以从这里出发。我试图解释说,如果您为内存地址提供的内存地址不在您读取内存的进程的有效范围内,则调用ReadProcesMemory可能会返回false。祝你好运。 – rene 2011-12-31 19:24:50