"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()
函数,然后读取那个内存的内容。重要的一点是在您执行此操作时停止执行第二个进程,否则该内存位置可能会在您的调用之间变得无效。
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()
函数,然后读取那个内存的内容。重要的一点是在您执行此操作时停止执行第二个进程,否则该内存位置可能会在您的调用之间变得无效。