找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3000|回复: 1

tssk分析

[复制链接]
发表于 2015-10-23 16:05:54 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
Tssk.sys分析报告
        该驱动主要用于防止各类已知rootkit驱动的攻击,有很多恢复系统函数的操作,具体过程不详细介绍,看idb即可。
目录
Tssk.sys分析报告        1
一、        基础库        2


一、        基础库


1.1 由符号链接名获取设备名


  1. BOOLEAN GetDeviceNameBySymbolicName(PUNICODE_STRING SymbolicName,PUNICODE_STRING DeviceName)
  2. {
  3.         OBJECT_ATTRIBUTES ObjectAttributes;
  4.         UNICODE_STRING LinkTarget = {0};
  5.         HANDLE LinkHandle = NULL;
  6.         NTSTATUS Status;
  7.         ULONG ReturnedLength = 0;
  8.         BOOLEAN Ret = FALSE;
  9.         if(!SymbolicName || !DeviceName)
  10.                 return FALSE;
  11.         InitializeObjectAttributes(&ObjectAttributes,SymbolicName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
  12.         ZwOpenSymbolicLinkObject(&LinkHandle,GENERIC_READ,&ObjectAttributes);
  13.         if(LinkHandle)
  14.         {
  15.                 if(ZwQuerySymbolicLinkObject(LinkHandle, &LinkTarget, &ReturnedLength) == STATUS_BUFFER_TOO_SMALL)
  16.                 {
  17.                         if(ReturnedLength)
  18.                         {
  19.                                 ReturnedLength += 2;
  20.                                 LinkTarget.Buffer = (PWCH)ExAllocatePool(NonPagedPool,ReturnedLength);
  21.                                 if(LinkTarget.Buffer)
  22.                                 {
  23.                                         RtlZeroMemory(LinkTarget.Buffer,ReturnedLength);
  24.                                         LinkTarget.Length = 0;
  25.                                         LinkTarget.MaximumLength = ReturnedLength;
  26.                                         if(ZwQuerySymbolicLinkObject(LinkHandle, &LinkTarget, &ReturnedLength) == STATUS_SUCCESS)
  27.                                                 Ret = TRUE;
  28.                                 }
  29.                         }
  30.                 }
  31.                 if(LinkHandle)
  32.                 {
  33.                         ZwClose(LinkHandle);
  34.                         LinkHandle = NULL;
  35.                 }
  36.                 if(Ret)
  37.                         *DeviceName = LinkTarget;
  38.         }
  39.         if(LinkTarget.Buffer)
  40.                 ExFreePool(LinkTarget.Buffer);
  41. }
复制代码


1.2 遍历所有硬盘分区


  1. BOOLEAN GetHarddiskPartitioNumber(PDEVICE_OBJECT DeviceObject, PULONG OutPartitionNum)
  2. {
  3.         KEVENT Event;
  4.         IO_STATUS_BLOCK Ios;
  5.         NTSTATUS Status;
  6.         BOOLEAN Ret = FALSE;
  7.         if(!DeviceObject || !OutPartitionNum)
  8.                 return FALSE;
  9.         KeInitializeEvent(&Event);
  10.         PVOID Buf = ExAllocatePool(NonPagedPool,0x2000);
  11.         RtlZeroMemory(&Buf,0x2000);
  12.         PIRP Irp = IoBuildDeviceIoControlRequest(0x70050,DeviceObject,NULL,0,Buf,0x2000,FALSE,&Event,&Ios);
  13.         if(Irp)
  14.         {
  15.                 Status = IoCallDriver(DeviceObject,Irp);
  16.                 if(Status == STATUS_PENDING)
  17.                 {
  18.                         KeWaitForSingleObject(&Event,Suspended,KernelMode,FALSE,NULL);
  19.                         Status = Ios.Status;
  20.                 }
  21.                 if(NT_SUCCESS(Status))
  22.                 {
  23.                         *OutPartitionNum = *((ULONG*)Buf+1);
  24.                         Ret = TRUE;
  25.                 }
  26.         }
  27.         if(Buf)
  28.                 ExFreePool(Buf);
  29.         return Ret;
  30. }

  31. void EnumPartition()
  32. {
  33.         if(KeGetCurrentIrql() != PASSIVE_LEVEL)
  34.                 return;
  35.         PCONFIGURATION_INFORMATION config = IoGetConfigurationInformation();
  36.         for(int DiskIndex=0;DiskIndex < config->DiskCount;DiskIndex++)
  37.         {
  38.                 WCHAR Disk[260];
  39.                 UNICODE_STRING UDisk;
  40.                 PFILE_OBJECT FileObj = NULL;
  41.                 PDEVICE_OBJECT DevObj = NULL;
  42.                 vsnwprintfW(Disk,260,"\\Device\\Harddisk%d\\Partition0",DiskIndex);
  43.                 RtlInitUnicodeString(&UDisk,Disk);
  44.                 if(NT_SUCCESS(IoGetDeviceObjectPointer(&UDisk,FILE_READ_ATTRIBUTES,&FileObj,&DevObj))
  45.                 {
  46.                         if(MmIsAddressValid(FileObj->DeviceObject) && MmIsAddressValid(FileObj->DeviceObject->DriverObject))
  47.                         {
  48.                                 ULONG PartitionNumber;
  49.                                 if(GetHarddiskPartitionNumber(DevObj,&PartitionNumber))
  50.                                 {
  51.                                         for(int PartitionIndex=0;PartitionIndex < PartitionNumber;PartitionIndex++)
  52.                                         {
  53.                                                 WCHAR Partition[260];
  54.                                                 UNICODE_STRING UPartition;
  55.                                                 PFILE_OBJECT FileObjx = NULL;
  56.                                                 PDEVICE_OBJECT DevObjx = NULL;
  57.                                                 vsnwprintfW(Partition,260,"\\Device\\Harddisk%d\\Partition%d",DiskIndex,PartitionIndex);
  58.                                                 RtlInitUnicodeString(&UPartition,Partition);
  59.                                                 if(NT_SUCCESS(IoGetDeviceObjectPointer(&UPartition,FILE_READ_ATTRIBUTES,&FileObjx,&DevObjx))
  60.                                                 {
  61.                                                         if(MmIsAddressValid(FileObjx->DeviceObject) && MmIsAddressValid(FileObjx->DeviceObject->DriverObject))
  62.                                                         {
  63.                                                                
  64.                                                         }
  65.                                                 }
  66.                                         }
  67.                                 }
  68.                         }
  69.                 }
  70.         }
  71. }
复制代码


1.3 由进程对象获取文件对象
Xp之前:
        由PsGetProcessSectionBaseAddress得到SectionBaseAddress在EPROCESS中的偏移,前4字节为SectionObject偏移
        由PEPROCESS得到_SECTION.ControlArea.FilePointer
Xp之后:
        PsReferenceProcessFilePointer得到



tssk.rar (319.4 KB, 下载次数: 3)
回复

使用道具 举报

发表于 2018-1-14 15:31:44 | 显示全部楼层
可以可以!!
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 11:12 , Processed in 0.032120 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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