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

C# 我可以从另一个程序的内存中获取字符串吗?,c#,string,memory,text,ram,C#,String,Memory,Text,Ram,提前谢谢你的帮助 我已经知道如何找到数值的内存地址并在ram中读写它们。(使用C#)。 对于任何程序中的任何文本,我想做的都是一样的。但我不知道这是否可能 例如,我可以访问打开的notepad.exe内存来提取写入其中的字符串吗? 现在我这样做,它会返回垃圾: Process process = Process.GetProcessesByName("notepad").FirstOrDefault(); String stringaddress = "00401110"; int addres

提前谢谢你的帮助

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

例如,我可以访问打开的notepad.exe内存来提取写入其中的字符串吗? 现在我这样做,它会返回垃圾:

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);

我最终想要的是能够在程序中找到特定的窗口,并复制其中的所有文本。

我假设地址根本没有改变

使用,你可以试试这样的东西

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


每次启动记事本(或其他应用程序)时,文本框字符串的内存地址都会不同。除非每次应用程序运行时都能获得正确的内存地址,否则这似乎是不可能的。如果要从特定窗口(窗体)获取文本,可以使用WinAPI:EnumWindows查找窗口,然后使用GetWindowText获取所需文本。@DmitryBychenko,我想他想从记事本中的textbox控件获取文本。GetWindowText无法在另一个应用程序中检索控件的文本。
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;
}