【发布时间】:2019-09-11 20:29:46
【问题描述】:
好的,最近我一直在使用 RPM(ReadProccesMemory)。但是在这样做的同时,我遇到了无法按照我想要的方式读取字符串的问题。
这是我听到/知道的: 我知道,在读取 std::string 时,我得到的是字符串 OBJECT 的内存地址,而不是包含实际文本的地址。我也知道“小字符串优化”,以及它在理论上的作用。
我希望能够在不更改虚拟程序代码的情况下读取 varString(DefaultString) 的内容(如果可能的话)。
我正在阅读的虚拟程序:
int main() {
// Variables & Pointers
int varInt = 123456;
string varString = "DefaultString";
cout << sizeof(varString);
char arrChar[128] = { "Long char array right there ->" };
int* ptr2int = &varInt;
int** ptr2ptr = &ptr2int;
int*** ptr2ptr2 = &ptr2ptr;
// Printing them out
while (true){
cout << "Process ID: " << GetCurrentProcessId() << endl << endl;
cout << "varInt (0x" << &varInt << ") = " << varInt << endl;
cout << "varString (" << reinterpret_cast<const void*>(varString.data()) << ") = " << varString << endl;
cout << "arrChar (0x" << &arrChar << ") = " << arrChar << endl << endl;
cout << "ptr2int (0x" << &ptr2int << ") = " << &varInt << endl;
cout << "ptr2ptr (0x" << &ptr2ptr << ") = " << &ptr2int << endl;
cout << "ptr2ptr2 (0x" << &ptr2ptr2 << ") = " << &ptr2ptr << endl << endl;
break;
}
cin.get();
return 0;
}
我目前在做什么(不会按预期工作):
void reading_string(HANDLE handle_procces) {
uintptr_t memoryAdress_2 = 0x0;
cout << "Please write down the memory adress of \"varString\" > " << flush;
cin >> hex >> memoryAdress_2;
string read_string_object;
ReadProcessMemory(handle_procces, (LPCVOID)memoryAdress_2, &read_string_object, sizeof(string), NULL);
cout << "The value of this memory adress is: " << read_string_object << endl;
}
【问题讨论】:
-
std::string中的某处应该有一个指向实际数据的指针。但是,std::string的内存布局没有标准化,因此指针可以在任何地方。该位置可能会因进程而异,具体取决于使用的std::string。 -
"在 std::string 的某个地方应该有一个指向实际数据的指针。"我如何找到那个指针?通过手动搜索还是?
-
你需要指针还是指针指向什么?有关返回指向数据的指针的函数,请参见 std::string::data()。
-
@Jowen 通常你不使用它。您使用类接口并使用适当的成员函数(例如
std::string::data())。但由于您正在访问另一个进程的数据,因此没有一种简单的内置方法可以做到这一点。