"ReadProcessMemory"如何得到std::string?

"ReadProcessMemory" how to get std::string?

Programm_A

int main()
{
    std::cout << "Process ID = " << GetCurrentProcessId() << "\n"; // Id my process (i get something like '37567')
    std::string My_String = "JoJo"; // My string
    std::cout << &My_String << std::endl; //here i get something like '0x0037ab7'
    system("pause");
}

这个程序只是将字符串“JoJo”的引用输出到控制台。

Programm_B

int main()
{
    int id;
    std::cin >> id;
    DWORD ProcessId = id;
    HANDLE ProcessHandle = OpenProcess(PROCESS_VM_READ, FALSE, ProcessId);
    if (!ProcessHandle) { 
        std::cout << "Process is not found...\n";
        return 0;
    }
    std::string r;
    std::cin >> r; // this is me writing the link that I get in programs_A
    DWORD address = std::strtoul(r.c_str(), NULL, 16);
    std::string JoJo_string = " ";
    ReadProcessMemory(ProcessHandle, (LPVOID)(address), &JoJo_string, sizeof(JoJo_string), 0); //here I want to get the JoJo_string value by reference from programm_A
    std::cout << JoJo_string << std::endl;
}

有趣的是,“int”变量类型一切正常。但是 std::string 不起作用。读取到准确值,但程序立即报错:

[-- programm_B --]

[-- error --]

您无法轻松跨进程边界读取std::string

std::string 的不同标准库实现对其数据成员使用不同的内存布局。您程序中的 std::string 可能使用与您尝试读取的程序不同的实现。

但即使这两个程序使用完全相同的实现,也没有关系,因为 std::string 太复杂了,无法通过单个 ReadProcessMemory() 调用读取。 std::string 为其字符数据使用动态内存,因此其数据成员之一是 char* 指向数据 存储在内存中其他位置的指针 std::string 也可能实现本地短字符串优化缓冲区,因此短字符串值直接存储在 std::string 对象本身以避免动态内存分配,这使情况变得复杂。

因此,您必须知道目标程序正在使用的 std::string 的确切实现,以便破译其数据成员以发现字符数据的实际存储位置,以及在SSO 未激活然后读取 char* 指针,以及指向的字符数(它本身也以特定于实现的方式确定),因此您可以使用另一个 ReadProcessMemory()呼叫.

简而言之,您的尝试是徒劳的。

您肯定可以 从另一个进程中获取 std::string 的内容。毕竟,调试器会那样做!

你需要执行那个字符串的data()length()函数,然后读取那个内存的内容。重要的一点是在您执行此操作时停止执行第二个进程,否则该内存位置可能会在您的调用之间变得无效。