Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在内存中定位对象(结构)-如何定位?_C++_Memory_Struct - Fatal编程技术网

C++ 在内存中定位对象(结构)-如何定位?

C++ 在内存中定位对象(结构)-如何定位?,c++,memory,struct,C++,Memory,Struct,您如何在内存中定位对象,假设您有一个定义为: struct POINT { int x; int y; }; 如何扫描应用程序的内存区域以查找此结构的实例,以便读取它们 谢谢,R.如果不向结构中添加类型信息,您将无法执行此操作。在内存中,这样的结构只不过是2个整数,因此您无法比识别任何其他对象更好地识别它们。如果不向结构添加类型信息,则无法识别它们。在内存中,这样的结构只不过是2个整数,所以你不能像识别任何其他对象那样更好地识别它们。你不能。您必须知道布局,才能知道内存的哪个部分必

您如何在内存中定位对象,假设您有一个定义为:

struct POINT {
   int x;
   int y;
};
如何扫描应用程序的内存区域以查找此结构的实例,以便读取它们


谢谢,R.

如果不向结构中添加类型信息,您将无法执行此操作。在内存中,这样的结构只不过是2个整数,因此您无法比识别任何其他对象更好地识别它们。

如果不向结构添加类型信息,则无法识别它们。在内存中,这样的结构只不过是2个整数,所以你不能像识别任何其他对象那样更好地识别它们。

你不能。您必须知道布局,才能知道内存的哪个部分必须表示变量。这是一种协议,这就是为什么我们使用基于文本的语言而不是原始值。

你不能。您必须知道布局,才能知道内存的哪个部分必须表示变量。这是一种协议,这就是为什么我们使用基于文本的语言而不是原始值。

你没有-你如何区分两个任意整数和随机噪声


但给定一个p点;在您的源代码中,您可以使用运算符的地址获取其地址。。。点*pp=&p

你不知道-你如何区分两个任意整数和随机噪声


但给定一个p点;在您的源代码中,您可以使用运算符的地址获取其地址。。。点*pp=&p

无法识别该结构。您需要将结构放在堆栈或堆上可以找到的地方

有时,数据结构会标记识别信息,以帮助调试或内存管理。作为数据组织的一种手段,它是最糟糕的方法之一


您可能需要对内存管理进行大量的常规阅读。

无法识别该结构。您需要将结构放在堆栈或堆上可以找到的地方

有时,数据结构会标记识别信息,以帮助调试或内存管理。作为数据组织的一种手段,它是最糟糕的方法之一


您可能需要阅读大量有关内存管理的一般书籍。

没有标准的方法可以做到这一点。平台可能会指定一些API,允许您访问堆栈和免费存储。此外,即使您这样做了,如果没有任何附加信息,您如何确保您正在读取一个点对象而不是几个整数?编译器/链接器可以读取这个,因为它处理的是虚拟地址,并且比您拥有更多的信息和控制

没有标准的方法可以做到这一点。平台可能会指定一些API,允许您访问堆栈和免费存储。此外,即使您这样做了,如果没有任何附加信息,您如何确保您正在读取一个点对象而不是几个整数?编译器/链接器可以读取这个,因为它处理的是虚拟地址,并且比您拥有更多的信息和控制

你不能。结构不存储任何类型信息,除非它们具有虚拟成员函数,因此您无法将它们与任何其他sizeofPOINT字节块区分开来


为什么不将点存储在向量或其他东西中?

你不能。结构不存储任何类型信息,除非它们具有虚拟成员函数,因此您无法将它们与任何其他sizeofPOINT字节块区分开来


为什么不将点存储在向量或其他东西中?

你不能。在一些也支持用户定义类型的标记对象的标记体系结构上,可能会出现类似的情况。但是,在传统的体系结构中,仅仅通过查看原始内存内容来确定存储在内存中的内容是绝对不可能的

通过在类型中引入一个唯一的签名,您可以更接近于实现所需的功能,如

struct POINT { 
   char signature[8];
   int x; 
   int y; 
}; 

然后在每个点类型的对象中小心地将其设置为某个固定且唯一的模式,然后在内存中查找该模式。如果它是您的应用程序,那么您可以非常确定模式的每个实例都是您的点对象。但是,一般来说,当然,永远也不能保证你找到的图案属于你的对象,而不是纯粹偶然地出现在那里

