【问题标题】:.NET - copy data from specific segment:offset.NET - 从特定段复制数据:偏移量
【发布时间】:2011-02-12 19:06:51
【问题描述】:

参考这个主题:Access memory address in c#,我试图了解如何通过知道其十六进制段:偏移量来寻址内存位置并提取数据。另外,我相信大小是可变的。我将不胜感激有关继续此操作的任何建议。

【问题讨论】:

  • 你说的是读取属于另一个应用程序的内存吗?

标签: c# .net memory interop


【解决方案1】:

好吧,如果你想麻烦...

        int bufSize = 12;

        IntPtr ptr = (IntPtr) (0xffff *16U + 5);                  

        byte[] data = new byte[bufSize];
        Marshal.Copy(ptr, data, 0, bufSize);

【讨论】:

  • Henk,谢谢,但它不起作用。该数组包含零。实际上有一个 16 位 DEBUG.EXE 工具可以很好地完成工作(转储此内存地址的内容),但我正在运行 64 位机器并且不支持 16 位应用程序。这就是为什么我想手动完成它的原因。我试过在 32 位机器上运行你的代码,其中 DEBUG 产生正确的结果,但仍然没有成功(相同的零)。
  • 另外,长度为8字节。但结果仍然是空白。
  • @Sphynx:对于 16 位调试器和 64 位应用程序给出不同的结果,我一点也不感到惊讶。需要明确的是,在windows下,每个应用程序都有自己的地址0xffff:5,他们看不到彼此的内存。
  • @Sphynx:16 位工具可能已经很老了——就像在进程可以读取彼此内存的时候一样,如果他们愿意的话。这在今天是不可能的。这是由操作系统控制的。
【解决方案2】:

托管应用程序在具有线性地址空间的平台上运行。没有段,没有偏移。只有地址,你可以通过Marshal.Copy在任何地址读写。

【讨论】:

  • 关于将此类地址转换为线性地址的任何建议?
  • 找到这个:Segment:Offset = Segment x 16 + Offset。现在我需要弄清楚如何检测要复制的字节数。
  • 段:偏移地址不再存在
  • 这是不正确的。 Segment:offset 来自旧的 16 位架构,现在 .Net 中不存在这样的地址。您无法与返回此类地址的应用程序交互。
  • 这是我拥有的静态值 (FFFF:5)。有什么方法可以将其转换为新的架构寻址方案?
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2017-01-13
  • 2012-10-20
相关资源
最近更新 更多