所有结构上的奇怪内存位移

Weird memory displacement on all structures

本文关键字:内存 结构上      更新时间:2023-10-16

我已经为此工作了几个月,我和我的团队都无法解决这个问题,我感到非常生气:/

情况是这样的 - 我正在管理另一个程序的内存,特别是读取结构。当读取简单的东西(如整数)时,它可以正常工作。读取结构时,我需要将读取位置移回 4 个字节,否则我最终会在错误的位置读取并且存储的值不正确。

下面是一个示例:

ReadProcessMemory( hProcess, lpBaseAddress, &xBuffer, sizeof( xBuffer ), nullptr );

只要 xBuffer 不是类或结构,就可以正常工作。假设 xBuffer 被声明为vector_t的对象 - 这是我读取工作的唯一方式:

class vector_t
{
public:
float x, y, z;
};
vector_t xBuffer;
ReadProcessMemory( hProcess, lpBaseAddress - 0x4, &xBuffer, sizeof( xBuffer ), nullptr );

我知道这段代码不是 MCRE/可重现的,因为我尝试复制我的代码片段并且它工作正常,但这就是正在发生的一切,我不知道还有什么可能导致这种情况。

获取类的大小,它返回所有成员的大小 +0x4,而它应该是 +0x1,对吧?也许这有帮助?

编辑:经过进一步调试,我发现问题出在原子上。为什么?

#include <Windows>
#include <atomic>
class vector_t
{
public:
float x, y, z;
};
/* ... */
std::atomic< DWORD > dwBaseAddress { };
/* ... */
std::atomic< vector_t > vecBuffer { };
// unless we subtract 4 bytes from lpBaseAddress._My_val, we will not read properly
ReadProcessMemory( hProcess, LPVOID( lpBaseAddress._My_val ), &vecBuffer, sizeof( vector_t ), nullptr );

当我制作vecBuffer的副本(不是原子的)时,它可以正常工作。我该怎么做才能确保这种情况不会发生?

复制原子变量,然后将其复制到工作上。

不过,我很想知道它背后的原因,所以我把这个问题留给大家,以防有人知道。我想只有 WinAPI 函数的开发人员ReadProcessMemory知道,因为我们实际上看不到代码。

无论什么:/