C++ 函数ReadProcessMemory不断返回错误\u部分\u副本

C++ 函数ReadProcessMemory不断返回错误\u部分\u副本,c++,winapi,dll-injection,C++,Winapi,Dll Injection,我知道还有其他人问过这个问题,但似乎没有人得出令人满意或可以理解的结论。我无法使用未回答的内容。我不太确定问题出在哪里,我尝试过各种不同的解决方案,但都没有成功,因此下面是我的代码: #include <windows.h> #include <iostream> using namespace std; int main() { HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFO

我知道还有其他人问过这个问题,但似乎没有人得出令人满意或可以理解的结论。我无法使用未回答的内容。我不太确定问题出在哪里,我尝试过各种不同的解决方案,但都没有成功,因此下面是我的代码:

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION, FALSE, (DWORD)7312);

    if(hProc == NULL)
    {
        cout << "Error: " << GetLastError() << endl;
    }

    HANDLE token;

    OpenProcessToken(hProc, TOKEN_ALL_ACCESS, &token);

    void *baseAddr = VirtualAllocEx(hProc, NULL, 500, MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    if(baseAddr == NULL)
    {
        cout << "VirtualAllocEx has failed" << endl;
    }
    else
    {
        cout << "Base Address: " << baseAddr << "\n" << endl;
    }

    DWORD prevProt;

    if(VirtualProtectEx(hProc, &baseAddr, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &prevProt) == 0)
    {
        if(GetLastError() == 87)
        {
            cout << "ERROR_INVALID_PARAMETER\n" << endl;
        }
        else if(GetLastError() == 487)
        {
            cout << "ERROR_INVALID_ADDRESS\n" << endl;
        }
    }

    void *buffer;

    if(ReadProcessMemory(hProc, baseAddr, &buffer, sizeof(SIZE_T), NULL) == 0)
    {
        if(GetLastError() == 299)
        {
            cout << "ERROR_PARTIAL_COPY" << endl;
        }
    }
}
#包括
#包括
使用名称空间std;
int main()
{
HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION,FALSE,(DWORD)7312);
if(hProc==NULL)
{

cout表达式
&buffer
错误-
ReadProcessMemory
不会为您分配缓冲区,它会写入您提供的缓冲区。您需要分配内存,并将该缓冲区传递给
ReadProcessMemory
。可能的方法:

void *buffer = new BYTE[512];
ReadProcessMemory(hProc, baseAddr, buffer, sizeof(SIZE_T), NULL);

表达式
&buffer
错误-
ReadProcessMemory
不会为您分配缓冲区,它会在您提供的缓冲区上写入。您需要分配内存,并将该缓冲区传递给
ReadProcessMemory
。可能的方法:

void *buffer = new BYTE[512];
ReadProcessMemory(hProc, baseAddr, buffer, sizeof(SIZE_T), NULL);

我发现你的代码有一些问题

  • 错误处理错误。如果发生错误,您将记录它,但继续使用错误数据。如果发生错误,请停止。这样您就误用了
    GetLastError()

  • 您将错误的基本加法传递给
    VirtualProtectEx()
    &baseAddr
    NED,使其成为
    baseAddr
    。此外,您还使用
    EXECUTE
    权限分配和保护内存,除非您打算在内存中存储可执行代码,否则不应使用该权限(此代码未执行此操作)

  • 您正在使用
    sizeof(DWORD)
    在远程内存上设置保护标志,但您正在使用
    sizeof(SIZE\T)
    读取内存。
    DWORD
    是一个固定的32位大小,但
    size\u T
    是32位或64位,具体取决于编译的平台。将
    size\u T
    更改为
    DWORD
    ,以匹配其余代码

  • 在调用过程中,您没有为要写入的
    ReadProcessMemory()
    分配任何内存。请将
    void*buffer;
    更改为
    DWORD buffer;

  • 试试这个:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        DWORD dwError;
    
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION, FALSE, (DWORD)7312);
        if (hProc == NULL)
        {
            dwError = GetLastError();
            cout << "OpenProcess has failed. Error: " << dwError << endl;
            return 0;
        }
    
        HANDLE token;
        if (!OpenProcessToken(hProc, TOKEN_ALL_ACCESS, &token))
        {
            dwError = GetLastError();
            cout << "OpenProcessToken has failed. Error: " << dwError << endl;
            return 0;
        }
    
        void *baseAddr = VirtualAllocEx(hProc, NULL, 500, MEM_RESERVE, PAGE_READWRITE);
        if (baseAddr == NULL)
        {
            dwError = GetLastError();
            cout << "VirtualAllocEx has failed. Error: " << dwError << endl;
            return 0;
        }
    
        cout << "Base Address: " << baseAddr << endl;
    
        DWORD prevProt;
        if (!VirtualProtectEx(hProc, baseAddr, sizeof(DWORD), PAGE_READWRITE, &prevProt))
        {
            dwError = GetLastError();
            cout << "VirtualAllocEx has failed. Error: ";
            if (dwError == ERROR_INVALID_PARAMETER)
            {
                cout << "ERROR_INVALID_PARAMETER";
            }
            else if (dwError == ERROR_INVALID_ADDRESS)
            {
                cout << "ERROR_INVALID_ADDRESS";
            }
            else
            {
                cout << dwError;
            }
            cout << endl;
            return 0;
        }
    
        DWORD buffer;
        if (ReadProcessMemory(hProc, baseAddr, &buffer, sizeof(DWORD), NULL))
        {
            dwError = GetLastError();
            cout << "ReadProcessMemory has failed. Error: ";
            if (dwError == ERROR_PARTIAL_COPY)
            {
                cout << "ERROR_PARTIAL_COPY";
            }
            else
            {
                cout << dwError;
            }
            cout << endl;
            return 0;
        }
    
        cout << "Value: " << buffer << endl;
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    德沃德误差;
    HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION,FALSE,(DWORD)7312);
    if(hProc==NULL)
    {
    dwError=GetLastError();
    
    我发现你的代码有一些问题

  • 错误处理错误。如果发生错误,您将记录它,但继续使用错误数据。如果发生错误,请停止。这样您就误用了
    GetLastError()

  • 您将错误的基本加法传递给
    VirtualProtectEx()
    &baseAddr
    NED,使其成为
    baseAddr
    。此外,您还使用
    EXECUTE
    权限分配和保护内存,除非您打算在内存中存储可执行代码,否则不应使用该权限(此代码未执行此操作)

  • 您正在使用
    sizeof(DWORD)
    在远程内存上设置保护标志,但您正在使用
    sizeof(SIZE\T)
    读取内存。
    DWORD
    是一个固定的32位大小,但
    size\u T
    是32位或64位,具体取决于编译的平台。将
    size\u T
    更改为
    DWORD
    ,以匹配其余代码

  • 在调用过程中,您没有为要写入的
    ReadProcessMemory()
    分配任何内存。请将
    void*buffer;
    更改为
    DWORD buffer;

  • 试试这个:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        DWORD dwError;
    
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION, FALSE, (DWORD)7312);
        if (hProc == NULL)
        {
            dwError = GetLastError();
            cout << "OpenProcess has failed. Error: " << dwError << endl;
            return 0;
        }
    
        HANDLE token;
        if (!OpenProcessToken(hProc, TOKEN_ALL_ACCESS, &token))
        {
            dwError = GetLastError();
            cout << "OpenProcessToken has failed. Error: " << dwError << endl;
            return 0;
        }
    
        void *baseAddr = VirtualAllocEx(hProc, NULL, 500, MEM_RESERVE, PAGE_READWRITE);
        if (baseAddr == NULL)
        {
            dwError = GetLastError();
            cout << "VirtualAllocEx has failed. Error: " << dwError << endl;
            return 0;
        }
    
        cout << "Base Address: " << baseAddr << endl;
    
        DWORD prevProt;
        if (!VirtualProtectEx(hProc, baseAddr, sizeof(DWORD), PAGE_READWRITE, &prevProt))
        {
            dwError = GetLastError();
            cout << "VirtualAllocEx has failed. Error: ";
            if (dwError == ERROR_INVALID_PARAMETER)
            {
                cout << "ERROR_INVALID_PARAMETER";
            }
            else if (dwError == ERROR_INVALID_ADDRESS)
            {
                cout << "ERROR_INVALID_ADDRESS";
            }
            else
            {
                cout << dwError;
            }
            cout << endl;
            return 0;
        }
    
        DWORD buffer;
        if (ReadProcessMemory(hProc, baseAddr, &buffer, sizeof(DWORD), NULL))
        {
            dwError = GetLastError();
            cout << "ReadProcessMemory has failed. Error: ";
            if (dwError == ERROR_PARTIAL_COPY)
            {
                cout << "ERROR_PARTIAL_COPY";
            }
            else
            {
                cout << dwError;
            }
            cout << endl;
            return 0;
        }
    
        cout << "Value: " << buffer << endl;
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    德沃德误差;
    HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION,FALSE,(DWORD)7312);
    if(hProc==NULL)
    {
    dwError=GetLastError();
    
    仍然不能返回
    ERROR\u PARTIAL\u COPY
    但是谢谢你纠正我。仍然返回
    ERROR\u PARTIAL\u COPY
    但是谢谢你纠正我。你有32位的进程和64位的目标吗?请告诉我,因为我真的不知道内存是如何工作的,但我不知道它们之间的区别。@davidelon:你到底是什么你想先用这段代码来完成吗?我对反编译的工作原理很好奇,所以我在自己制作的一些屏幕截图软件上对此进行了测试。要简单地读取另一个进程的编译代码,你不需要使用
    VirtualAllocEx()
    VirtualProtectEx()
    完全可以。只需分配一个足够大的本地缓冲区来接收代码,然后
    ReadProcessMemory()
    放入该缓冲区。代码可能很大,因此您可能需要分块读取。至于代码的基址,您必须读取并解析远程进程的PE头,以发现代码在内存中的位置。然后您可以根据需要手动将其反汇编。您有32位进程和64位目标吗?请与我联系这是因为我真的不太了解内存是如何工作的,但我不知道它们之间的区别。@Davidlon:你最初到底想用这段代码做什么?我很好奇反编译是如何工作的,所以我在自己制作的一些屏幕截图软件上测试了这一点。要简单地阅读另一个进程的编译代码,y您根本不需要使用
    VirtualAllocEx()
    VirtualProtectEx()
    。只需分配一个足够大的本地缓冲区来接收代码,然后
    ReadProcessMemory()
    放入该缓冲区。代码可能很大,因此您可能需要分块读取。至于代码的基址,您必须读取并解析远程进程的PE头,以发现代码在内存中的位置。然后您可以根据需要手动将其反汇编。我完成了您所说的所有内容,它仍然显示
    错误复印件<