我试图在C/ASM中使用PEB
结构体,但在我想了解一些基础知识之前。我在某个地方读到,大多数进程的PEB
位于地址0x07FFDA00
。
现在这个地址相对于进程基地址,即(0x00400000 + 0x07FFDA00 == PEB base addr)
?
因为所有的进程都不能把它们的PEB
放到这个地址。
因为不可能所有进程的PEB都指向这个地址
如果0x07FFDA00
和0x00400000
都是虚拟地址,那么所有进程的PEB
都可以在这个地址。
正如你在这个线程中看到的,0x07FFDA00
不是RVA
,它只是一个相对于进程的物理地址的VA
,所以0x00400000 + 0x07FFDA00
没有任何意义。
您可以使用NtQueryInformationProcess
检查此设置,例如:
DWORD pid = GetCurrentProcessId();
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
PROCESS_BASIC_INFORMATION pbi;
NTSTATUS status = NtQueryInformationProcess(hProcess,
ProcessBasicInformation,
&pbi,
sizeof(pbi),
NULL);
PPEB peb_addr = pbi.PebBaseAddress;