我可以从另一个程序的内存中获取字符串吗?

问题描述:

感谢您的帮助。我可以从另一个程序的内存中获取字符串吗?

我已经知道如何找到数值的内存地址,并读取\写在RAM中。 (使用C#)。 我想要做的是对于任何程序中的任何文本都是一样的。但我不知道这是否可能。

那么举个例子,我可以访问打开的notepad.exe内存来提取其中写入的String吗? 现在我这样做的,它返回垃圾:

Process process = Process.GetProcessesByName("notepad").FirstOrDefault(); 
String stringaddress = "00401110"; 
int address = int.Parse(stringaddress, NumberStyles.HexNumber); 
int bytesRead; 
byte[] value = MemoryAccess.ReadMemory(process, address, 2000000, out bytesRead); 
byte[] buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
           Encoding.UTF8, value); 
int count = buf.Length; 
String tempString = Encoding.UTF8.GetString(buf, 0, count); 

我终于要的是能够找到特定的窗口程序,并复制它内部的所有文本。

+0

的文本字符串的内存地址将是不同的每次启动记事本时间(或其他应用程序)。除非每次运行应用程序时都可以获得***正确的内存地址,否则这似乎不可行。 – Rohan

+0

如果要从特定窗口(窗体)中获取文本,可以使用WinAPI:EnumWindows查找窗口并使用GetWindowText获取所需的文本。 –

+0

@DmitryBychenko,我想他想从记事本中的文本框控件中获取文本。 GetWindowText无法检索另一个应用程序中的控件的文本。 – Rohan

我假设地址完全没有改变。

使用ProcessMemoryReader,你可以尝试这样的事情。

ProcessMemoryReader memoryReader = new ProcessMemoryReader(); 
memoryReader.ReadProcess = process; 
memoryReader.OpenProcess(); 

...

public string GetString(int memoryAddress, uint bytes) { 
    int bytesRead; 
    byte[] memoryValue = memoryReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead); 
    Encoding encoding = Encoding.Default; 
    string result = encoding.GetString(memoryValue, 0, (int)bytes); 
    result = result.TrimEnd('\0'); 
    return result; 
}