你不能。在一些也支持用户定义类型的标记对象的标记体系结构上,可能会出现类似的情况。但是,在传统的体系结构中,仅仅通过查看原始内存内容来确定存储在内存中的内容是绝对不可能的

通过在类型中引入一个唯一的签名,您可以更接近于实现所需的功能,如

struct POINT { 
   char signature[8];
   int x; 
   int y; 
}; 
然后在每个点类型的对象中小心地将其设置为某个固定且唯一的模式,然后在内存中查找该模式。如果
这是您的应用程序,您可以非常确定模式的每个实例都是您的点对象。但是,一般来说,当然,永远也不能保证你找到的图案属于你的对象,而不是纯粹偶然地出现在那里

简短的回答:你不能。任何适当对齐的8字节序列都可能代表一个点。事实上,整数数组与点数组是无法区分的。在某些情况下,您可以利用编译器实现的知识来做得更好。例如,如果结构具有虚拟函数,则可以查找正确的vtable指针,但也可能存在误报


如果您想跟踪对象,您需要在其构造函数中注册它们,在其析构函数中注销它们,并支付性能损失,或者给它们自己的分配器。

简单回答:您不能。任何适当对齐的8字节序列都可能代表一个点。事实上,整数数组与点数组是无法区分的。在某些情况下,您可以利用编译器实现的知识来做得更好。例如,如果结构具有虚拟函数,则可以查找正确的vtable指针,但也可能存在误报


如果您想跟踪对象,您需要在其构造函数中注册它们,在其析构函数中注销它们,并支付性能损失,或者给它们自己的分配器。

其他人所说的都是真的。在内存中,结构只有几个字节,没有什么特别的区别

但是,如果您想进行一些黑客攻击,您可以查找C库的内部结构,找出内存在堆上的存储位置以及它是如何显示的。例如,显示如何在一个特定系统中分配内容

有了这些知识,您就可以扫描堆,找到大小为sizeofPOINT的已分配块,这将大大缩小搜索范围。如果查看该表,您会注意到正在记录malloc调用的文件名和行号-如果您知道在源代码中分配点的位置,也可以将其用作参考


但是,如果您的结构是在堆栈上分配的,那么您就不走运了

其他人说的都是真的。在内存中,结构只有几个字节,没有什么特别的区别

但是,如果您想进行一些黑客攻击,您可以查找C库的内部结构,找出内存在堆上的存储位置以及它是如何显示的。例如,显示如何在一个特定系统中分配内容

有了这些知识,您就可以扫描堆,找到大小为sizeofPOINT的已分配块,这将大大缩小搜索范围。如果查看该表,您会注意到正在记录malloc调用的文件名和行号-如果您知道在源代码中分配点的位置,也可以将其用作参考



但是,如果您的结构是在堆栈上分配的,那么您就不走运了

…即使你添加了类型信息,也可能会很困难。你如何知道哪些位代表类型信息?你必须创建一个相当独特的字节序列来识别它?即使你添加了类型信息,也可能会很困难。你如何知道哪些位代表类型信息?你会的必须创建一个相当独特的字节序列才能识别它?你到底想通过它实现什么?这些实例最初是如何在内存中丢失的?你做新的点;新观点;然后试着找到它们?你到底想通过这个实现什么?这些实例最初是如何在内存中丢失的?你做新的点;新观点;然后你会发现它们有一个C++编译器,支持任何类型的标签?包括一个校验和签名,可以防止假阳性-其他数据可以包含一个与签名相同的字节序列。@ Roger Pate:在现实生活中?不,我不知道。在开发中,或者你说的是什么意思?”Roger Pate:不,我的意思是,这样的平台可以存在C++编译器。目前是否有可用的-我不知道。我自己还没有见过一个,我真的不认为它是相关的,你是否知道一个架构有一个C++编译器,支持任何一种标记?包括一个校验和签名可以帮助防止假阳性-有机会其他数据可以包含一个字节序列,这将是和签名一样。@Roger Pate:在现实生活中?不,我不知道。在开发中,或者你说的是什么意思?”Roger Pate:不,我是指这样一个PLA的C++编译器。 tform可以存在。目前是否有可用的-我不知道。我自己没有见过,我真的不认为它是否存在。