【问题标题】:Is it possible to get the address of the first string in memory of a process in c++? [closed]是否可以在c ++中获取进程内存中第一个字符串的地址? [关闭]
【发布时间】:2021-01-15 10:02:12
【问题描述】:

是否可以在c++中获取进程内存中第一个字符串的地址? 就像我不必遍历整个进程的内存来查找字符串,但我可以从第一个字符串的地址开始迭代?我说的是查找任何类型的变量中的第一个,而不仅仅是字符串,尽管我以它为例。 让我在代码中举一个例子:

for (int i = 1; i < 10000000; i++)
{
    std::string buf;
    ReadProcessMemory(hproc, (LPCVOID)i, &buf, sizeof(std::string), NULL);
    std::cout << buf << std::endl;
}

这应该是必要的吗?我不能直接从第一个字符串的地址开始,还是以其他方式更快?

【问题讨论】:

  • 即使你得到地址,以这种方式复制std::string 也是未定义的行为。在这种情况下,特别是std::string 的析构函数可能是delete 内存,并且由于此循环每次迭代都会破坏字符串,因此它可能会在delete 随机地址,直到它崩溃。
  • 你想做什么?你能澄清一下吗?
  • 我正在尝试打印进程内存中的所有字符串。
  • 你说的是进程的数据内存还是进程的可执行区域?
  • 如果进程在运行时被换出到硬盘会发生什么?

标签: c++ windows loops memory system


【解决方案1】:

Std 字符串使用与使用 operator new 分配的所有其他对象相同的堆分配其内部存储。无法区分各种内容。

也就是说,从纯粹的智力练习来看,可以使用自定义分配器声明自己的 basic_string 实现,您可以在其中观察内存分配和释放。

std::basic 字符串的完整模板定义为:

template<
    class CharT,
    class Traits = std::char_traits<CharT>,
    class Allocator = std::allocator<CharT>
> class basic_string;

而 std::string 实际上是 std::basic_string&lt;char&gt;,依赖于 Traits 和 Allocator 的默认值。

您可以在哪里提供自己的分配器实现,例如,它可能会记录您的程序执行的分配和解除分配,或者将分配顺序存储在某个连续的存储中。您只会跟踪您明确声明的字符串。

请注意,在使用不同分配器的标准容器之间禁用移动语义,并且在许多情况下,调用将字符串作为参数接受或返回的 std 库方法将调用自定义字符串和标准分配版本之间的副本,因此视图可能仍然不是真正的。

据我了解,std::string 的当前实现只是将字符内容存储在分配的存储中,但可以在分配的空间中存储其他信息以帮助管理字符串增长。

请注意,字符串的容量和当前长度存储在也指向此缓冲区的 std::string 对象中,因此很难推断出分配缓冲区的内容有多大用处。如果它被用作合法字符串,那么 c++ 标准说它是零终止的;所以这表明它可以被视为 C char* 字符串。

许多实现通过将它们内联存储在 std::string 对象中而不进行动态分配来优化非常小的字符串。他们依靠一些任意规则来了解当前的布局(nullptr 或动态或内联),例如“知道”容量,一个 64 位整数,永远不会大于 56 位值,所以“顶部字节”总是动态字符串为零;但实际上是内联字符串的 1byte size(),具有恒定的最大大小:剩余的字节可以用于内联内容,可能最多 23 个字符!

但其他方案也是可能的。例如,旧的 microsoft 字符串(不是 std::string)用于在开始时将所有长度和容量信息存储在指向对象中,而字符串对象是指向缓冲区下一个文本部分的简单指针。这在 printf() 中使用非常方便!其他 c++11 之前的 std::string 系统试图共享字符串和存储的引用计数,但 c++11 的“生命周期”规则使得这几乎站不住脚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2011-12-21
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2017-06-25
    • 2019-08-09
    相关资源
    最近更新 更多