【问题标题】:Get address that is pointed to from another address获取从另一个地址指向的地址
【发布时间】:2013-01-27 18:33:56
【问题描述】:

为了练习,我试图获取某个内存地址指向的地址。我有一个工具,它显示了我必须得到的结果。在我的情况下是:

"clientApp.exe"+0x11F9B08 -> 0E4C5F90

所以我假设这基本上意味着:("The base address of the .exe" + 0x11F9B08) 并且指向地址0x0E4C5F90

我已经有了 clientApp.exe 的基地址。我为此使用了EnumProcessModulesGetModuleFileNameEx

小sn-p

if ( GetModuleFileNameEx( hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
{
    if(gameName.compare(szModName))
    {
        dwClientBase = (DWORD)hMods[i]; //base address
        break;
    }
}

然后稍后我会尝试获取指向的地址。但以下给了我一个完全不同的结果:

DWORD result = (DWORD)(dwClientBase + 0x11F9B08);

这给了我:23042824。我正在寻找:0x0E4C5F90。我想我已经接近了,但不确定接下来我可以尝试什么。

有人知道我应该怎么做才能获得与 工具 给我的结果相同的结果吗?

【问题讨论】:

  • 这取决于 - 您在寻找虚拟地址还是物理地址?
  • 0x11F9B08 也可能意味着进程的虚拟地址空间中的绝对地址。你试过吗?
  • @RageD 实际上我不太确定,我怎么知道?我知道"clientApp.exe"+0x11F9B08 总是一样的。但它指向的地址总是变化的。所以我猜是虚拟地址空间?
  • @ybungalobill 我对此还不是很熟悉,所以我不确定我是否知道“你试过了吗?”是什么意思。能详细点吗?

标签: c++ c pointers memory-address


【解决方案1】:

dwClientBase 是什么类型?如果它是DWORD,那么您应该转换为BYTE *,然后进行算术运算,确保取消引用指针以返回该地址指向的值:

DWORD result = *(DWORD *)( (BYTE *)dwClientBase + 0x11F9B08);

当向指针添加数字时,编译器将添加等于数字乘以指针类型大小的字节数。这就是我们首先转换为BYTE * 的原因,所以我们添加的正是0x11F9B08 字节。

【讨论】:

    【解决方案2】:

    您不会取消引用指针。尝试任一

    DWORD result = *(DWORD*)(dwClientBase + 0x11F9B08);
    

    DWORD result = *(DWORD*)(0x11F9B08);
    

    转换为DWORD* 表示编译器将数字视为指针,然后取消引用* 它会导致读取实际数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2015-01-26
      • 2019-09-10
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多