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头,以发现代码在内存中的位置。然后您可以根据需要手动将其反汇编。我完成了您所说的所有内容,它仍然显示错误复印件<