首页
社区
课程
招聘
[求助]如何用汇编强制删除文件
发表于: 2009-1-18 18:07 14969

[求助]如何用汇编强制删除文件

2009-1-18 18:07
14969
!!!

如何用汇编强制删除文件???

比如说正在使用的文件?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
首先,你只开一个帖子问就好,没必要开两个~~~~~
其次,这个问题,我觉得关键不在于汇编而在于强制`~~~~

我没觉得用C删除和用汇编删除有什么本质上的区别~~~~

就删文件就那么几个API,强制删除我不知道, 帮不了你了`
2009-1-18 18:52
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
强删文件:

1.被HOOK保护文件:摘HOOK,摘链,饶过filter,DISK操作,磁盘IO操作等

2.被权限保护的文件:RING0删除

3.独占文件:
(1).dup and close handle
(2).XCB fuck
(3).open with FILE_READ_ATTRIBUTES ,and send IRP
(4).disk erease

4.section,运行中文件:
(1).hook MmFlushImageSection
(2).zero FileObject->SectionObjectPointer->ImageSectionObject

5.写回文件:
(1).file_read_attribtues 删除法站坑
(2).其他站坑方式,文件夹站坑,等等
(3).关机shutdown notification删除
2009-1-18 19:31
0
雪    币: 86
活跃值: (56)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
膜拜,很强大!!!
2009-1-18 20:16
0
雪    币: 171
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
windows系统貌似不能删除正在使用的文件吧
2009-1-20 04:56
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
Ring0下好象没有什么不能!你叫Windows跟你姓都可以
2009-1-20 07:47
0
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
向 MJ 学习!
2009-1-20 12:59
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
向MJ学习,太强大了!
2009-1-20 17:08
0
雪    币: 21
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
怎么没人给代码呀,我来整一个:
//////////////////////////////////////////////////
// DeleteFile.cpp文件
extern "C"
{
#include <ntddk.h>
}
//控制字
#define IOCTL_DELETE_FILE CTL_CODE( FILE_DEVICE_UNKNOWN, 0x888, METHOD_BUFFERED, FILE_ANY_ACCESS )
//设备名称
#define NT_DEVICE_NAME  L"[URL="file://\\Device\\DeleteFile"]\\Device\\DeleteFile[/URL]"
#define DOS_DEVICE_NAME  L"[URL="file://\\DosDevices\\DeleteFile"]\\DosDevices\\DeleteFile[/URL]"
//创建关闭驱动的例程
NTSTATUS
DispatchCreateClose(
         IN PDEVICE_OBJECT  DeviceObject,
         IN PIRP  Irp
      )
{
 //设置IRP状态
 Irp->IoStatus.Status = STATUS_SUCCESS;
 //完成请求
 IoCompleteRequest( Irp, IO_NO_INCREMENT );
 return STATUS_SUCCESS;
}
NTSTATUS
IoCompletion(
      IN PDEVICE_OBJECT  DeviceObject,
      IN PIRP  Irp,
      IN PVOID  Context
    )
{
 //设置IRP
 Irp->UserIosb->Status = Irp->IoStatus.Status;
 Irp->UserIosb->Information = Irp->IoStatus.Information;
 
 //受信状态
 KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, FALSE);
 
 //KeResetEvent( Irp->UserEvent );
 IoFreeIrp(Irp);
 
 return STATUS_MORE_PROCESSING_REQUIRED;
}
BOOLEAN
SuperDeleteFile( IN PCWSTR lpFileName )
{
 HANDLE  hFile = NULL;
 IO_STATUS_BLOCK IoStatus;
 NTSTATUS ntStatus;
 UNICODE_STRING  UniFileName;
 OBJECT_ATTRIBUTES ObjAttributes;
 PFILE_OBJECT pFileObj;
 PDEVICE_OBJECT pFileDeviceObj;
 PIRP  pIrp;
 PIO_STACK_LOCATION pIOStack;
 KEVENT  Event;
 FILE_BASIC_INFORMATION FileInfo;
 FILE_DISPOSITION_INFORMATION    FileDispostionInformation;
 //代码必须运行在PASSIVE_LEVEL等级上
 __try
 {
  if (KeGetCurrentIrql() > PASSIVE_LEVEL)
  {
   DbgPrint("KeGetCurrentIrql() > PASSIVE_LEVEL\n");
   return FALSE;
  }
  RtlInitUnicodeString( &UniFileName, lpFileName );
  //初始化对象属性
  InitializeObjectAttributes( 
      &ObjAttributes, 
      &UniFileName,
      OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, 
      NULL,
      NULL );
  //打开文件
  ntStatus = IoCreateFile( &hFile, 
      FILE_READ_ATTRIBUTES,
      &ObjAttributes,
      &IoStatus,
      0,
      FILE_ATTRIBUTE_NORMAL,
      FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_READ,
      FILE_OPEN,
      FILE_RANDOM_ACCESS,
      NULL,
      0,
      CreateFileTypeNone,
      NULL,
      IO_NO_PARAMETER_CHECKING
        );
  if ( !NT_SUCCESS( ntStatus ) || hFile == NULL )
  {
   DbgPrint( "打开文件失败\n" );
   return FALSE;
  }
  //-------------开始去掉文件的属性----------------------
  ntStatus = ObReferenceObjectByHandle(    hFile, 
          DELETE,
          *IoFileObjectType,
          KernelMode,
          (void**)&pFileObj,
          NULL
          );
  if ( !NT_SUCCESS( ntStatus ) )
  {
   DbgPrint( "获得文件访问权失败!\n" );
   return FALSE;
  }
 
  //获得和文件相关的设备对象
  pFileDeviceObj = IoGetRelatedDeviceObject( pFileObj );
 
  //为IRP分配空间
  pIrp = IoAllocateIrp( pFileDeviceObj->StackSize, TRUE );
  if (pIrp == NULL)
  {
   ObDereferenceObject( pFileObj );
   return FALSE;
  }
 
  //初始化事件对象
  KeInitializeEvent( &Event, SynchronizationEvent, FALSE );
 
  //清空结构体
  memset( &FileInfo, 0, sizeof( FILE_BASIC_INFORMATION ) );
  FileInfo.FileAttributes = FILE_ATTRIBUTE_NORMAL;
 
  //填充IRP
  pIrp->AssociatedIrp.SystemBuffer = &FileInfo;
  pIrp->UserEvent = &Event;
  pIrp->UserIosb  = &IoStatus;
  pIrp->Tail.Overlay.OriginalFileObject = pFileObj;
  pIrp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
  pIrp->RequestorMode = KernelMode;
  //填充IO堆栈
  pIOStack = IoGetNextIrpStackLocation( pIrp );
  pIOStack->MajorFunction = IRP_MJ_SET_INFORMATION;
  pIOStack->DeviceObject  = pFileDeviceObj;
  pIOStack->FileObject    = pFileObj;
  pIOStack->Parameters.SetFile.Length = sizeof( FILE_BASIC_INFORMATION );
  pIOStack->Parameters.SetFile.FileInformationClass = FileBasicInformation;
  pIOStack->Parameters.SetFile.FileObject = pFileObj;
 
  //设置IRP处理完成时调用的例程
  IoSetCompletionRoutine( pIrp, 
     IoCompletion,
     &Event,
     TRUE,
     TRUE,
     TRUE
     );
  //开始处理
  IoCallDriver( pFileDeviceObj, pIrp );
 
  //等待IRP处理完成
  KeWaitForSingleObject( &Event, Executive, KernelMode, TRUE, NULL );
  //-------------------开始删除文件-----------------------
  pIrp = IoAllocateIrp(pFileDeviceObj->StackSize, TRUE);
  FileDispostionInformation.DeleteFile = TRUE;
  //初始化事件对象
  KeInitializeEvent( &Event, SynchronizationEvent, FALSE );
  //填充IRP
  pIrp->AssociatedIrp.SystemBuffer = &FileDispostionInformation;
  pIrp->UserEvent = &Event;
  pIrp->UserIosb  = &IoStatus;
  pIrp->Tail.Overlay.OriginalFileObject = pFileObj;
  pIrp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
  pIrp->RequestorMode = KernelMode;
 
  //填充IO堆栈
  pIOStack = IoGetNextIrpStackLocation( pIrp );
  pIOStack->MajorFunction = IRP_MJ_SET_INFORMATION;
  pIOStack->DeviceObject  = pFileDeviceObj;
  pIOStack->FileObject    = pFileObj;
  pIOStack->Parameters.SetFile.Length = sizeof( FILE_DISPOSITION_INFORMATION );
  pIOStack->Parameters.SetFile.FileInformationClass = FileDispositionInformation;
  pIOStack->Parameters.SetFile.FileObject = pFileObj;
 
  //设置IRP处理完成时调用的例程
  IoSetCompletionRoutine( pIrp, 
   IoCompletion,
   &Event,
   TRUE,
   TRUE,
   TRUE
     );
 
  IoCallDriver( pFileDeviceObj, pIrp );
 
  KeWaitForSingleObject( &Event, Executive, KernelMode, TRUE, NULL );
  ObDereferenceObject( pFileObj );
 
  ZwClose( hFile );
 
  DbgPrint( "删除文件%ws成功!\n", lpFileName );
 }
 __except( 1 )
 {
  ObDereferenceObject( pFileObj );
  DbgPrint( "删除文件%ws失败!\n", lpFileName );
  return FALSE;
 }
 return TRUE;
}
NTSTATUS
DispatchDeviceControl(
    IN PDEVICE_OBJECT  DeviceObject,
    IN PIRP  Irp
       )
{
 PIO_STACK_LOCATION pIoStack = IoGetCurrentIrpStackLocation( Irp );
 ULONG uCtlCode   = pIoStack->Parameters.DeviceIoControl.IoControlCode;
 PVOID   pWChar     = Irp->AssociatedIrp.SystemBuffer;
 ULONG uInLength  = pIoStack->Parameters.DeviceIoControl.InputBufferLength;
 ULONG uOutLength = pIoStack->Parameters.DeviceIoControl.OutputBufferLength;
 PCWSTR  pFilePath;
 //NTSTATUS ntstatus;
 pFilePath = (PCWSTR)pWChar;
 DbgPrint( " DispatchDeviceControl\n " );
 switch ( uCtlCode )
 {
 case IOCTL_DELETE_FILE:
  {
   DbgPrint( " 接受命令成功\n " );
   DbgPrint( "FileName = %ws\n", pFilePath );
   //DbgPrint( "FileName = %ws\n", (PCSTR)pWChar  )
   SuperDeleteFile( pFilePath ); 
   break;
  }
 }
 Irp->IoStatus.Information = uOutLength;
 
 Irp->IoStatus.Status = STATUS_SUCCESS;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
//卸载驱动
VOID 
DriverUnload( 
   IN PDRIVER_OBJECT  DriverObject 
            )
{
 //删除符号连接
 UNICODE_STRING  UniDosLink;
 RtlInitUnicodeString( &UniDosLink, DOS_DEVICE_NAME );
 IoDeleteSymbolicLink( &UniDosLink );
 //删除设备
 IoDeleteDevice( DriverObject->DeviceObject );
 DbgPrint( "Driver Unload successfully!\n" );
}
// 驱动程序加载时调用DriverEntry例程
NTSTATUS 
DriverEntry(
  PDRIVER_OBJECT pDriverObj, 
  PUNICODE_STRING pRegistryString
    )
{
 NTSTATUS  ntStatus;
 UNICODE_STRING  UniNTDev;
 UNICODE_STRING  UniDosDev;
 PDEVICE_OBJECT  pDeviceObj;
 //初始化Unicode字符串
 RtlInitUnicodeString( &UniNTDev,  NT_DEVICE_NAME  );
 RtlInitUnicodeString( &UniDosDev, DOS_DEVICE_NAME );
 
 //分配例程
 pDriverObj->MajorFunction[IRP_MJ_CREATE]  = DispatchCreateClose;
 pDriverObj->MajorFunction[IRP_MJ_CLOSE]   = DispatchCreateClose;
 pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
 pDriverObj->DriverUnload = DriverUnload;
 //创建设备
 ntStatus = IoCreateDevice( pDriverObj,
     0,
     &UniNTDev,
     FILE_DEVICE_UNKNOWN,
     FILE_DEVICE_SECURE_OPEN,
     FALSE,
     &pDeviceObj
     );
 if ( !NT_SUCCESS( ntStatus ) )
 {
  DbgPrint( "创建设备失败!\n" );
  return ntStatus;
 }
 //创建符号连接
 ntStatus = IoCreateSymbolicLink( &UniDosDev, &UniNTDev );
 if ( !NT_SUCCESS( ntStatus ) )
 {
  DbgPrint( "创建符号连接失败!\n" );
  IoDeleteDevice( pDeviceObj );
  return ntStatus;
 }
 DbgPrint( "Driver load successfully!\n" );
 return STATUS_SUCCESS;
}
 
2009-1-20 18:59
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
楼上的代码

无法即时删除被占用文件
无法删除运行中文件
无法删除被HOOK保护的文件,例如FSD HOOK,FSD FILTER, 其他的API HOOK等

无用的过时垃圾
2009-1-20 19:11
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
目前看不到什么文件保护了,主要是重生。
2009-1-22 02:51
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
而且重生还他妈的改名重生...

貌似只能遇到一个,解决一个
2009-1-22 02:52
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
13
  用360的文件粉碎吧,包治百病。。
2009-1-22 15:40
0
雪    币: 205
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
最直接的方法:利用驱动(KMD等)进入RING0,如果你掌握了FAT32,NTFS,用IN/OUT操作。绝对适应任何情况,只不过太暴力,要小心哦!
2009-1-30 01:07
0
雪    币: 66
活跃值: (940)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15


这是qihoocom

不知道那个,360顽固文件删除工具是不是,你写的啊?

如果是qihoocom 写的,你问他就问对了。
2009-1-31 08:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
请问下ntfs下直接操作磁盘的话该怎么删除文件,,貌似我用WINHEX随便改都不起作用?我把INDX结构和MFT记录都清掉了..
2009-1-31 21:12
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
17
怎么不起作用?可能是缓存的影响吧,你重启下看看
2009-2-1 16:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
比如我建立一个文本文件,里面随便打些字符A,然后用WINHEX清掉IDNX记录及MFT记录,然后,到资源管理器里仍可以发现,,打开的话内容仍是A

这时,重启的话可以发现修改的INDX及MFT又被还原了

缓存的话应该如何处理呢?

有个叫EVERYTHING的软件,作用是快速查找NTFS分区的文件,大概就是用的缓存

不重启有没有什么办法呢?能不能直接改缓存呢?
2009-2-1 21:12
0
雪    币: 142
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我只能说这是个相当的大的程序
2009-2-1 21:38
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
wSYScheck方法,直接删除
2009-2-1 23:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
wsyscheck对于有的文件是删除不了的,比如NTFS下命名空间为posix的某些文件

例如名字是(UNICODE、十六进制):0X000D
等其他一些,但它们又确实是合法的。
2009-2-2 08:44
0
雪    币: 498
活跃值: (1552)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wxq
22
费尔托斯特安全   的   木马强力清除助手  是个非常强的工具
2009-2-13 13:12
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习下9楼的Driver.........
期待大牛们搞个摘HOOK 过锁定的代码
2009-2-13 19:01
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
直接磁盘操作是王道。
2009-2-14 00:19
0
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
留个名.
2009-2-20 19:01
0
游客
登录 | 注册 方可回帖
返回
//