首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WriteProcessMemory (WPM)替换字符串?

如何使用WriteProcessMemory (WPM)替换字符串?
EN

Stack Overflow用户
提问于 2018-05-29 19:40:06
回答 2查看 1.3K关注 0票数 2

我试图用WPM编写一个简单的代码来替换一个程序中的字符串,并且我能够让它工作,但只能部分地工作。这是我用来获得结果的代码的一部分。

代码语言:javascript
复制
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。我需要帮助替换整个字符串,而不仅仅是它的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 05:35:39

如果目标字符串存储为std::string,则此方法将无法工作(情况如下)。它们有一个程序员不应该知道的内部结构(除非您在头文件中搜索),而且您的代码没有考虑到这一点。即使您这样做了,下一个版本的编译器也可能会破坏您的代码。

因此,请考虑将目标字符串存储为一个简单的C字符串(如果可以的话)。覆盖它是简单的,只要你不跑完,你就添加了一个终止的nul。我会显式地这样做--不要假设源字符串是nul终止的,它可能不是。或者使用std::string.c_str()并从其中复制size() + 1字节。

票数 1
EN

Stack Overflow用户

发布于 2020-04-06 05:37:01

string是一个容器,它管理后端的char数组。

现在,在x86上,如果要写入的字符串大小与当前字符串相同或更小,则可以相对轻松地执行,但不建议这样做。

如果char数组小于15个字符,则容器的偏移量0x14是数组的大小;如果char数组大于15个字符,则该数组存储在偏移量0x4处,此偏移量将转换为指向其他位置的动态数组的指针。

因此,您读取数组的大小,然后根据数组的大小将其写入正确的地址。这段代码将这样做,并输出“再见m8”

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50591774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档