【问题标题】:Readprocessmemory into string将进程内存读入字符串
【发布时间】:2012-04-29 20:37:59
【问题描述】:

我知道关于进程的一切以及我想读取的地址,但我不知道如何使用 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# readprocessmemory


【解决方案1】:

这是一个使用 C# 从内存中读取 char 数组的示例。在这种情况下,它是来自 Assault Cube 的本地玩家的姓名字符串。

[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.dll 导出的 ReadProcessMemory

我们使用 FindDMAAddy 来获取 name 变量的地址。 char 数组是 16 字节的固定大小。

我们使用 ReadProcessMemory 使用源变量和目标变量,大小为 16,最后一个参数我们只使用“out _”,因为我们不关心 bytesRead 参数。

然后我们需要将该 char 数组转换为具有适当编码的字符串类型,我们使用 Encoding.Default.GetString()。

然后将该行写入控制台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2012-08-24
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多