过滤驱动加密文件(代码)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: <table class="table2 " cellspacing="2" cellpadding="5" width="100%"><tbody><tr><td class="td12"> <p>摘要:     我想做一个unlocker一样的程序,不管这个文件有没有被使用,先实现删除它。在查资料过程中,就知道了如果不访问磁盘扇区的话,除非写驱动才能做到。奈何时间有限,工作匆忙,

摘要:     我想做一个unlocker一样的程序,不管这个文件有没有被使用,先实现删除它。在查资料过程中,就知道了如果不访问磁盘扇区的话,除非写驱动才能做到。奈何时间有限,工作匆忙,一直没有完成。而且忽视了更简便的方法——在别的路径下把修改后的OCX控件重新注册一下就可以了。

    这些都不要说了,这段闲暇时间,我写了一个过滤加密,就这么简单。在DDK的示例Sfilter基础上改的。

 

文件过滤加密的源代码

 

//过滤读

NTSTATUS SfRead(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

{

  PIO_STACK_LOCATION    irp_stack; 

  BOOLEAN           is_crypt;

  NTSTATUS          status;

  PSFILTER_DEVICE_EXTENSION devExt;

 

  PAGED_CODE();

 

  ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ));

  ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

  devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

 

  if(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))

  {

    irp_stack = IoGetCurrentIrpStackLocation( Irp );

    is_crypt = IsMyCryptFile(irp_stack->FileObject);

 

    if(is_crypt) //是我的加密文件

    {

      //设置完成例程

      IoCopyCurrentIrpStackLocationToNext( Irp );

      IoSetCompletionRoutine(Irp, SfReadCompletion, 0, TRUE, FALSE, FALSE);

 

      //调用原来的驱动

      return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

    }

  }

 

  //非加密文件

  IoSkipCurrentIrpStackLocation(Irp);

  return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

}

 

//读操作的完成例程

NTSTATUS SfReadCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

{

  ULONG        length; //长度

  PUCHAR       buffer; //缓冲区

  ULONG        i;

  PIO_STACK_LOCATION irp_stack;  

 

  irp_stack = IoGetCurrentIrpStackLocation( Irp );

  ShowUnicodeString(&(irp_stack->FileObject->FileName));

  DbgPrint("SfReadCompletion 读文件解密");

 

  length = Irp->IoStatus.Information;

  buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

  for(i = 0; i < length; i++)

  {

    buffer[i] = buffer[i] - 17; //解密

  }

 

  return STATUS_SUCCESS;

}

 

//过滤写

NTSTATUS SfWrite(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

{

  PIO_STACK_LOCATION    irp_stack; 

  BOOLEAN           is_crypt;

  NTSTATUS          status;

  PSFILTER_DEVICE_EXTENSION devExt;

 

  PAGED_CODE();

 

  ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ));

  ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); 

  devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

 

  if(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))

  {

    irp_stack = IoGetCurrentIrpStackLocation( Irp );

    is_crypt = IsMyCryptFile(irp_stack->FileObject);

 

    if(is_crypt)

    {

      ULONG  length;       //长度

      PUCHAR buffer, buffer2;  //原来缓冲区和加密后缓冲区

      ULONG  i;

      PMDL   new_mdl;

 

      length = irp_stack->Parameters.Write.Length;

      buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

 

      //分配同样大小的空间

      buffer2 = (PUCHAR)ExAllocatePool(NonPagedPool, length);

 

      if(buffer2 != 0)

      {

        ShowUnicodeString(&(irp_stack->FileObject->FileName));

        DbgPrint("SfWrite 写文件加密");

 

        for(i = 0; i < length; i++)

        {

          buffer2[i] = buffer[i] + 17; //加密

        }

 

        //设置完成例程

        IoCopyCurrentIrpStackLocationToNext( Irp );

        IoSetCompletionRoutine(Irp, SfWriteCompletion, Irp->MdlAddress, TRUE, TRUE, TRUE);

       

        //替换成新的缓冲区

        new_mdl = IoAllocateMdl(buffer2, length, FALSE, TRUE, NULL);

        MmBuildMdlForNonPagedPool(new_mdl);

        Irp->MdlAddress = new_mdl;

 

        //调用原来的驱动

        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

      }

      else

      {

        ShowUnicodeString(&(irp_stack->FileObject->FileName));

        DbgPrint("SfWrite 写不能分配内存");

 

        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;

        Irp->IoStatus.Information = 0;

        IoCompleteRequest( Irp, IO_NO_INCREMENT );

        return Irp->IoStatus.Status;

      }

    }

  }

 

  //非加密文件

  IoSkipCurrentIrpStackLocation(Irp);

  return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

}

 

//写完成后就把分配的空间给删除掉

NTSTATUS SfWriteCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

{

  PMDL         old_mdl, new_mdl;

  PUCHAR       buffer2; //我分配的缓冲区

  PIO_STACK_LOCATION irp_stack;  

 

  irp_stack = IoGetCurrentIrpStackLocation( Irp );

  ShowUnicodeString(&(irp_stack->FileObject->FileName));

  DbgPrint("完成: SfWriteCompletion");

 

  new_mdl = Irp->MdlAddress;

  old_mdl = (PMDL)Context;

 

  //还是指向原来的缓冲区

  Irp->MdlAddress = old_mdl;

 

  //删除掉我分配的缓冲区

  buffer2 = MmGetSystemAddressForMdlSafe(new_mdl, NormalPagePriority);

 

  IoFreeMdl(new_mdl);

  ExFreePool(buffer2);

 

  return STATUS_SUCCESS;

}

 

