按地址获取变量名称

时间:2014-09-15 18:33:31

标签: c++ winapi

我有一个显示字节数组的对话框,用于十六进制编辑它们。可以切换显示的存储区域。但是虽然有些区域是内部数组,但有一些区域是结构,我正在显示它们中的某些元素(连续)。

我想添加一种符号名称功能,选择地址会为您提供名称。对于实际的数组,它由用户完成,用户可以随意调用它们,并将其保存在文件中。但是那些内部结构不应该有用户定义的名称,而是我想给它们硬编码的名称。

问题:是否可以通过了解他们的地址来获取他们的名字?就像,结构Y的字节X指的是变量Z,当选择单元格X时,将其名称显示为“Z”。或者我还必须创建名单并定期使用它们?

编辑:

简化问题:是否存在offsetof()的向后模拟?通常你传递一个指针和一个变量,它给你该变量的偏移量。所以我需要传递一个指针和一个偏移量,然后获取变量(结构成员)名称(然后用#对其进行字符串化)。

3 个答案:

答案 0 :(得分:1)

据我所知,最好的方法就是在地址区域和名称之间使用地图。

代码应该是这样的:

class address_region{
    intptr_t start;
    intptr_t end;

    template<class T>
    address_region(const T& t){
       start = (intptr_t)(&t);
       end   = start + sizeof(t); 
    }

    address_region(intptr_t start_adr=0, intptr_t end_adr=0){
         start = start_adr;
         end   = end_adr;
    }

    bool operator<(const address_region& adr){
        if( adr.start >  start ) return true;
        else return false;
    }
};

map< address_region , std::string > addresses_map;

assume you have this struct;

struct A
{
  int X;
  int Y;
};

A a;

to store addresses it should be something like :
addresses_map[ address_region(a) ] = "struct A";
addresses_map[ addresses_map(a.X) ] = "struct A : int X";
addresses_map[ addresses_map(a.X) ] = "struct A : int Y";

检索结果:

  intptr_t adrs = ....;

  std::string symbole_name = addresses_map[ address_region(adrs) ];

答案 1 :(得分:0)

您的编译器应该能够打印map文件,该文件是符号及其地址(或偏移量)的参考。

看起来您需要在初始化时创建std::map。地图上会有符号的地址和名称,如下所示:

  std::map<uint64_t address, std::string> symbol_dictionary;

您必须在运行时执行此操作,因为某些操作系统会在每次执行时将代码放在不同的地址,具体取决于其他应用程序的内存使用情况(以及内存布局)。

我认为你需要改变你的设计,或重新考虑要求 例如,您可以按名称而不是按地址更改变量吗? 您将在窗口中显示变量名称,并允许用户更改该值。您的程序获取此值并将变量设置为此值。无需知道地址。

出于安全考虑,您不希望用户按地址更改内存。他们可能会更改程序中的错误地址(例如函数中的代码),然后打电话给您,因为您的应用程序不再工作了。

很抱歉,但我有更好的事情要做,而不是支持那些输入地址不正确的人,然后想知道为什么程序不再起作用。

答案 2 :(得分:0)

结束制作符号名称结构的向量(数组指针,开始,大小,名称)并手动添加一串名称。