|
|
[bgcolor=#ffffff]新增ssdt服务构建自己的内核通道,绕过一切hook。[/bgcolor]
[bgcolor=#ffffff]ssdt的结构:[/bgcolor]
[bgcolor=#ffffff]typedef struct ServiceDescriptorTable {[/bgcolor]
[bgcolor=#ffffff]PVOID ServiceTableBase;//ssdt函数数组[/bgcolor]
[bgcolor=#ffffff]PVOID ServiceCounterTable;//0[/bgcolor]
[bgcolor=#ffffff]unsigned int NumberOfServices;//ssdt函数数量[/bgcolor]
[bgcolor=#ffffff]PVOID ParamTableBase;//没个函数的参数个数表[/bgcolor]
[bgcolor=#ffffff]}*PServiceDescriptorTable;[/bgcolor]
[bgcolor=#ffffff]要新增ssdt函数需要修改这个结构,把我们的函数添加到这个结构里面去,同时ssdt影子表的头部也是这个结构所以也要修改。代码如下:[/bgcolor]
[bgcolor=#ffffff]typedef struct ServiceDescriptorTable[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]PVOID ServiceTableBase;//ssdt函数数组[/bgcolor]
[bgcolor=#ffffff]PVOID ServiceCounterTable;//0[/bgcolor]
[bgcolor=#ffffff]unsigned int NumberOfServices;//ssdt函数数量[/bgcolor]
[bgcolor=#ffffff]PVOID ParamTableBase;//没个函数的参数个数表[/bgcolor]
[bgcolor=#ffffff]}*PServiceDescriptorTable;[/bgcolor]
[bgcolor=#ffffff]extern PServiceDescriptorTable KeServiceDescriptorTable;[/bgcolor]
[bgcolor=#ffffff]PServiceDescriptorTable KeServiceDescriptorTableShadow;[/bgcolor]
[bgcolor=#ffffff]ULONG NewSSDTServiceTableBase[1024]={0};[/bgcolor]
[bgcolor=#ffffff]char NewSSDTParamTableBase[1024]={0};[/bgcolor]
[bgcolor=#ffffff]void * OldSSDTServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]void * OldSSDTParamTableBase;[/bgcolor]
[bgcolor=#ffffff]ULONG OldSSDTNumberOfServices;[/bgcolor]
[bgcolor=#ffffff]ULONG OldNtOpenProcess;[/bgcolor]
[bgcolor=#ffffff]void Unload(PDRIVER_OBJECT pDriverObject)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]//驱动卸载的时候要恢复原来的ssdt表[/bgcolor]
[bgcolor=#ffffff]MemoryWritable();[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable->ServiceTableBase=OldSSDTServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable-> aramTableBase=OldSSDTParamTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable->NumberOfServices=OldSSDTNumberOfServices;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow->ServiceTableBase=OldSSDTServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow-> aramTableBase=OldSSDTParamTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow->NumberOfServices=OldSSDTNumberOfServices;[/bgcolor]
[bgcolor=#ffffff]MemoryNotWritable();[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,//[/bgcolor]
[bgcolor=#ffffff] PUNICODE_STRING pRegistryPath)[/bgcolor]
[bgcolor=#ffffff]{ [/bgcolor]
[bgcolor=#ffffff]ULONG Shadow=GetKeServiceDescriptorTableShadow();[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow=(PServiceDescriptorTable*)(Shadow-0x10);[/bgcolor]
[bgcolor=#ffffff]//保存老的ssdt表[/bgcolor]
[bgcolor=#ffffff]OldSSDTServiceTableBase=KeServiceDescriptorTable->ServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]OldSSDTParamTableBase=KeServiceDescriptorTable-> aramTableBase;[/bgcolor]
[bgcolor=#ffffff]OldSSDTNumberOfServices=KeServiceDescriptorTable->NumberOfServices;[/bgcolor]
[bgcolor=#ffffff]AddSSDTFunCtion(NewNtOpenProcess,285,0x10);//新增的函数以从WRK里面摘的NtOpenProcess为例[/bgcolor]
[bgcolor=#ffffff]pDriverObject->DriverUnload=Unload;[/bgcolor]
[bgcolor=#ffffff]return 1;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]void MemoryWritable()[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]__asm [/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] cli[/bgcolor]
[bgcolor=#ffffff] mov eax,cr0[/bgcolor]
[bgcolor=#ffffff] and eax,not 10000h [/bgcolor]
[bgcolor=#ffffff] mov cr0,eax [/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]void MemoryNotWritable()[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]__asm [/bgcolor]
[bgcolor=#ffffff]{ [/bgcolor]
[bgcolor=#ffffff] mov eax, cr0 [/bgcolor]
[bgcolor=#ffffff] or eax, 10000h [/bgcolor]
[bgcolor=#ffffff] mov cr0, eax [/bgcolor]
[bgcolor=#ffffff] sti [/bgcolor]
[bgcolor=#ffffff]} [/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]void AddSSDTFunCtion(void* NewFunCtion,ULONG NewID,ULONG ParametersNumber)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]MemoryWritable();[/bgcolor]
[bgcolor=#ffffff]memcpy(NewSSDTServiceTableBase,KeServiceDescriptorTable->ServiceTableBase,(NewID-1)*4); //复制函数表[/bgcolor]
[bgcolor=#ffffff]memcpy(NewSSDTParamTableBase,KeServiceDescriptorTable-> aramTableBase,NewID-1);//复制参数表[/bgcolor]
[bgcolor=#ffffff]NewSSDTServiceTableBase[NewID-1]=(ULONG)NewFunCtion;[/bgcolor]
[bgcolor=#ffffff]NewSSDTParamTableBase[NewID-1]=ParametersNumber;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable->ServiceTableBase=NewSSDTServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable-> aramTableBase=NewSSDTParamTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTable->NumberOfServices=NewID;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow->ServiceTableBase=NewSSDTServiceTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow-> aramTableBase=NewSSDTParamTableBase;[/bgcolor]
[bgcolor=#ffffff]KeServiceDescriptorTableShadow->NumberOfServices=NewID;[/bgcolor]
[bgcolor=#ffffff]MemoryNotWritable();[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]int SearchFeature(int nAddr,char* pFeature,int nLeng)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]char szStatus[256]="";[/bgcolor]
[bgcolor=#ffffff]int i=5000;[/bgcolor]
[bgcolor=#ffffff]while(i--)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] RtlMoveMemory(szStatus,(char*)nAddr,nLeng);[/bgcolor]
[bgcolor=#ffffff] if (RtlCompareMemory(pFeature,szStatus,nLeng)==nLeng)[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] return nAddr+nLeng;[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] nAddr++;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]return 0;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]int GetKeServiceDescriptorTableShadow()[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]char ShadSSDTCode[16]="";[/bgcolor]
[bgcolor=#ffffff]RtlMoveMemory(ShadSSDTCode,(char *)KeServiceDescriptorTable,16);[/bgcolor]
[bgcolor=#ffffff]return SearchFeature(KeServiceDescriptorTable-300,ShadSSDTCode,16);[/bgcolor]
[bgcolor=#ffffff]} [/bgcolor] |
|