【问题标题】:C# Read pointer address valueC#读取指针地址值
【发布时间】:2015-08-09 03:57:56
【问题描述】:

(对不起,我的英语不好)

C#中如何从指针中读取值地址?

示例: 我知道我的指针,但值在应用程序启动时发生了变化。

1) 开始

(Pointer) 0x0018F36C   =  ( Value) 0x0342AD68

2) 重启

(Pointer) 0x0018F36C  = ( Value Changed ) 0x0342AE20

其实我有一个基地址 0x0018F36C 但需要从指针中读取值并长保存

示例:

long addr_base = 0x0018F36C;
long address;  //Obviously I do not know the Address

现在我需要从 addr_base 读取长值并将值(长)放入地址中

例子

addr_base = memory.ReadAddress(addr_base)

有人知道如何读取存储在名为 addr_base 的变量中的地址吗?

【问题讨论】:

  • 我很怀疑你为什么这样做......你首先如何获得指针的值?它是作为非托管函数的返回值出现的吗?可能有更好的方法来做到这一点。 (我预测你会尝试使用Marshal.ReadIntPtr(),但它不会达到你的预期......)
  • 我从反汇编程序获取指针。我这样做是为了为应用程序创建一个插件。
  • 所以你想从不同的进程中读取内存?您从中获得指针的应用程序是否在与 C# 代码不同的进程中运行? (我想它一定是......)如果是这样,那么这将行不通。此外,指针可能会在运行之间发生变化。
  • 是的。指针的值在运行时改变。但是指针处的地址是相同的。不要改变。只需要从指针中获取新的地址值
  • 但是您将无法使用Marshal.ReadIntPtr() 从另一个进程中读取内存。

标签: c# pointers memory memory-management memory-address


【解决方案1】:

如果您有0x0018F36C 这样的地址,您可以:

IntPtr ptr = (IntPtr)0x0018F36C;
long longValue = Marshal.ReadInt64(ptr);

如果你需要从一个地址读取另一个地址,还有另一个Marshal方法:

IntPtr ptr = (IntPtr)0x0018F36C;
IntPtr ptr2 = Marshal.ReadIntPtr(ptr);

【讨论】:

  • 您好 xanatos 坦克寻求帮助。第一个代码有效,但第二个示例我有错误类型:尝试读取或写入受保护的内存。这通常表明内存的其他部分已损坏。
  • @JoeMartiniello,这个错误令人困惑,但这只是意味着你试图做一些无效的事情,比如内存中的一个地址从一开始就不是一个有效的地址(你从一个固定的值开始,这是永远不对的)。从像 C# 这样的托管应用程序中工作和操作指针需要对地址的编组和固定有很好的理解,并且知道volatile 可以做什么,才能做正确的事。由于您来自汇编程序,因此在您的情况下,从 C 和 C++(如果您愿意,甚至是混合模式汇编)开始,并编写一个包装器可能会更容易。感觉会更轻松。
猜你喜欢
  • 1970-01-01
  • 2015-07-09
  • 2016-12-30
  • 2020-07-06
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多