找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 194|回复: 0

增加新的ssdt服务函数绕过一切hook

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-11 16:21:27 | 显示全部楼层 |阅读模式
[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]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-2 01:31 , Processed in 0.080432 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表