将进程内存读入字符串
本文关键字:字符串 内存 进程 | 更新日期: 2023-09-27 18:32:33
我知道关于进程的一切以及我想读取的地址,但我不知道如何使用Readprocessmemory函数。我需要添加一些用途或其他东西吗?我在 C++ 中做到了这一点,但我如何在 C# 中做到这一点?
char* ReadMemoryText(DWORD address,int size)
{
char ret[size];
DWORD processId;
HWND hwnd = FindWindow("WindowX",NULL);
if(tibia!=NULL)
{
GetWindowThreadProcessId(hwnd,&processId);
HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, processId);
if(!phandle)
{
cout<<GetLastError()<<endl;
cout <<"Could not get handle!'n";
cin.get();
}
ReadProcessMemory(phandle, (LPVOID)address, &ret,size,0);
char * rt = ret;
for(int i=0;i<size && ret[i]!=0;++i)
cout << ret[i];
return rt;
}
return NULL;
}
下面是使用从内存中读取字符数组的 C# 的示例。 在本例中,它是突击立方体中本地玩家的名称字符串。
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory(
IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, Int32 nSize, out IntPtr lpNumberOfBytesRead);
var nameAddr = ghapi.FindDMAAddy(hProc, (IntPtr)(modBase2 + 0x10f4f4), new int[] { 0x225 });
byte[] name = new byte[16];
ghapi.ReadProcessMemory(hProc, nameAddr, name, 16, out _);
Console.WriteLine(Encoding.Default.GetString(name));
我们使用pinvoke来访问从kernel32导出的ReadProcessMemory.dll
我们使用 FindDMAAddy 来获取名称变量的地址。 char 数组的固定大小为 16 个字节。
我们使用源变量和目标变量(大小为 16)和最后一个参数来使用 ReadProcessMemory,我们只使用"out _",因为我们不关心 bytesRead 参数。
然后我们需要将该 char 数组转换为具有正确编码的字符串类型,我们使用 Encoding.Default.GetString()。
然后将该行写入控制台。