我试图用WPM编写一个简单的代码来替换一个程序中的字符串,并且我能够让它工作,但只能部分地工作。这是我用来获得结果的代码的一部分。
string strWrite;
cin >> strWrite;
strWrite = strWrite + "\0";
if (WriteProcessMemory(hProcess, (LPVOID) reqdAddr, &strWrite[0], strWrite.size(), NULL) == false)
{
cout << "WriteProcessMemory failed. GetLastError = " << dec << GetLastError() << endl;
system("pause");
return EXIT_FAILURE;
}当我试图将原来的字符串DefaultString替换为blabla时,我得到的结果是blablatString。我尝试过用strWrite.size() + 1代替strWrite.size() + 1,并意识到结果会变成blabla String。我需要帮助替换整个字符串,而不仅仅是它的一部分。
发布于 2018-05-30 05:35:39
如果目标字符串存储为std::string,则此方法将无法工作(情况如下)。它们有一个程序员不应该知道的内部结构(除非您在头文件中搜索),而且您的代码没有考虑到这一点。即使您这样做了,下一个版本的编译器也可能会破坏您的代码。
因此,请考虑将目标字符串存储为一个简单的C字符串(如果可以的话)。覆盖它是简单的,只要你不跑完,你就添加了一个终止的nul。我会显式地这样做--不要假设源字符串是nul终止的,它可能不是。或者使用std::string.c_str()并从其中复制size() + 1字节。
发布于 2020-04-06 05:37:01
string是一个容器,它管理后端的char数组。
现在,在x86上,如果要写入的字符串大小与当前字符串相同或更小,则可以相对轻松地执行,但不建议这样做。
如果char数组小于15个字符,则容器的偏移量0x14是数组的大小;如果char数组大于15个字符,则该数组存储在偏移量0x4处,此偏移量将转换为指向其他位置的动态数组的指针。
因此,您读取数组的大小,然后根据数组的大小将其写入正确的地址。这段代码将这样做,并输出“再见m8”
void WriteExternalString(HANDLE hProc, BYTE* addr, char* newstr)
{
unsigned int arraySize;
//Get the size of the array, offset 0x14 is the size of the array
ReadProcessMemory(hProc, (BYTE*)(addr + 0x14), &arraySize, sizeof(arraySize), 0);
if (arraySize > 15)
{
uintptr_t addrOfCharArray;
//dereference the pointer in the second member variable to get the dynamic address of the array
ReadProcessMemory(hProc, (BYTE*)(addr + sizeof(void*)), &addrOfCharArray, sizeof(void*), 0);
//Write the buffer to the array, +1 to get the null terminator
WriteProcessMemory(hProc, (BYTE*)(addrOfCharArray), newstr, strlen(newstr) + 1, 0);
}
else
{
WriteProcessMemory(hProc, (BYTE*)(addr + sizeof(void*)), newstr, strlen(newstr) + 1, 0);
}
}
int main()
{
std::string str = "Hello Mate";
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
char newstr[] = "Goodbye m8";
WriteExternalString(hProcess, (BYTE*)&str, newstr);
cout << "string char array = " << str << endl;
system("pause");
return 0;
}https://stackoverflow.com/questions/50591774
复制相似问题