找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 18313|回复: 23

[转载]驱动级文件占坑

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-3-6 21:18:53 | 显示全部楼层 |阅读模式
本帖最后由 HoviDelphic 于 2010-3-7 01:12 编辑

核心源码来自互联网,能让PxNxxx和IxxLxxxx无法正常工作。

BanCrtPT.c

  1. #include "BanCrtPT.h"   
  2. #include "dbghelp.h"
  3. #include <windef.h>

  4. NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObject, PUNICODE_STRING pRegString);
  5. NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObject, PIRP pIrp);
  6. NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObject, PIRP pIrp);
  7. VOID DriverUnload(PDRIVER_OBJECT pDrvObject);
  8. NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObject, PIRP pIrp);

  9. HANDLE FileHandle;

  10. VOID OccupyFileTest()
  11. {
  12.     NTSTATUS ntStatus;
  13.     OBJECT_ATTRIBUTES ObjectAttributes;
  14.     UNICODE_STRING UniFileName;
  15.     IO_STATUS_BLOCK IoStatusBlock;
  16.     PCWSTR FileName = L"\\??\\C:\\WINDOWS\\system32\\ntkrnlpa.exe";
  17.     RtlInitUnicodeString(&UniFileName , FileName);
  18.     InitializeObjectAttributes(&ObjectAttributes,&UniFileName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
  19.     ntStatus=ZwCreateFile(&FileHandle,GENERIC_READ,&ObjectAttributes,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE,NULL,0);
  20.     if(!NT_SUCCESS(ntStatus))
  21.     {
  22.         DbgPrint("[OccupyFile] = %d", ntStatus);
  23.     }
  24.     else
  25.     {
  26.         DbgPrint("[OccupyFile] Success.");
  27.     }
  28. }

  29. NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObject, PUNICODE_STRING pRegString)
  30. {
  31.     NTSTATUS status = STATUS_SUCCESS;
  32.     UNICODE_STRING ustrLinkName;
  33.     UNICODE_STRING ustrDevName;   
  34.     PDEVICE_OBJECT pDevObject;
  35.     //
  36.     dprintf("[OccupyFile] DriverEntry: %S\n",pRegString->Buffer);
  37.     //
  38.     pDrvObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
  39.     pDrvObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
  40.     pDrvObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  41.     pDrvObject->DriverUnload = DriverUnload;
  42.     //
  43.     RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
  44.     //
  45.     status = IoCreateDevice(pDrvObject,
  46.         0,
  47.         &ustrDevName,
  48.         FILE_DEVICE_UNKNOWN,
  49.         0,
  50.         FALSE,
  51.         &pDevObject);
  52.     //
  53.     dprintf("[OccupyFile] Device Name %S",ustrDevName.Buffer);
  54.    
  55.     if(!NT_SUCCESS(status))
  56.     {
  57.         dprintf("[OccupyFile] IoCreateDevice = 0x%x\n", status);
  58.         return status;
  59.     }
  60.     //
  61.     RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
  62.     //
  63.     status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
  64.     if(!NT_SUCCESS(status))
  65.     {
  66.         dprintf("[OccupyFile] IoCreateSymbolicLink = 0x%x\n", status);
  67.         IoDeleteDevice(pDevObject);  
  68.         return status;
  69.     }
  70.     dprintf("[OccupyFile] SymbolicLink:%S",ustrLinkName.Buffer);
  71.     //
  72.     //OccupyFileTest();
  73.     return STATUS_SUCCESS;
  74. }


  75. VOID DriverUnload(PDRIVER_OBJECT pDrvObject)
  76. {   
  77.     UNICODE_STRING strLink;
  78.     RtlInitUnicodeString(&strLink, LINK_NAME);
  79.     IoDeleteSymbolicLink(&strLink);
  80.     IoDeleteDevice(pDrvObject->DeviceObject);
  81.     //
  82.     //ZwClose(FileHandle);
  83.     dprintf("[OccupyFile] Unloaded\n");
  84. }

  85. NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObject, PIRP pIrp)
  86. {
  87.     pIrp->IoStatus.Status = STATUS_SUCCESS;
  88.     pIrp->IoStatus.Information = 0;
  89.     dprintf("[OccupyFile] IRP_MJ_CREATE\n");
  90.     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  91.     return STATUS_SUCCESS;
  92. }

  93. NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObject, PIRP pIrp)
  94. {
  95.     pIrp->IoStatus.Status = STATUS_SUCCESS;
  96.     pIrp->IoStatus.Information = 0;
  97.     dprintf("[OccupyFile] IRP_MJ_CLOSE\n");
  98.     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  99.     return STATUS_SUCCESS;
  100. }

  101. NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObject, PIRP pIrp)
  102. {
  103.     NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
  104.     PIO_STACK_LOCATION pIrpStack;
  105.     ULONG uIoControlCode;
  106.     PVOID pIoBuffer;
  107.     ULONG uInSize;
  108.     ULONG uOutSize;
  109.     //
  110.     pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  111.     uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  112.     pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
  113.     uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
  114.     uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
  115.     //
  116.     switch(uIoControlCode)
  117.     {
  118.     case IOCTL_StartOF:
  119.         {
  120.             OccupyFileTest();
  121.             status = STATUS_SUCCESS;
  122.             break;
  123.         }
  124.     case IOCTL_EndOF:
  125.         {
  126.             ZwClose(FileHandle);
  127.             status = STATUS_SUCCESS;
  128.             break;
  129.         }
  130.     }
  131.     //
  132.     if(status == STATUS_SUCCESS)
  133.         pIrp->IoStatus.Information = uOutSize;
  134.     else
  135.         pIrp->IoStatus.Information = 0;
  136.    
  137.     pIrp->IoStatus.Status = status;
  138.     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  139.     //
  140.     return status;
  141. }
