You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Memory.dll在C#中获取两个内存地址间的字节数组

解决方法

先确保两个内存地址有效,再计算需要读取的字节长度,接着用Memory.dll的ReadBytes方法获取字节数组,最后将数据保存到文本文件。以下是补充完整的代码:

static private readonly Mem mem = new MemoryX();
static private bool IsProcOpen;
static private int ProcessID;

// await操作需在异步方法中执行,所以方法要标记为async
static async Task Main(string[] args)
{
    ProcessID = mem.GetProcIdFromName("Calimba");
    
    if (ProcessID != 0)
    {
        IsProcOpen = mem.OpenProcess(ProcessID);
        
        Console.WriteLine("Process ID : " + ProcessID);
        IEnumerable<long> AoBScanResults = await mem.AoBScan("4F 4D 44 55 4E 47 45 4F 4E 40 ?? ?? ??", true, true, true);
        IEnumerable<long> AoBScanResults2 = await mem.AoBScan("24 ?? 90 ?? 24 48 88 ?? ??", true, true, true);

        long SingleAoBScanResult = AoBScanResults.FirstOrDefault();
        long SingleAoBScanResult2 = AoBScanResults2.FirstOrDefault();

        // 检查地址是否有效
        if (SingleAoBScanResult == 0 || SingleAoBScanResult2 == 0)
        {
            Console.WriteLine("未找到目标内存地址");
            return;
        }

        Console.WriteLine("起始地址: " + SingleAoBScanResult.ToString("X"));
        Console.WriteLine("结束地址: " + SingleAoBScanResult2.ToString("X"));

        // 确定地址顺序,计算读取长度
        long startAddress = Math.Min(SingleAoBScanResult, SingleAoBScanResult2);
        long endAddress = Math.Max(SingleAoBScanResult, SingleAoBScanResult2);
        int byteCount = (int)(endAddress - startAddress);

        // 读取字节数组
        byte[] buffer = mem.ReadBytes(startAddress, byteCount);

        if (buffer == null || buffer.Length == 0)
        {
            Console.WriteLine("读取内存失败");
            return;
        }

        // 方式1:保存为二进制文件(保留原始字节数据)
        File.WriteAllBytes("MemoryData.bin", buffer);

        // 方式2:转成十六进制字符串保存到文本文件(方便查看)
        string hexString = BitConverter.ToString(buffer).Replace("-", " ");
        File.WriteAllText("MemoryData.txt", hexString);

        Console.WriteLine("内存数据已保存");
    }
    else
    {
        Console.WriteLine("未找到目标进程");
    }
}

关键说明:

  • 地址顺序处理:必须先判断两个地址的大小,避免因顺序颠倒导致读取长度错误。
  • ReadBytes方法:Memory.dll的ReadBytes方法接收起始地址和读取长度,返回对应字节数组。
  • 文件保存选项:
    • 二进制文件(.bin)适合保留原始字节数据,方便后续直接处理。
    • 十六进制文本文件(.txt)便于人工查看内存内容。
  • 异常检查:添加地址有效性和读取结果检查,避免空引用或无效操作。

内容的提问来源于stack exchange,提问作者Jay Computers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:40:13