Hey ich bin gerade dabei OpenProcess,Write/ReadProcessMemory wieder zu Unhooken und habe deswegen diesen treiber geschrieben nur das problem ist ZwOpenProcess funktioniert der hook wunderbar aber bei ZwReadVirtualMemory muss ich die ntdll.lib linken und wenn ich das dann erstellt hab lässt sich der treiber nicht starten..... weiß jemand woran das liegt ?
Code:
#include "stdafx.h"
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
typedef unsigned long DWORD, *PDWORD;
typedef unsigned char BYTE, *PBYTE, *PCHAR;
typedef unsigned long ULONG_PTR;
typedef ULONG_PTR DWORD_PTR;
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTable;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE( _Call ) \
KeServiceDescriptorTable.ServiceTable[* ( unsigned int * ) \
( ( unsigned char * ) _Call + 1 )]
NTSYSAPI NTSTATUS NTAPI NtOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
typedef NTSTATUS (*NTOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
NTOPENPROCESS OldNtOpenProcess;
NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength );
typedef NTSTATUS (*ZWQUERYINFORMATIONPROCESS)(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG);
ZWQUERYINFORMATIONPROCESS OldZwQueryInformationProcess;
NTSYSAPI NTSTATUS NTAPI NtWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG NumberOfBytesToWrite, OUT PULONG NumberOfBytesWritten OPTIONAL );
typedef NTSTATUS (*NTWRITEVIRTUALMEMORY)(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG NumberOfBytesToWrite, OUT PULONG NumberOfBytesWritten OPTIONAL );
NTWRITEVIRTUALMEMORY OldNtWriteVirtualMemory;
long pid = -1;
NTSTATUS NewNtOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL)
{
LONG nStatus = OldNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
if(nStatus != STATUS_SUCCESS)nStatus = STATUS_SUCCESS;
return nStatus;
}
NTSTATUS NewZwQueryInformationProcess(HANDLE a,PROCESSINFOCLASS b,PVOID c,ULONG d,PULONG e)
{
if(b == ProcessBasicInformation && a != 0)
{
PROCESS_BASIC_INFORMATION* pbi = (PROCESS_BASIC_INFORMATION*)c;
pbi->UniqueProcessId = (ULONG_PTR)2;
}
return OldZwQueryInformationProcess(a,b,c,d,e);;
}
NTSTATUS NewNtWriteVirtualMemory(HANDLE a,PVOID b,PVOID c,ULONG d,PULONG e)
{
NTSTATUS aa = OldNtWriteVirtualMemory(a,b,c,d,e);
return aa;
}
LONG nOldProtect;
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
(NTOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = OldNtOpenProcess;
(ZWQUERYINFORMATIONPROCESS)(SYSTEMSERVICE(ZwQueryInformationProcess)) = OldZwQueryInformationProcess;
(NTWRITEVIRTUALMEMORY)(SYSTEMSERVICE(NtWriteVirtualMemory)) = OldNtWriteVirtualMemory;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING ntDeviceName;
UNICODE_STRING DeviceLinkString;
PDEVICE_OBJECT deviceObject = NULL;
OldNtOpenProcess =SYSTEMSERVICE(ZwOpenProcess);
SYSTEMSERVICE(ZwOpenProcess) = NewNtOpenProcess;
OldZwQueryInformationProcess = SYSTEMSERVICE(ZwQueryInformationProcess);
SYSTEMSERVICE(ZwQueryInformationProcess) = NewZwQueryInformationProcess;
OldNtWriteVirtualMemory = SYSTEMSERVICE(NtWriteVirtualMemory);
SYSTEMSERVICE(NtWriteVirtualMemory) = NewNtWriteVirtualMemory;
return STATUS_SUCCESS;
}