【问题标题】:How do I dedicate/allocate a custom memory location so that I can edit that location in c++如何专用/分配自定义内存位置,以便我可以在 C++ 中编辑该位置
【发布时间】:2017-04-29 08:12:58
【问题描述】:

所以我正在尝试编辑内存中包含一堆数据的位置(使用我放入该位置的数据创建一个线程)。但是为了让程序运行,它需要被放置在那个特定的位置。

for (int i = 0; i < dumpSize; i++) *(char*)(0x91F40000 + i) = dumpData[i];

如您所见,0x91F40000 是我想要数据所在的位置,但由于该内存位置不可写,因此它实际上不会更改该位置的内存。 我要怎么做才能编辑这个区域?

【问题讨论】:

  • 您在为哪台计算机(操作系统、编译器、架构)编码?
  • 您需要更多地了解您的实际计算机和操作系统

标签: c++ memory allocation


【解决方案1】:

您可能想要使用placement new 运算符(另请参阅this)。重要的是dumpData 的类型。

但是,您需要确保地址(在0x91F40000 之后)是您的virtual address space 的一部分。如何确定这一点可能是operating system 特定的。由于ASLR,该地址可能会有所不同。

我强烈怀疑您的代码有误。很多时候,sizeof(int) 是 4(字节)。那你想要

for (int i = 0; i < dumpSize; i++)
   *(int*)(0x91F40000 + sizeof(int)*i) = dumpData[i];

我们不知道dumpData 的类型是什么。或者你可以编码

for (int i = 0; i < dumpSize; i++)
   ((int*)0x91F40000)[i] = dumpData[i];

如果您的问题是关于不可写的虚拟内存位置,您可以通过操作特定的system calls 更改虚拟地址空间(或保护)来更改它;在 Linux 或 POSIX 上为 mmap(2)mprotect(2)

PS。您确定对地址空间、操作系统等有足够的了解吗?你的问题看起来很可疑或有些XY problem

在 XBOX 电脑上(你在 cmets 中提到过,但它应该进入问题),你需要更多地了解Xbox One system softwareXBOX 360 system software。我不知道细节。也许考虑安装一些Free60

您应该阅读Operating Systems : Three Easy Pieces,以便至少能够更好地提出此类问题。

【讨论】:

  • dumpData 中的每个元素都是一个字节。因为我在xbox 360上,我可以从其他程序修改内存,但是因为那个内存是“分配的”,我不能使用它
  • Xbox 360 上有一些system software。你看起来很困惑。
  • 我是说有没有办法让位置“可写”?
  • @user3405539 ​​假设您拥有开发者许可证,您可以在官方开发者论坛或邮件列表上发帖。虽然这是个坏主意。 Microsoft 不会允许/希望您这样做。
  • 基本上你靠自己。您可能需要向合适的自制软件开发人员寻求帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2012-03-11
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多