//文件打开的时候调用

NTSTATUS SfCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

{

  NTSTATUS          status;

  PSFILTER_DEVICE_EXTENSION devExt;

 

  PAGED_CODE();

 

  //如果不是过滤驱动设备就退出

  if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))

  {

    Irp->IoStatus.Status = STATUS_SUCCESS;

    Irp->IoStatus.Information = 0;

    IoCompleteRequest( Irp, IO_NO_INCREMENT );

    return STATUS_SUCCESS;

  }

 

  ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

  devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

 

  //设置完成例程

  IoCopyCurrentIrpStackLocationToNext( Irp );

  IoSetCompletionRoutine(Irp, SfCreateCompletion, 0, TRUE, FALSE, FALSE);

 

  //调用原来的驱动

  return IoCallDriver( devExt->AttachedToDeviceObject, Irp );

}

 

//在打开文件的完成例程中记录文件对象

NTSTATUS SfCreateCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

{

  PIO_STACK_LOCATION irp_stack;

  PFILE_OBJECT     file_obj;

  BOOLEAN      is_crypt;

 

  irp_stack = IoGetCurrentIrpStackLocation(Irp);

  file_obj = irp_stack->FileObject;

  is_crypt = IsMyCryptFile(file_obj);

 

  if(is_crypt)

  {

    if(CcIsFileCached(file_obj))

    {

      ShowUnicodeString(&(file_obj->FileName));

      DbgPrint("打开时清除缓存 \n");

      CcPurgeCacheSection(file_obj->SectionObjectPointer, 0, 0, FALSE);

    }

  }

  return STATUS_SUCCESS;

}

 

//关闭文件后的清理工作

NTSTATUS SfCleanupClose(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

{

  NTSTATUS          status;

  PSFILTER_DEVICE_EXTENSION devExt;

  PIO_STACK_LOCATION    irp_stack;

  PFILE_OBJECT        file_obj;

  BOOLEAN           is_crypt;

 

  PAGED_CODE();

 

  if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))

  {

    Irp->IoStatus.Status = STATUS_SUCCESS;

    Irp->IoStatus.Information = 0;

    IoCompleteRequest( Irp, IO_NO_INCREMENT );

    return STATUS_SUCCESS;

  }

 

  ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

 

  irp_stack = IoGetCurrentIrpStackLocation(Irp);

  file_obj = irp_stack->FileObject;

  is_crypt = IsMyCryptFile(file_obj);

 

  if(is_crypt)

  {

    if(CcIsFileCached(file_obj))

    {

      ShowUnicodeString(&(file_obj->FileName));

      DbgPrint("关闭时清除缓存 \n");

      CcPurgeCacheSection(file_obj->SectionObjectPointer, 0, 0, FALSE);

    }

  }

 

  IoSkipCurrentIrpStackLocation( Irp );

  devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

  return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

}

 

开始写的时候,我本想保持保持缓冲区的数据同磁盘上一样,也是密文,这样就不用清理缓冲区了。但是试验没能成功,因为程序要是按照内存文件映射的方法或者DMA的方法读写缓冲区,我找不到机会解密。

相关文章
|
16天前
|
数据安全/隐私保护 Python
用python对文件内容进行加密的2种方式
这篇文章介绍了使用Python对文件内容进行加密的两种方式:利用`cryptography`库的Fernet对称加密和使用`rsa`库进行RSA非对称加密。
36 6
|
2天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
20 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
12天前
|
人工智能 IDE 开发工具
Python实行任意文件的加密—解密
Python实行任意文件的加密—解密
23 2
|
13天前
|
人工智能 IDE 开发工具
Python实行任意文件的加密—解密
Python实行任意文件的加密—解密
25 1
|
29天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
61 8
|
1天前
|
IDE 开发工具 数据安全/隐私保护
Python编程实现批量md5加密pdf文件
Python编程实现批量md5加密pdf文件
|
2月前
|
Ubuntu Linux 数据安全/隐私保护
使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用
本文介绍了在Linux系统(Ubuntu 18.04)下将Python源代码(`.py文件`)加密为`.so文件`的方法。首先安装必要的工具如`python3-dev`、`gcc`和`Cython`。然后通过`setup.py`脚本使用Cython将`.py文件`转化为`.so文件`,从而实现源代码的加密保护。文中详细描述了从编写源代码到生成及调用`.so文件`的具体步骤。此方法相较于转化为`.pyc文件`提供了更高的安全性。
44 2
|
2月前
|
安全 Java Shell
"SpringBoot防窥秘籍大公开!ProGuard混淆+xjar加密,让你的代码穿上隐形斗篷,黑客也无奈!"
【8月更文挑战第11天】开发SpringBoot应用时,保护代码免遭反编译至关重要。本文介绍如何运用ProGuard和xjar强化安全性。ProGuard能混淆代码,去除未使用的部分,压缩字节码,使反编译困难。需配置ProGuard规则文件并处理jar包。xjar则进一步加密jar包内容,即使被解压也无法直接读取。结合使用这两种工具可显著提高代码安全性,有效保护商业机密及知识产权。
215 3
|
2月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
40 0
|
2月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【8月更文挑战第2天】数据安全至关重要,AES加密作为对称加密的标准之一,因其高效性与灵活性被广泛采用。本文通过实战演示Python中AES的应用,使用pycryptodome库进行安装及加密操作。示例代码展示了生成随机密钥与初始化向量(IV)、对数据进行加密及解密的过程。注意事项包括密钥管理和IV的随机性,以及加密模式的选择。掌握AES加密能有效保护敏感数据,确保信息安全无虞。
59 6