如何获取其他程序内存的地址,然后在我的程序中读取

Posted

技术标签:

【中文标题】如何获取其他程序内存的地址,然后在我的程序中读取【英文标题】:How to obtain address of other program memory and then read it in my program 【发布时间】:2021-01-10 23:47:48 【问题描述】:

我想找到其他程序 (other.exe) 存储某些特定值的地址

然后从我的程序 (C#) 中读取它,但我真的不明白如何实现它

我尝试使用 CheatEngine 找到它,并设法在两个地址下找到该值,例如 0x048907B0

现在我尝试将这个特定地址添加到进程的基地址中,但返回的值只是混乱,甚至没有接近我的值

我在这里做错了什么?

以前我见过一些涉及“xor”的“证明”方法,基本上你必须读取一些具有已知“xor 地址”的“xor”值,然后为了读取其他值,公式是

info.MyValue = BitConverter.ToInt32(buffer, 0) ^ xor;

提前致谢!

我的代码:

var process = Process.GetProcessesByName(processName).FirstOrDefault();

if (process == null)

    throw new Exception($"Process with name: 'processName' is not running");


var mc = new MemoryContext(process);

public class MemoryContext

    const int PROCESS_WM_READ = 0x0010;

    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

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

    private int baseAddress;
    private Process _process;
    private IntPtr handle;

    public MemoryContext(Process process)
    
        _process = process;
        baseAddress = _process.MainModule.BaseAddress.ToInt32();
        handle = OpenProcess(PROCESS_WM_READ, false, _process.Id);
    
    
    public ProcessDetails RefreshData()
    
        var info = new ProcessDetails();

        int bytesRead = 0;
        byte[] buffer = new byte[4];

        // here I'm trying to read that value
        ReadProcessMemory((int)handle, 0x048907B0 + baseAddress, buffer, buffer.Length, ref bytesRead);
        info.MyValue = BitConverter.ToInt32(buffer, 0);
        
        return info;
    

【问题讨论】:

该值不应该被添加到基地址;否则它会起作用吗?至于每次查找地址,如果您遵循 Cheat Engine 的教程,它应该向您展示如何找到指向某些动态分配的数据地址的可靠指针链。然后,您只需在程序中执行指针逻辑即可获取最终地址。 @RandomDavis 我设法在 CE 中找到它,但你所说的“指针逻辑”到底是什么意思? 哦,我删除了+ baseAddress,我得到了价值,谢谢! “指针逻辑”是指从作为指针的静态地址开始的整个业务,然后遵循一些指针链和偏移量以最终到达最终地址。如果这对您来说是全新的,那么一定要完成教程和更多关于指针的研究。这样您就不必每次都运行作弊引擎来获取地址。 【参考方案1】:

我将此作为评论发布,但由于它有效,我将其作为答案发布。

当您在作弊引擎中找到您的数据地址时,它给您的地址已经是正确的。因此,要读取正确的地址,而不是 0x048907B0 + baseAddress,您只需输入 0x048907B0 即可。

【讨论】:

以上是关于如何获取其他程序内存的地址,然后在我的程序中读取的主要内容,如果未能解决你的问题,请参考以下文章

用c语言如何获取内存地址?

请问如何读取系统内存中任意地址的数据,如0x100,用C语言实现。

使用内存文件

是否可以在一个 C 程序中“创建”垃圾内存数据,然后再从另一个 C 程序中读取相同的数据?

如何处理大字符串和有限的内存

有没有办法在我的 C# 应用程序中复制无法读取内存的错误消息?