复制代码


BanCrtPT.h


  1. #include <devioctl.h>

  2. #ifndef _INLINEOBREFERENCEOBJECTBYHANDLE_H
  3. #define _INLINEOBREFERENCEOBJECTBYHANDLE_H 1
  4. //============================================
  5. #define DEVICE_NAME L"\\Device\\devOccupyFile" //Driver Name
  6. #define LINK_NAME L"\\DosDevices\\OccupyFile"  //Link Name
  7. //============================================
  8. #define IOCTL_BASE    0x800

  9. #define MY_CTL_CODE(i) \
  10.     CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)

  11. #define IOCTL_StartOF        MY_CTL_CODE(1) //开始独占
  12. #define IOCTL_EndOF            MY_CTL_CODE(2) //停止独占
  13. //============================================

  14. #endif
复制代码


dbghelp.h


  1. #ifndef _DBGHELP_H
  2. #define _DBGHELP_H 1

  3. #include <ntddk.h>

  4. #define dprintf if (DBG) DbgPrint
  5. #define nprintf DbgPrint

  6. #define kmalloc(_s)    ExAllocatePoolWithTag(NonPagedPool, _s, 'SYSQ')
  7. //#define kfree(_p)    ExFreePoolWithTag(_p, 'SYSQ')
  8. #define kfree(_p)    ExFreePool(_p)

  9. #endif  
复制代码


  1. PCWSTR FileName = L"\\??\\C:\\WINDOWS\\system32\\ntkrnlpa.exe";
复制代码

在“BanCrtPT.c”中,这句是硬编码,内核文件的路径和名字可以动态获得,这里为叙述方便而省略。

1

主题

2

回帖

0

精华

初来乍到

积分
13
发表于 2010-6-2 14:18:44 | 显示全部楼层
这个没什么价值,在R3下都可以实现了。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-6-2 20:55:17 | 显示全部楼层
.......菜鸟飘过:L
我就是嗷嗷叫的老马了......

0

主题

56

回帖

0

精华

铜牌会员

积分
67
发表于 2010-6-24 04:24:04 | 显示全部楼层
C++?

0

主题

56

回帖

0

精华

铜牌会员

积分
67
发表于 2010-6-25 13:24:15 | 显示全部楼层
谁能改成VB的呀??????????

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-6-26 16:30:50 | 显示全部楼层
Open "C:\WINDOWS\system32\ntkrnlpa.exe" For Binary Access Read Lock Read Write As #1

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-6-26 16:31:09 | 显示全部楼层
VB的

0

主题

56

回帖

0

精华

铜牌会员

积分
67
发表于 2010-6-29 03:32:51 | 显示全部楼层
谁有VB的码呀?

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2010-6-30 15:42:02 | 显示全部楼层
方法很好啊,还有一个大牛的直接发送IRP打开文件,不关闭,更厉害,不过测试发现开启verifier时候,去保护蓝屏

0

主题

9

回帖

0

精华

初来乍到

积分
0
发表于 2010-7-31 12:52:37 | 显示全部楼层
还不如看我在vbgood发的占坑,目前所有ark无效

0

主题

34

回帖

0

精华

铜牌会员

积分
44
发表于 2010-8-4 07:53:21 | 显示全部楼层
不知道还有效没

5

主题

19

回帖

0

精华

铜牌会员

积分
39
发表于 2010-8-7 13:21:08 | 显示全部楼层
没必要吧。。。icesword应该还是能删除
它用发irp。。。。

eaaca123
你的程序有效代码就这么一句。。。
Open "c:\hook.dll" For Binary Access Read Lock Read Write As #1
还是过不了icesword

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-7 22:38:53 | 显示全部楼层
本帖最后由 Tesla.Angela 于 2010-8-7 22:45 编辑

随便说个方法:
打开句柄,设置句柄为禁止关闭(使用SetHandleInformation)。
除了磁盘解析删除文件,否则文件在Ring是无法删除的。

5

主题

19

回帖

0

精华

铜牌会员

