【问题标题】:Unable to write memory with memcpy, but fine with WriteProcessMemory无法使用 memcpy 写入内存,但可以使用 WriteProcessMemory
【发布时间】:2015-08-13 16:47:27
【问题描述】:

我正在编写一个应用程序来加载自己的DLL,并在目标进程中重写一些代码以实现某些目标。我用Cheat Engine检查了内存块,发现我要重写的内存区域是“执行/只读”。但奇怪的是(至少对我而言)我能够通过外部程序使用 WriteProcessMemory 重写内存块,但不能通过我自己加载到目标进程内存中的 DLL 使用 memcpy。

有没有其他方法可以重写进程内的操作码,还是需要使用WriteProcessMemory来重写?

【问题讨论】:

  • WriteProcessMemory 可能会绕过内存页面访问保护。 memcpy 只是底层的一个普通 for 循环。您不能在您所在的同一进程中调用WriteProcessMemory 吗?
  • 我的蜘蛛侠感觉在这里刺痛......即使你有正当理由这样做(而你不,不管你为什么认为你这样做或什么你的理由是)如果你不知道为什么memcpy 失败了,那么你就没有资格做你想做的事。对不起,直言不讳。
  • @尔上校,没有。现在就是这样。 WriteProcessMemory 修改保护。这样做,你就可以很好地使用 memcpy。 for 循环不相关。
  • @DavidHeffernan 这就是我的意思。 memcpy 是一个用户态函数,因此它会像常规的字节复制 for 循环一样触发段错误,而 WriteProcessMemory 可能会绕过页面保护。

标签: c++ winapi memcpy


【解决方案1】:

要更改可执行内存,您通常需要使用VirtualProtect() 更改要写入的内存页面的访问标志。 WriteProcessMemory() 大概为你设置了这些标志。

【讨论】:

  • 也许,也许不是:"lpBaseAddress [in] 指向要写入数据的指定进程中的基地址的指针。在发生数据传输之前,系统会验证所有指定大小的基地址和内存中的数据可以写访问,如果不可访问,则函数失败.”。我怀疑(但我可能是错的)“验证写入访问”包括更改正在写入的内存的访问标志。但是,由于 WriteProcessMemory() 主要用于调试器,也许它确实如此。
  • @Remy WPM 确实修改了保护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2015-01-01
  • 2019-04-20
  • 2012-05-03
  • 2018-02-22
相关资源
最近更新 更多