#c #windows #multithreading #kernel-mode
Вопрос:
У меня есть драйвер ядра Win, который может считывать и записывать виртуальную память процесса. Но проблема в том, что я могу вызывать функции памяти(запись/чтение) только из функций IoControl, DriverEntry и DriverUnload. При попытке вызвать функции памяти из функции потока — получение bsod с именем «KERNEL_SECURITY_CHECK_FAILURE».
Функция резьбы:
void Thread(PEPROCESS *Process) {
//code that cannot break anything and works well(no sys calls) (deleted from post)
if (Address != 0) { // Address - DWORD Address of memory. ClientAdress - too
KeReadVirtualMemory(Process, ClientAddress Address, amp;LocalPlayer, sizeof(ULONG)); // crashes here
}
Функция, которая создает поток:
void Manager(PEPROCESS Process, int Feature, int enabled) {
ObfReferenceObject(gDriverObject); // global pDriverObject(got from DriverEntry)
PHANDLE Thr;
NTSTATUS status = PsCreateSystemThread(amp;Thr, GENERIC_ALL, NULL, NULL, NULL, Thread, amp;Process);
if (!NT_SUCCESS(status))
{
ObfDereferenceObject(gDriverObject);
}
IoControl:
NTSTATUS IoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS Status;
ULONG BytesIO = 0;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
// Code received from user space
ULONG ControlCode = stack->Parameters.DeviceIoControl.IoControlCode;
if (ControlCode == IO_READ_REQUEST)
{
// stuff that works well(deleted from post)
else if (ControlCode == IO_CALL_FNC) {
PKERNEL_CALL_FNC_REQUEST ReadInput = (PKERNEL_CALL_FNC_REQUEST)Irp->AssociatedIrp.SystemBuffer;
PKERNEL_CALL_FNC_REQUEST ReadOutput = (PKERNEL_CALL_FNC_REQUEST)Irp->AssociatedIrp.SystemBuffer;
int Feature = ReadInput->Feature;
int enabled = ReadInput->enabled;
PEPROCESS Process;
if (NT_SUCCESS(PsLookupProcessByProcessId(ReadInput->ProcessId, amp;Process))) {
Manager(Process, Feature, enabled); // call manager(will create the thread)
}
}
Кереадвиртуальная память:
NTSTATUS KeReadVirtualMemory(PEPROCESS Process, PVOID SourceAddress, PVOID TargetAddress, SIZE_T Size)
{
PSIZE_T Bytes;
if (NT_SUCCESS(MmCopyVirtualMemory(Process, SourceAddress, PsGetCurrentProcess(),
TargetAddress, Size, KernelMode, amp;Bytes)))
return STATUS_SUCCESS;
else
return STATUS_ACCESS_DENIED;
}
And yes, the last, DriverEntry:
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pRegistryPath)
{
DbgPrintEx(0, 0, "[hout] Loadedn");
PsSetLoadImageNotifyRoutine(ImageLoadCallback);
RtlInitUnicodeString(amp;dev, L"\Device\kernelhout");
RtlInitUnicodeString(amp;dos, L"\DosDevices\kernelhout");
IoCreateDevice(pDriverObject, 0, amp;dev, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, amp;pDeviceObject);
IoCreateSymbolicLink(amp;dos, amp;dev);
pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCall;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCall;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoControl;
pDriverObject->DriverUnload = UnloadDriver;
pDeviceObject->Flags |= DO_DIRECT_IO;
pDeviceObject->Flags amp;= ~DO_DEVICE_INITIALIZING;
threads = (Thread*)ExAllocatePoolZero(PagedPool, 16 * sizeof(Thread), 'd');
threadnum = 0;
gDriverObject = pDriverObject; // writing to global
return STATUS_SUCCESS;
}
Как вызывать функции памяти из потока? Любая помощь, и, пожалуйста, извините за мой плохой английский…