C ++ - ReadProcessMemory缓冲区,WriteProcessMemory(在同一缓冲区上使用新值)将缓冲区恢复为旧值

时间:2018-04-05 17:17:16

标签: c++ winapi buffer readprocessmemory

我不知道为什么会这样,我最好奇。 我已经设法成功写入/读取不使用WriteProcessMemory上的缓冲区,但我想知道为什么会发生这种情况。

这是它的工作原理。你扔了测试

target.cpp(将变量的地址输出到读/写的过程)

#include <iostream>
#include <string>

using namespace std;

int main(){
int test = 5;
string pero = "hola";
cout << sizeof(test);
cout<<"Address of test is :" <<&test <<endl; //Address to put on Principal.cpp
cin.get(); //Wait that other process writes then I manually continue.
cout << "Value of test is: " << test<<endl; //Outputs 5, should output 20.
cin.get();
return 0;
}

Principal.cpp(读取和写入地址)。从主要开始。

#include <windows.h>
#include <tlhelp32.h>
#include <iostream> // For STL i/o
#include <ctime>    // For std::chrono
#include <thread>   // For std::this_thread
using namespace std;
DWORD FindProcessId(const char *name)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
        return 0;
    PROCESSENTRY32 ProcEntry;
    ProcEntry.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapshot, &ProcEntry))
    {
        {
            if (stricmp(ProcEntry.szExeFile, name) == 0)
                return ProcEntry.th32ProcessID;
            while (Process32Next(hSnapshot, &ProcEntry))
                if (stricmp(ProcEntry.szExeFile, name) == 0)
                {
                    return ProcEntry.th32ProcessID;
                }
        }
    }
}
 // IMPORTANT PART STARTS HERE.
int main()
{
    int buffer;
    DWORD Address = 0x28ff28; //Address of int test.
    DWORD ProcessId = FindProcessId("test.exe");

    if (ProcessId == 0)
        cout << "Doesn't exist.";
    else
        cout << "Process Id is : " << ProcessId << endl;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessId);
    if (hProcess == INVALID_HANDLE_VALUE)
    {
        cout << "Error in HANDLE";
    }
    if (ReadProcessMemory(hProcess, (LPCVOID)Address, (LPVOID)&buffer, sizeof(buffer), 0) == 0)
    {
        DWORD error = GetLastError();
        cout << "Error is " << error << endl;
    }

    cout << "Buffer is: " << buffer << endl; //Outputs 5

    buffer = 20; // Want to write 20 and then read variable on test.exe.
    if (WriteProcessMemory(hProcess, (LPVOID)Address, (LPCVOID)&buffer, sizeof(buffer), 0) == 0)
    {
        DWORD error = GetLastError();
        cout << "Error is " << error << endl;
    }
    cout << "Buffer is: " << buffer << endl; //Outputs 5, should output 20.
    CloseHandle(hProcess);
    return 0;
}

这里发生了什么。

  • ReadMemory缓冲区
  • buffer = 5
  • 使缓冲区= 20
  • 将缓冲区写入内存。
  • buffer = 5; &lt; - ¿为什么?

如果有人能向我解释,我会非常感激!

1 个答案:

答案 0 :(得分:-1)

一些事情。

 DWORD Address = 0x28ff28;

你是如何得到这个的,你刚刚从上面的程序告诉你地址是什么?

如果您从上述地址获取地址,则需要找到该程序的入口点,并将 0x28ff28 添加到该号码。

编辑:如果您使用内存查看器,您可以看到程序吐出的地址不指向该int,并且我说的偏移量也不大。您需要找出它相对于程序起始路径的存储位置。我错误地认为你可以使用上面程序吐出的数字。

设计窗口的方法是,出于安全原因,它将在不同的地址随机启动程序,您看到的地址是程序启动时的偏移量。

您应该能够从 nModule.modBaseAddr 中找到基本地址,但如果您在64-中运行程序,则可能需要将其强制转换为 uint64_t 位。

我希望这会有所帮助。

编辑: 你也可以这样做,而不是迭代快照

hWnd_ = FindWindow(nullptr, processName.c_str());
GetWindowThreadProcessId(hWnd_, &pid_);

还要确保以管理员身份运行。