【问题标题】:C/C++ Finding pointersC/C++ 查找指针
【发布时间】:2012-08-29 14:52:55
【问题描述】:

我最近完成了一个基本的内存扫描器,并且像所有曾经这样做过的人一样......我意识到每次程序启动时扫描值是一种痛苦!

找出这些值的基指针会很有用,这样它们就可以硬编码到应用程序中。为了弄清楚如何做到这一点,我使用 Visual c++ 作为我的“目标”创建了这个简短的控制台应用程序。

int main(int argc, char *argv[], char *envp[])
{
    unsigned int * Pointer1;
    Pointer1 = (unsigned int *)malloc(sizeof(unsigned int));
    char s[20];
    while(1)
    {
        std::cout<<"(Pid:"<<GetCurrentProcessId()<<") Please enter a value to be stored in memory (type 'q' to exit): \n";
        std::cin>>s;
        std::cout<<"\n";
        if(s[0] =='q')
        {
            break;
        }
        *Pointer1 = str2int(s);
        std::cout<<"Value:"<<*Pointer1<<" addr:0x"<<Pointer1<<"\n";
    }
    free(Pointer1);

return 0;
}

然后我根据我的内存扫描仪使用这个应用程序来计算指针的地址和指针指向的内存地址。我这样做了几次以整理以下数据。 (使用“|”作为分隔符粘贴到excel中)

pid |P Hex|P Val|PHx to Dec|M Hex|M Val|MHx To Dec
7028|002afcfc|216032|2817276|00034BE0|10|216032
6312|0032fa70|4541408|3340912|00454BE0|20|4541408
1512|0043fb1c|3242304|4455196|00317940|30|3242304
8140|0036f9fc|1997096|3602940|001E7928|30|1997096

但是我无法找到一种可靠的方法来计算指针将是什么内存地址,我可以执行哪些方法/计算来做到这一点?我知道存在更多类似生活的指针链示例,但这似乎是一个很好的起点,然后再让它变得更难。

【问题讨论】:

  • 为什么这个标签是cc++
  • @bitmask:因为代码是两种语言的可怕混合体。
  • 请注意,系统通常会执行地址空间随机化,以确保您不会在不同的运行中获得相同的地址(一种安全措施)。

标签: c++ c memory pointers architecture


【解决方案1】:

内存地址是malloc 返回的任何内容。没有可靠的方法来计算它将返回什么。这完全取决于您的 malloc 库的工作方式、操作系统提供的虚拟地址范围(通过 sbrkmmap 或其他方式)等。

【讨论】:

    【解决方案2】:

    你在问如何预测从malloc返回的地址。

    没关系。

    如果你可以预测malloc会返回什么,malloc就不需要返回任何东西。

    实际上,除了NULL 之外,从malloc 返回的地址无关紧要。对 malloc 的调用意味着您需要一些字节的内存。 malloc 会给你那个。你得到了你需要的东西。

    相反,如果您可以确定从 malloc 中返回的地址,您将永远不需要调用 malloc。您可以只使用您预测的地址。

    简单地说,malloc 的存在是因为预测哪些内存可能可用并非易事。

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      相关资源
      最近更新 更多