作为一种爱好,我一直在花时间学习二进制文件。我正在创建一个程序,它主要完成 Ollydbg 的工作。我认为承担如此大的项目将教会我所有我想知道的关于 PE 的知识。现在我正在处理一个类似于 Ollydbg 的内存映射的对话框,并列出了与每个模块相关的堆和部分,但在访问系统模块的权限方面遇到了一些问题。我首先打开一个文件并将其作为调试对象运行。我那时
invoke OpenProcess,PROCESS_VM_READ,FALSE,AttachedPID
invoke ReadProcessMemory,eax,MemMapBaseAddress,offset MemMapMappingBuffer,1024h,offset MemMapNumberOfBytesWritten
invoke GetLastError
这适用于我尝试读取的大约 30% 的模块。其余的给我一个 12B 错误,只有部分 ReadProcessMemory 或 WriteProcessMemory 请求完成。给我这个错误的一个模块是 ntdll。所以我做了一些研究,发现我可能没有权限访问我试图访问的内存部分。所以我尝试用
invoke OpenProcess,PROCESS_VM_READ,FALSE,AttachedPID
push eax
invoke VirtualProtectEx,eax,offset MemMapBaseAddress,1024h,PAGE_READWRITE,offset OldProtect
invoke GetLastError
pop eax
invoke ReadProcessMemory,eax,MemMapBaseAddress,offset MemMapMappingBuffer,1024h,offset MemMapNumberOfBytesWritten
invoke GetLastError
对于 VirtualProtectEx,我收到错误 5,访问被拒绝。我也尝试以管理员身份运行该程序并得到相同的结果。关于什么让我无法读取作为调试对象加载的模块的 PE 标头的任何想法?