[x86] dostep do CR3

0

cr3 zawiera adres tabel z adresami fizycznymi, w zaleznosci od trybu roznie ona wyglada.

Ale jedno sie nie zmienia, mov eax,cr3 = adres fizyczny.

jak teraz, w protected mode mam sie dobrac do tegoz adresu?
nie moge przelaczyc cr0.PF = 0 bo byla by to ostatnia instrukcja jaka wykonalbym przed utrata kontroli nad kodem.

jak teraz moge zobaczyc co sie znajduje pod cr3, w kontexcie mojego procesu?

Chodzi mi o zmapowanie adresu fizycznego w przestrzen mojego procesu.
Wg mnie jest to niewykonalne, bo zeby cos zmapowac trzeba zmienic jedna PTE, a zeby to zrobic to 1 rekord musi byc juz gotowy - zeby sie przez niego odwolac do zmapowanej pamieci?

[b]Wiec jak obejzec zawartosc CR3? Jak system manipuluje tabelami?[/b]

0

Można zmapować adres fizyczny na przykład tym (XP):

#include <ntddk.h>
UNICODE_STRING usDevmem;
OBJECT_ATTRIBUTES oaAttrs;
HANDLE hPhysMem;

RtlInitUnicodeString(&usDevmem, L"\\device\\physicalmemory");
InitializeObjectAttributes(&oaAttrs, &usDevmem, OBJ_CASE_INSENSITIVE, NULL, NULL);

if (NT_SUCCESS(ZwOpenSection(&hPhysMem, SECTION_MAP_READ, &oaAttrs)))
{
	PHYSICAL_ADDRESS paAddr;
	DWORD   = ilość bajtów;
	void *base;
	paAddr.LowPart  = adres do zmapowania; page aligned;
	paAddr.HighPart = 0;
	if (NT_SUCCESS(ZwMapViewOfSection(hPhysMem, -1, &base, 0, size, &paAddr, &size, ViewShare, 0, PAGE_READONLY)))
	{
		// size bajtów pod adresem base
		ZwUnmapViewOfSection(-1, base;
	}
	ZwClose(hPhysMem);
}

CR3 można odczytać chyba tylko z r0, a tak prosty driver to chyba nie problem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1