64位进程上的ReadProcessMemory总是返回错误299
ReadProcessMemory on a 64 bit proces always returns Error 299
ReadProcessMemory出现问题我的代码是64位我可以读取任何32位进程的内存,但ReadProcessMemory总是失败,错误代码299(部分读取)返回0字节读取。
完成了我的研究,大多数答案都与特权有关,但我启用了调试令牌并以管理员身份运行,地址我读取了PE可选标头中的ImageBase
我试图使用VirtualQueryEx检查页面状态,但访问被拒绝!
注意:该代码在任何32位进程上都可以完美运行。
有什么想法可能是什么原因造成的吗?
HANDLE hProcess;
DWORD pid;
EnableDebugPriv();
pid=GetProcessByName("winmine.exe"); //32 bit apps work
//pid=GetProcessByName("notepad.exe"); //64 bit apps dont
hProcess = OpenProcess(PROCESS_ALL_ACCESS ,0, pid);
if(!hProcess)
{
printf("failed to acquire handle , Error %d n" , GetLastError());
return FAILED;
}
//DEBUGGING
//DWORD address = 0x100000000; //64 notepad
DWORD address = 0x1000000; // 32 bit minsweeper
DWORD oldProtect=0;
printf("DEBUG pid %d - last err :%d n" , GetProcessId(hProcess) , GetLastError() );
if(VirtualProtectEx(hProcess , (LPVOID)address,4096 /*pagesize for test*/ , PAGE_EXECUTE_READWRITE , &oldProtect))
{
cout <<"vp done n";
}
else cout << " vp err :" << GetLastError() << endl;
PMEMORY_BASIC_INFORMATION pmbi = new MEMORY_BASIC_INFORMATION;
if(VirtualQueryEx(hProcess,(LPVOID)address,pmbi,sizeof(MEMORY_BASIC_INFORMATION)))
{
cout << "protection :" << pmbi->AllocationProtect << endl;
}
char value = 0;
SIZE_T * pbytes = new SIZE_T ;
ReadProcessMemory(hProcess,(LPCVOID)address ,&value,sizeof(value),pbytes);
cout << value << endl;
printf("Read status : %d ; bytes read %d n",GetLastError() , *pbytes );
CloseHandle(hProcess);
这样使用MEMORY_BASIC_INFORMATION
是不正确的。根据远程进程是32位还是64位,您应该使用MEMORY_BASIC_INFORMATION32
或MEMORY_BASIC_INFORMATION64
(如MSDN备注部分所述)。
结构的大小和布局将根据是32位还是64位进程而有所不同。只要使用MEMORY_BASIC_INFORMATION
,您就可以期望远程进程使用当前进程使用的任何布局。
为了测试远程进程是32位还是64位,您可以使用IsWow64Process
函数,如下所示:
bool is64BitProcess(HANDLE hProcess)
{
const bool is64BitOS = sizeof(void *) == 8 || IsWow64Process(GetCurrentProcess());
return is64BitOS ? IsWow64Process(hProcess)
: false;
}
因此,经过一些调试和研究,发现问题出在ASLR上,所以我读错了,感谢您的帮助:)
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- glad 导致 glfwSwapBuffers 返回错误消息
- 我的模板类方法返回错误类型?
- 共享内存:MapViewOfFile 返回错误 5
- 使用 std::forward_list 返回错误的队列实现
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- __int64 CString 返回错误的值 - C++ MFC
- C++ OpenGL 中,绘制形状返回错误
- Python os.system() 返回错误值
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- LibClang clang_getArgType() 返回错误的类型
- 除法函数返回错误的值
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 矩阵逆变器返回错误的反转
- openCL-创建子缓冲区返回错误代码13
- Qt SQL LIKE语句返回错误
- GetLastError()从FtpPutFile()返回错误6
- PfCreateInterface返回错误120(未实现)
- 为什么 Pa_GetStreamTime() 返回错误?
- G++ 在尝试使用 G++ 使用 openCV 进行编译后返回错误