
x86-64 페이징 테이블을 사용자 모드에서 조작하기 위한 C++ 라이브러리: PML4E, PDPTE, PDE 및 PTE 항목을 읽고 쓰며, 가상 주소를 물리 주소로 변환하고, 자기 참조 테이블을 구축합니다.
사용자 모드에서의 페이징 테이블 조작. 모든 페이징 테이블 엔트리와 값을 가져오고 설정하는 등의 작업을 제공합니다. 코드는 대형 페이지를 인식합니다. 관련 글 링크는 여기에서 확인할 수 있습니다.
vdm::read_phys_t _read_phys =
[&](void* addr, void* buffer, std::size_t size) -> bool
{
return vdm::read_phys(addr, buffer, size);
};
vdm::write_phys_t _write_phys =
[&](void* addr, void* buffer, std::size_t size) -> bool
{
return vdm::write_phys(addr, buffer, size);
};
vdm::vdm_ctx vdm(_read_phys, _write_phys);
nasa::mem_ctx my_proc(vdm);
const auto ntoskrnl_base =
reinterpret_cast<void*>(
util::get_kmodule_base("ntoskrnl.exe"));
const auto ntoskrnl_pde = my_proc.get_pde(ntoskrnl_base);
std::printf("[+] pde.present -> %d\n", ntoskrnl_pde.second.present);
std::printf("[+] pde.pfn -> 0x%x\n", ntoskrnl_pde.second.pfn);
std::printf("[+] pde.large_page -> %d\n", ntoskrnl_pde.second.large_page);
[+] pde.present -> 1
[+] pde.pfn -> 0x10400
[+] pde.large_page -> 1
[+] press any key to close...