积分
39
发表于 2010-8-8 18:17:16 | 显示全部楼层
我刚刚试了下(在ring3)
普通工具删不掉
xuetr icesword还是过不了。。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-8 22:28:00 | 显示全部楼层
我刚刚试了下(在ring3)
普通工具删不掉
xuetr icesword还是过不了。。。。
倒霉蛋儿 发表于 2010-8-8 18:17


这份代码不怎么地,我曾经写过一个Ring3版本的,你自己搜搜看。
本网站最菜的人 该用户已被删除
发表于 2010-8-9 20:08:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-9 22:59:25 | 显示全部楼层
回复 16# 本网站最菜的人


哪两句?

5

主题

19

回帖

0

精华

铜牌会员

积分
39
发表于 2010-8-10 13:50:11 | 显示全部楼层
回复 15# Tesla.Angela


    没搜到。。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-10 15:55:38 | 显示全部楼层
回复  Tesla.Angela


    没搜到。。。。
倒霉蛋儿 发表于 2010-8-10 13:50


莫非我在梦中发帖了???

  1. Option Explicit

  2. Public Declare Function RtlInitUnicodeString Lib "NTDLL.DLL" _
  3.                         (ByRef DestinationString As UNICODE_STRING, _
  4.                         ByVal SourceString As Long) As Long

  5. Public Declare Function SetHandleInformation Lib "kernel32.dll" (ByVal hObject As Long, ByVal dwMask As Long, ByVal dwFlags As Long) As Long

  6. Public Sub InitializeObjectAttributes(ByRef InitializedAttributes As OBJECT_ATTRIBUTES, _
  7.                                       ByRef ObjectName As UNICODE_STRING, _
  8.                                       ByVal Attributes As Long, _
  9.                                       ByVal RootDirectory As Long, _
  10.                                       ByVal SecurityDescriptor As Long)
  11.     With InitializedAttributes
  12.         .Length = LenB(InitializedAttributes)
  13.         .Attributes = Attributes
  14.         .ObjectName = VarPtr(ObjectName)
  15.         .RootDirectory = RootDirectory
  16.         .SecurityDescriptor = SecurityDescriptor
  17.         .SecurityQualityOfService = 0
  18.     End With
  19. End Sub

  20. Public Function OccupyFile(ByVal szFileName As String) As Long
  21.     Dim FileHandle As Long
  22.     'HANDLE FileHandle;
  23.     Dim ObjectAttributes As OBJECT_ATTRIBUTES
  24.     'OBJECT_ATTRIBUTES ObjectAttributes;
  25.     Dim UniFileName As UNICODE_STRING
  26.     'UNICODE_STRING UniFileName;
  27.     Dim IoStatusBlock As IO_STATUS_BLOCK
  28.     'IO_STATUS_BLOCK IoStatusBlock;
  29.     Call RtlInitUnicodeString(UniFileName, StrPtr(szFileName))
  30.     'RtlInitUnicodeString(&UniFileName , szFileName);
  31.     Call InitializeObjectAttributes(ObjectAttributes, UniFileName, &H40 Or &H200, 0, 0)
  32.     'InitializeObjectAttributes(&ObjectAttributes,&UniFileName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
  33.     OccupyFile = ZwCreateFile(FileHandle, &H80000000, ObjectAttributes, IoStatusBlock, 0, 128, 0, 3, &H40, 0, 0)
  34.     'return ZwCreateFile(&FileHandle,GENERIC_READ,&ObjectAttributes,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE,NULL,0);
  35.     Call SetHandleInformation(FileHandle, &H2, &H2)
  36.     'SetHandleInformation(FileHandle, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE);
  37. End Function

  38. Sub main()
  39.     Dim ntst As Long
  40.     ntst = OccupyFile(InputBox("Input File Name:", "OccupyFile", "\??\c:\testfile\test.txt"))
  41.     MsgBox CStr(NT_SUCCESS(ntst)), vbInformation, "Status"
  42.     MsgBox "Don't close this Window! Test Your File!", vbInformation, "OccupyFile"
  43. End Sub
复制代码
有些声明不全,没有声明的你用mNativeDeclares.bas就行了。

评分

参与人数 1水晶币 +5 +20 收起 理由
倒霉蛋儿 + 5 + 20 发布源码

查看全部评分

5

主题

19

回帖

0

精华

铜牌会员

积分
39
发表于 2010-8-10 17:27:23 | 显示全部楼层
权限不够 无法搜索帖子。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-8-10 17:29:10 | 显示全部楼层
权限不够 无法搜索帖子。。。
倒霉蛋儿 发表于 2010-8-10 17:27



我是要你用谷歌搜索

0

主题

6

回帖

0

精华

初来乍到

积分
2
发表于 2011-11-1 01:24:11 | 显示全部楼层
mark

0

主题

40

回帖

0

精华

铜牌会员

积分
140
发表于 2011-11-12 15:41:35 | 显示全部楼层
学习了

0

主题

92

回帖

0

精华

铜牌会员

积分
166
发表于 2012-3-16 16:35:49 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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