HOOK ObjectType 干涉文件访问

前几日在网上看到MJ0011大虾写的一篇《ObjectType HOOK干涉注册表操作(bypass icesword,gmer,NIAP,etc.)》的文章,感觉很有兴趣。MJ大虾的文章给出的代码主要是干涉注册表的。而ObjectType 可以干涉的不只是注册表,所以就想到用同样的方法去干涉文件的访问,举一反三嘛。

然后问题就出现了

用Windbg跟了一下,发现在pNewParseProcedure函数中出了问题。
本来是想通过ObjectName->Buffer得到打开的文件名,然后看其中有没有2.TXT这个字符串进行过滤的。但是我用Windbg看了看ObjectName->Buffer,貌似找不到我打开文件的文件名。
  1. #include <ntddk.h>
  2. #define MAX_PATH 266
  3. #define NUMBER_HASH_BUCKETS 37
  4. #define LINK_NAME L"\\DosDevices\\StopOpenLink"
  5. #define DEVICE_NAME L"\\Device\\StopLinkName"
  6. PVOID pOldParseProcedure = NULL;


  7. typedef struct _OBJECT_DIRECTORY_ENTRY {
  8.     struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
  9.     PVOID Object;
  10. } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;

  11. typedef struct _OBJECT_DIRECTORY {
  12.     struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[ NUMBER_HASH_BUCKETS ];
  13.     struct _OBJECT_DIRECTORY_ENTRY **LookupBucket;
  14.     BOOLEAN LookupFound;
  15.     USHORT SymbolicLinkUsageCount;
  16.     struct _DEVICE_MAP *DeviceMap;
  17. } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;

  18. typedef struct _DEVICE_MAP {
  19.     ULONG ReferenceCount;
  20.     POBJECT_DIRECTORY DosDevicesDirectory;
  21.     ULONG DriveMap;
  22.     UCHAR DriveType[ 32 ];
  23. } DEVICE_MAP, *PDEVICE_MAP;


  24. typedef struct _OBJECT_TYPE_INITIALIZER {
  25.   USHORT Length;
  26.   BOOLEAN UseDefaultObject;
  27.   BOOLEAN CaseInsensitive;
  28.   ULONG InvalidAttributes;
  29.   GENERIC_MAPPING GenericMapping;
  30.   ULONG ValidAccessMask;
  31.   BOOLEAN SecurityRequired;
  32.   BOOLEAN MaintainHandleCount;
  33.   BOOLEAN MaintainTypeList;
  34.   POOL_TYPE PoolType;
  35.   ULONG DefaultPagedPoolCharge;
  36.   ULONG DefaultNonPagedPoolCharge;
  37.   PVOID DumpProcedure;
  38.   PVOID OpenProcedure;
  39.   PVOID CloseProcedure;
  40.   PVOID DeleteProcedure;
  41.   PVOID ParseProcedure;
  42.   PVOID SecurityProcedure;
  43.   PVOID QueryNameProcedure;
  44.   PVOID OkayToCloseProcedure;
  45. } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;


  46. typedef struct _OBJECT_TYPE {
  47.   ERESOURCE Mutex;
  48.   LIST_ENTRY TypeList;
  49.   UNICODE_STRING Name; // Copy from object header for convenience
  50.   PVOID DefaultObject;
  51.   ULONG Index;
  52.   ULONG TotalNumberOfObjects;
  53.   ULONG TotalNumberOfHandles;
  54.   ULONG HighWaterNumberOfObjects;
  55.   ULONG HighWaterNumberOfHandles;
  56.   OBJECT_TYPE_INITIALIZER TypeInfo;
  57. #ifdef POOL_TAGGING
  58.   ULONG Key;
  59. #endif //POOL_TAGGING
  60. } OBJECT_TYPE, *POBJECT_TYPE;
  61. typedef struct _OBJECT_CREATE_INFORMATION {
  62.   ULONG Attributes;
  63.   HANDLE RootDirectory;
  64.   PVOID ParseContext;
  65.   KPROCESSOR_MODE ProbeMode;
  66.   ULONG PagedPoolCharge;
  67.   ULONG NonPagedPoolCharge;
  68.   ULONG SecurityDescriptorCharge;
  69.   PSECURITY_DESCRIPTOR SecurityDescriptor;
  70.   PSECURITY_QUALITY_OF_SERVICE SecurityQos;
  71.   SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
  72. } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;



  73. typedef struct _OBJECT_HEADER {
  74.   LONG PointerCount;
  75.   union {
  76.     LONG HandleCount;
  77.     PSINGLE_LIST_ENTRY SEntry;
  78.   };
  79.   POBJECT_TYPE Type;
  80.   UCHAR NameInfoOffset;
  81.   UCHAR HandleInfoOffset;
  82.   UCHAR QuotaInfoOffset;
  83.   UCHAR Flags;
  84.   union
  85.   {
  86.     POBJECT_CREATE_INFORMATION ObjectCreateInfo;
  87.     PVOID QuotaBlockCharged;
  88.   };
  89.   
  90.   PSECURITY_DESCRIPTOR SecurityDescriptor;
  91.   QUAD Body;
  92. } OBJECT_HEADER, *POBJECT_HEADER;
  93. POBJECT_TYPE pObHeader= NULL;
  94. NTSTATUS pNewParseProcedure(POBJECT_DIRECTORY RootDirectory,
  95.             POBJECT_TYPE ObjectType,
  96.             PACCESS_STATE AccessState,
  97.             KPROCESSOR_MODE AccessCheckMode,
  98.             ULONG Attributes,
  99.             PUNICODE_STRING ObjectName,
  100.             PUNICODE_STRING RemainingName,
  101.             PVOID ParseContext ,
  102.             PSECURITY_QUALITY_OF_SERVICE SecurityQos ,
  103.             PVOID *Object)
  104. {
  105.   NTSTATUS ntStatus = STATUS_SUCCESS;
  106.   WCHAR wOpenName[MAX_PATH];
  107.   RtlCopyMemory(wOpenName,ObjectName->Buffer,ObjectName->MaximumLength);
  108.   
  109.   if (wcsstr(wOpenName,L"2.TXT"))
  110.   {
  111.     return STATUS_OBJECT_NAME_NOT_FOUND;
  112.   }
  113.   __asm
  114.   {
  115.       push eax
  116.       push Object
  117.       push SecurityQos
  118.       push ParseContext
  119.       push RemainingName
  120.       push ObjectName
  121.       push Attributes
  122.       movzx eax, AccessCheckMode
  123.       push eax
  124.       push AccessState
  125.       push ObjectType
  126.       push RootDirectory
  127.       call pOldParseProcedure
  128.       
  129.       mov ntStatus, eax
  130.       pop eax
  131.       
  132.   }
  133.   return ntStatus;

  134. }


  135. NTSTATUS InstallHook()
  136. {
  137.   NTSTATUS  ntStatus;
  138.   HANDLE hFile;
  139.   UNICODE_STRING StName;
  140.   OBJECT_ATTRIBUTES obAttrib;
  141.   IO_STATUS_BLOCK ioStaBlock;
  142.   PVOID pObject = NULL;

  143.   KdPrint(("it start now!\n"));
  144.   RtlInitUnicodeString(&StName,L"\\DosDevices\\C:\\1.txt");
  145.   InitializeObjectAttributes(&obAttrib,&StName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE ,\
  146.     0,NULL);
  147.   ntStatus = ZwOpenFile(&hFile,GENERIC_ALL,&obAttrib,&ioStaBlock,\
  148.     0,FILE_NON_DIRECTORY_FILE);
  149.   if (!NT_SUCCESS(ntStatus))
  150.   {
  151.     KdPrint(("File Not Open\n"));
  152.     return ntStatus;
  153.   }
  154.   KdPrint(("File Open\n"));
  155.   ntStatus = ObReferenceObjectByHandle(hFile,GENERIC_ALL,NULL,KernelMode,&pObject,NULL);
  156.   if (!NT_SUCCESS(ntStatus))
  157.   {
  158.     KdPrint(("Object Not Open\n"));
  159.     return ntStatus;
  160.   }
  161.   KdPrint(("Object Open\n"));
  162.   __asm
  163.   {
  164.     cli;
  165.     mov eax, cr0;
  166.     and eax, not 10000h;
  167.     mov cr0, eax;
  168.   }
  169.   __asm
  170.   {
  171.     push eax;
  172.     mov eax,pObject;
  173.     mov eax,[eax-10h];
  174.     mov pObHeader,eax;
  175.     pop eax;
  176.   }
  177.   pOldParseProcedure = pObHeader->TypeInfo.ParseProcedure;
  178.   if (!MmIsAddressValid(pOldParseProcedure))
  179.   {
  180.     ObDereferenceObject(pObject);
  181.     ntStatus = ZwClose(hFile);
  182.     return ntStatus;
  183.   }

  184.   pObHeader->TypeInfo.ParseProcedure = pNewParseProcedure;
  185.   __asm
  186.   {
  187.     mov eax, cr0;
  188.     or eax, 10000h;
  189.     mov cr0, eax;
  190.     sti;
  191.   }
  192.   ntStatus = ZwClose(hFile);
  193.   return ntStatus;
  194. }

  195. NTSTATUS soDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP pIrp)
  196. {
  197.   NTSTATUS ntStatus = STATUS_SUCCESS;
  198.   PIO_STACK_LOCATION pIrpSt = NULL;
  199.   pIrpSt = IoGetCurrentIrpStackLocation(pIrp);

  200.   ntStatus = pIrp->IoStatus.Status;
  201.   IoCompleteRequest(pIrp,IO_NO_INCREMENT);
  202.   return ntStatus;
  203. }
  204. void soUnload(IN PDRIVER_OBJECT  DriverObject)
  205. {
  206.   UNICODE_STRING uTempString;
  207.   
  208.   __asm
  209.   {
  210.     cli;
  211.     mov eax, cr0
  212.     and eax, not 10000h
  213.     mov cr0, eax
  214.   }
  215.   pObHeader->TypeInfo.ParseProcedure = pOldParseProcedure;
  216.   __asm
  217.   {
  218.     mov eax, cr0;
  219.     or eax, 10000h
  220.     mov cr0, eax;
  221.     sti;
  222.   }
  223.   RtlInitUnicodeString(&uTempString,LINK_NAME);
  224.   IoDeleteSymbolicLink(&uTempString);
  225.   IoDeleteDevice(DriverObject->DeviceObject);
  226. }


  227. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
  228. {
  229.   NTSTATUS ntStatus = STATUS_SUCCESS;
  230.   UNICODE_STRING uLinkName;
  231.   UNICODE_STRING uDeviceName;
  232.   PDEVICE_OBJECT ObDevice;

  233.   RtlInitUnicodeString(&uDeviceName,DEVICE_NAME);
  234.   ntStatus = IoCreateDevice(DriverObject,0,&uDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&ObDevice);
  235.   if (!NT_SUCCESS(ntStatus))
  236.   {
  237.     return ntStatus;
  238.   }
  239.   RtlInitUnicodeString(&uLinkName,LINK_NAME);
  240.   ntStatus = IoCreateSymbolicLink(&uLinkName,&uDeviceName);
  241.   if (!NT_SUCCESS(ntStatus))
  242.   {
  243.     return ntStatus;
  244.   }
  245.   DriverObject->MajorFunction[IRP_MJ_CREATE] = soDispatch;
  246.   DriverObject->MajorFunction[IRP_MJ_CLOSE] = soDispatch;
  247.   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = soDispatch;

  248.   DriverObject->DriverUnload = soUnload;
  249.   InstallHook();

  250.   return ntStatus;

  251. }
复制代码

实在没办法了上论坛请教各位。请各位赐教!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值