Ultima modifica:
Salve, sono alle prese con un progetto che consiste nel mappare con kdmappare un driver che andrà a modificare una porzione di memoria che risiede nella sezione
Riesco perfettamente ad ottenere l'indirizzo base e le dimensioni della sezione
Il driver che sto scrivendo per l'esattezza modifica la funzione
Aggiungo qualche dettaglio:
PAGE
di ntoskrnl.exe
, per intenderci la sezione PAGE
è assimilabile alla classica sezione .text
.Riesco perfettamente ad ottenere l'indirizzo base e le dimensioni della sezione
PAGE
, ma qualsiasi mio tentativo di scrittura dal driver su quella sezione risulterà in un BSOD con codice PAGE_FAULT_IN_NONPAGED_AREA
.Il driver che sto scrivendo per l'esattezza modifica la funzione
SeValidateImageHeader
, che appunto si trova nella sezione PAGE
di ntoskrnl.exe
, una versione comprensibile di ciò che ho scritto è questa:
C:
// Questo driver viene mappato con kdmapper, quindi i parametri "DriverObject" e "RegistryPath" avranno come valore NULL
NTSTATUS ManualMappedDriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
DebugMessage("[DD] Disable DSE driver loaded");
// Questa funzione viene chiamata soltanto per ottenere l'indirizzo base di ntoskrnl.exe
SYSTEM_MODULE_ENTRY module = { 0 };
if (!NT_SUCCESS(GetSystemModuleInformationByName("ntoskrnl.exe", &module)))
{
DebugMessage("[DD] GetSystemModuleInformationByName failed");
return STATUS_UNSUCCESSFUL;
}
// Questa funzione ritorna l'indirizzo base della sezione PAGE e l'ultimo parametro è un
// parametro in OUT che specifica le dimensioni della sezione
SIZE_T section_size = 0;
PVOID section_base = GetPESection(module.ImageBase, "PAGE", §ion_size);
if (!section_size || !section_base)
{
DebugMessage("[DD] GetPESection failes");
return STATUS_UNSUCCESSFUL;
}
// Questo è il pattern che sto cercando nella sezione (e viene trovato con successo)
// SeValidateImageHeader entry point pattern
UINT8 pattern[] =
{
0x48, 0x8B, 0xC4, 0x48, 0x89, 0x58, 0x08, 0x48,
0x89, 0x70, 0x10, 0x57, 0x48, 0x81, 0xEC, 0xA0,
0x00, 0x00, 0x00, 0x33, 0xF6, 0x48, 0x8B, 0xDA,
0x48, 0x39, 0x35, 0xE9, 0x87, 0x5A, 0x00, 0x48,
0x8B, 0xF9, 0x48, 0x89, 0x70, 0xF0, 0x44, 0x8B,
0xDE, 0x89, 0x70, 0xE8, 0x0F, 0x84, 0xAE, 0xB4,
0x20, 0x00, 0x8B, 0x94, 0x24, 0xF8, 0x00, 0x00,
0x00, 0xF6, 0xC2, 0x01, 0x0F, 0x85, 0xD2, 0x00,
};
// Ottengo il puntatore all'entry point della funzione che voglio patchare
PVOID entry_point = FindPatternInRange(section_base, section_size, pattern, sizeof(pattern));
UINT8 patch[] =
{
0x48, 0x33, 0xC0, // xor rax, rax
0xC3 // ret
};
// In questo tentativo di scrittura ottengo il BSOD: PAGE_FAULT_IN_NONPAGED_AREA
RtlCopyMemory(entry_point, patch, sizeof(patch));
return STATUS_SUCCESS;
}
Aggiungo qualche dettaglio:
- Ho implementato personalmente le funzioni che vedete sopra, e mi sono assicurato più volte che i dati ottenuti dalle funzioni fossero corretti.
- L'OS che sto utilizzando è
windows 11
21h2
22000.856
. - So che windows ha dei sistemi di protezione per le patch del kernel come il PatchGuard o l'HyperGuard, ma non mi pare siano loro a far scattare il
PAGE_FAULT_IN_NONPAGES_AREA
(o mi sbaglio?).
ntoskrnl.exe
?