3,881
社区成员
发帖
与我相关
我的任务
分享#include <ntddk.h>
typedef struct _ServiceDescriptorEnty
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
}ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
typedef NTSTATUS (__stdcall *NTOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK AccessMask,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId);
NTOPENPROCESS RealNtOpenProcess;
extern PServiceDescriptorTableEntry KeServiceDescriptorTable;
NTSTATUS MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId);
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("succeed!");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
ULONG Address;
PULONG RealOPServiceAddress;
_asm
{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
RealOPServiceAddress = *(ULONG*)Address;
RealNtOpenProcess = (NTOPENPROCESS)RealOPServiceAddress;
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7A*4;
*((ULONG*)Address)=(ULONG)MyNtOpenProcess;
_asm
{
cli
mov eax,cr0
and eax,10000h
mov cr0,eax
sti
}
DriverObject->DriverUnload=DriverUnload;
return STATUS_SUCCESS;
}
NTSTATUS MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId)
{
NTSTATUS rc=NULL;
ULONG dwPID;
//rc=(NTSTATUS)(REALZWOPENPROCESS)RealZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
if(ClientId!=NULL)
{
dwPID=(ULONG)ClientId->UniqueProcess;
if(dwPID==2344)
{
DbgPrint("PID 2344 has been accessed,need forbidden");
ProcessHandle=0;
rc=STATUS_ACCESS_DENIED;
}
}
else
rc=(NTSTATUS)(NTOPENPROCESS)RealNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId );
return rc;
}
#include <ntddk.h>
typedef struct _ServiceDescriptorEnty
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
}ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
typedef NTSTATUS (__stdcall *NTOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK AccessMask,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId);
NTOPENPROCESS RealNtOpenProcess;
extern PServiceDescriptorTableEntry KeServiceDescriptorTable;
NTSTATUS MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId);
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("succeed!");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
ULONG Address;
ULONG_PTR RealOPServiceAddress;
_asm
{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7A*4;
*((ULONG*)Address)=(ULONG)MyNtOpenProcess;
RealOPServiceAddress = *(ULONG*)Address;
RealNtOpenProcess = (NTOPENPROCESS)RealOPServiceAddress;
_asm
{
cli
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
DriverObject->DriverUnload=DriverUnload;
return STATUS_SUCCESS;
}
NTSTATUS MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId)
{
NTSTATUS rc=NULL;
ULONG dwPID;
//rc=(NTSTATUS)(REALZWOPENPROCESS)RealZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
if(ClientId!=NULL)
{
dwPID=(ULONG)ClientId->UniqueProcess;
if(dwPID==1884)
{
DbgPrint("PID 1884 has been accessed,need forbidden");
ProcessHandle=0;
rc=STATUS_ACCESS_DENIED;
}
}
else
rc=(NTSTATUS)(NTOPENPROCESS)RealNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId );
return rc;
}
#include <ntddk.h>
typedef struct _ServiceDescriptorEnty
{
void**ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
}ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
typedef NTSTATUS (__stdcall *NTOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK AccessMask,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId);
NTOPENPROCESS RealNtOpenProcess;PMDL mdl;void**mdladdr;
NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId);
VOID __stdcall DriverUnload(PDRIVER_OBJECT DriverObject)
{
*mdladdr=RealNtOpenProcess;
MmUnmapLockedPages(mdladdr,mdl);
IoFreeMdl(mdl);
}
NTSTATUS __stdcall DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
void**Address;static UNICODE_STRING Str1={26,26,L"ZwOpenProcess"},Str2={48,48,L"KeServiceDescriptorTable"};
PServiceDescriptorTableEntry KeServiceDescriptorTable;NTOPENPROCESS _ZwOpenProcess;
KeServiceDescriptorTable=MmGetSystemRoutineAddress(&Str2);
_ZwOpenProcess=MmGetSystemRoutineAddress(&Str1);
Address=(void**)&KeServiceDescriptorTable->ServiceTableBase[*(unsigned short*)((ULONG_PTR)_ZwOpenProcess+1)];
RealNtOpenProcess=*(NTOPENPROCESS*)Address;
mdl=IoAllocateMdl(Address,sizeof(void*),0,0,0);
MmBuildMdlForNonPagedPool(mdl);
mdladdr=(void**)MmMapLockedPagesSpecifyCache(mdl,KernelMode,MmNonCached,0,0,NormalPagePriority);
*mdladdr=MyNtOpenProcess;
DriverObject->DriverUnload=DriverUnload;
return 0;
}
NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId)
{
if(ClientId)
{
if(((ULONG_PTR)ClientId->UniqueProcess&~3)==1940)return 0xC0000022;
}
return RealNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
}