【问题标题】:"ReadProcessMemory" how to get std::string?“ReadProcessMemory”如何获取 std::string?
【发布时间】:2021-09-18 17:14:49
【问题描述】:

程序_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”的引用输出到控制台。

程序_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 对象地址中实际存在的内容,而不是像本机int 这样的东西,将非常有启发性。爆破像std::string 这样包含内部指针、引用等的非平凡对象的内存背景,在任何情况下都不会结束,无论是使用@987654329 之类的东西@、freadmemcpy 或任何其他相关内容。

标签: c++ process console


【解决方案1】:

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

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

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

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

简而言之,你所做的一切都是徒劳的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多