如何使用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
相关产品推荐
相关产品推荐

