C:
NTSTATUS read_process_memory(uintptr_t pid, uintptr_t address, PVOID buffer, SIZE_T bitetoread)
{
if (pid) return STATUS_UNSUCCESSFUL;
PEPROCESS process = 0;
PsLookupProcessByProcessId(pid, &process);
if (!process) return STATUS_UNSUCCESSFUL;
uintptr_t process_base = get_process_cr3(process);
if (!process_base) return STATUS_UNSUCCESSFUL;
ObDereferenceObject(process);
uintptr_t physical_address = translate_linear(process_base, (uintptr_t)address);
if (!physical_address) return STATUS_UNSUCCESSFUL;
uintptr_t final_size = min(PAGE_SIZE - (physical_address & 0xFFF), bitetoread);
buffer = Read_Physical_memory((PVOID)physical_address, NULL, final_size);
return STATUS_SUCCESS;
}
uintptr_t get_process_cr8(PEPROCESS pprocess)
{
if (!pprocess) return 0;
uintptr_t process_dirbase = *(uintptr_t*)((UINT8*)pprocess + 0x28);
if (process_dirbase == 0)
{
ULONG user_diroffset = get_winver();
process_dirbase = *(uintptr_t*)((UINT8*)pprocess + user_diroffset);
}
if ((process_dirbase >> 0x38) == 0x40)
{
if (!already_attached) //find a way to reset this
{
KAPC_STATE apc_state;
KeStackAttachProcess(pprocess, &apc_state);
saved_dirbase = __readcr8();
KeUnstackDetachProcess(&apc_state);
already_attached = TRUE;
}
if (saved_dirbase) return saved_dirbase;
}
return process_dirbase;
}
uintptr_t translate_linear(uintptr_t directory_table_base, uintptr_t virtual_address)
{
directory_table_base &= ~0xf;
uintptr_t pageoffset = virtual_address & ~(~0ul << page_offset_size);
uintptr_t pte = ((virtual_address >> 12) & (0x1ffll));
uintptr_t pt = ((virtual_address >> 21) & (0x1ffll));
uintptr_t pd = ((virtual_address >> 30) & (0x1ffll));
uintptr_t pdp = ((virtual_address >> 39) & (0x1ffll));
SIZE_T readsize = 0;
uintptr_t pdpe = 0;
pdpe = Read_Physical_memory((PVOID)(directory_table_base + 8 * pdp), &pdpe, sizeof(pdpe));
if (~pdpe & 1) return 0;
uintptr_t pde = 0;
pde = Read_Physical_memory((PVOID)((pdpe & pmask) + 8 * pd), &pde, sizeof(pde));
if (~pde & 1) return 0;
if (pde & 0x80) return (pde & (~0ull << 42 >> 12)) + (virtual_address & ~(~0ull << 30));
uintptr_t ptraddr = 0;
ptraddr = Read_Physical_memory((PVOID)((pde & pmask) + 8 * pt), &ptraddr, sizeof(ptraddr));
if (~ptraddr & 1) return 0;
if (ptraddr & 0x80) return (ptraddr & pmask) + (virtual_address & ~(~0ull << 21));
virtual_address = 0;
virtual_address = Read_Physical_memory((PVOID)((ptraddr & pmask) + 8 * pte), &virtual_address, sizeof(virtual_address));
virtual_address &= pmask;
if (!virtual_address) return 0;
return virtual_address + pageoffset;
}
uintptr_t Read_Physical_memory(uintptr_t Address, PVOID buffer, SIZE_T bitetoread)
{
PVOID Pool = ExAllocatePoolWithTag(NonPagedPool, bitetoread, 'Tag1');
if (Pool == NULL) return;
else
{
PHYSICAL_ADDRESS ad;
ad.QuadPart = Address;
PVOID MemoryMap = MmMapIoSpaceEx(ad, bitetoread, PAGE_READONLY);
if (MemoryMap == NULL) return;
else
{
MM_COPY_ADDRESS copyaddress;
copyaddress.VirtualAddress = MemoryMap;
SIZE_T counter;
MmCopyMemory(Pool, copyaddress, bitetoread, MM_COPY_MEMORY_VIRTUAL, &counter);
DbgPrint("Value of counter: %p\n", counter);
for (int i = 0; i < bitetoread; i++) {
DbgPrint("%02X ", ((PUCHAR)Pool)[i]);
}
MmUnmapIoSpace(MemoryMap, bitetoread);
return *(PULONG)Pool;
ExFreePoolWithTag(Pool, 'Tag1');
}
}
}
где здесь может быть ошибка ?
Последнее редактирование:
