紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8274|回复: 9

TP的学习笔记:实现在Win64上的MBR保护工具(无需关闭PatchGuard!)

  [复制链接]

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2015-8-15 21:49:07 | 显示全部楼层 |阅读模式
记得前天我发了一个关于制作一个MBR保护器的帖子,只不过那个是在Win32下可用的,在Win64下不可用。现在,就来制作一个基于x64的MBR保护器。
32位MBR保护器的帖子地址:http://www.m5home.com/bbs/forum.php?mod=viewthread&tid=8573&_dsign=9b6ec8f9
由于在Win64上有PatchGuard,我们不能搞Hook SSDT之类的事情,所以,在x64上是不能搞上次那个初级保护版的了。而这一次,我们把目光投到上一次的高级保护上面。上一次的高级保护,是指Hook Disk.sys的IRP_MJ_READ和IRP_MJ_WRITE两个例程实现防止读写MBR,这一次我们同样要Hook这两个例程。
可能会有人问,不是有PatchGuard吗?搞Disk Hook真的不会蓝屏吗?事实上,的确不会蓝屏。PatchGuard只会管ntkrnlpa.exe,hal.dll,ndis.sys之类的。而这个分发例程所在的classpnp.sys不管这玩意。
其实说句实话,这份代码和32位版的差别并不大。
先是挂钩和恢复例程
  1. void StartHook()
  2. {
  3.         NTSTATUS st;
  4.         UNICODE_STRING uniDiskName;
  5.         RtlInitUnicodeString(&uniDiskName,L"\\Driver\\Disk");
  6.         st=ObReferenceObjectByName(&uniDiskName,OBJ_CASE_INSENSITIVE,0,0,*IoDriverObjectType,KernelMode,0,&DiskDrvObj);
  7.         if(NT_SUCCESS(st))
  8.         {
  9.                 IrpMjRead=(IRP_MJ_SERIES)InterlockedExchangePointer(&DiskDrvObj->MajorFunction[IRP_MJ_READ],fake_IrpMjRead);
  10.                 IrpMjWrite=(IRP_MJ_SERIES)InterlockedExchangePointer(&DiskDrvObj->MajorFunction[IRP_MJ_WRITE],fake_IrpMjWrite);
  11.                 IsHooked=TRUE;
  12.         }
  13. }

  14. void StopHook()
  15. {
  16.         InterlockedExchangePointer(&DiskDrvObj->MajorFunction[IRP_MJ_READ],IrpMjRead);
  17.         InterlockedExchangePointer(&DiskDrvObj->MajorFunction[IRP_MJ_WRITE],IrpMjWrite);
  18.         ObDereferenceObject(DiskDrvObj);
  19.         IsHooked=FALSE;
  20. }
复制代码

接着就是过滤用的伪例程
  1. NTSTATUS fake_IrpMjWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
  2. {
  3.         NTSTATUS status = STATUS_SUCCESS;
  4.         IO_STACK_LOCATION  *irpsp= IoGetCurrentIrpStackLocation(Irp);
  5.         LARGE_INTEGER WriteOffsetInBytes= irpsp->Parameters.Write.ByteOffset;
  6.         ULONG64 writeLength = irpsp->Parameters.Write.Length;
  7.         LARGE_INTEGER Sectionpos={0};
  8.         ULONG64 SectorRange;
  9.         BOOLEAN IsDeniedAccess = FALSE;
  10.         do
  11.         {
  12.                 Sectionpos.HighPart = 0;
  13.                 Sectionpos.LowPart = 0x200;
  14.                 SectorRange= WriteOffsetInBytes.QuadPart/Sectionpos.QuadPart;
  15.                 if(SectorRange==0 && DeviceObject->DeviceType==FILE_DEVICE_DISK)
  16.                 {
  17.                         IsDeniedAccess =TRUE;
  18.                         break;
  19.                 }
  20.         }while(0);
  21.         if (IsDeniedAccess)
  22.         {
  23.                 Irp->IoStatus.Information=writeLength;
  24.                 Irp->IoStatus.Status=STATUS_ACCESS_DENIED;
  25.                 IoCompleteRequest(Irp,IO_NO_INCREMENT);
  26.                 status=STATUS_ACCESS_DENIED;
  27.         }
  28.         else
  29.         {
  30.                 status=IrpMjWrite(DeviceObject,Irp);
  31.         }
  32.         return status;
  33. }

  34. NTSTATUS fake_IrpMjRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
  35. {
  36.         NTSTATUS status = STATUS_SUCCESS;
  37.         IO_STACK_LOCATION  *irpsp= IoGetCurrentIrpStackLocation(Irp);
  38.         LARGE_INTEGER ReadOffsetInBytes= irpsp->Parameters.Read.ByteOffset;
  39.         ULONG64 readLength = irpsp->Parameters.Write.Length;
  40.         LARGE_INTEGER Sectionpos={0};
  41.         ULONG64 SectorRange;
  42.         BOOLEAN IsDeniedAccess = FALSE;
  43.         do
  44.         {
  45.                 Sectionpos.HighPart = 0;
  46.                 Sectionpos.LowPart = 0x200;
  47.                 SectorRange= ReadOffsetInBytes.QuadPart/Sectionpos.QuadPart;
  48.                 if(SectorRange==0 && DeviceObject->DeviceType==FILE_DEVICE_DISK)
  49.                 {
  50.                         IsDeniedAccess =TRUE;
  51.                         break;
  52.                 }
  53.         }while(0);
  54.         if (IsDeniedAccess)
  55.         {
  56.                 Irp->IoStatus.Information=readLength;
  57.                 Irp->IoStatus.Status=STATUS_ACCESS_DENIED;
  58.                 IoCompleteRequest(Irp,IO_NO_INCREMENT);
  59.                 status=STATUS_ACCESS_DENIED;
  60.         }
  61.         else
  62.         {
  63.                 status=IrpMjWrite(DeviceObject,Irp);
  64.         }
  65.         return status;
  66. }
复制代码

编译的时候要选择用x64 Checked Build Environment,注意别选到ia64或者x86上面去了!如图所示:

编译选项

编译选项

经测试,MBR读写器无法实现读写MBR。如图所示:

测试效果

测试效果

p.s:本文附带的附件,其附件描述摘自Hovi.Delphic的帖子,由于TP的学习笔记系列是安利给大家的,所以既不设置阅读权限,也不设置水晶币
此外顺带在附件里加了有数字签名版和无数字签名版。我测试的时候是关了DSE用无签名版测试的。。。

ProtMBRx64.zip

228.48 KB, 下载次数: 4229

下载代码不回帖是一种很欠扁的行为

评分

参与人数 1水晶币 +60 收起 理由
Tesla.Angela + 60 山寨

查看全部评分

854

主题

3481

帖子

2

精华

管理员

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

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2015-8-15 22:55:36 | 显示全部楼层
不错。不过,这句代码不需要用ULONG64。
  1. ULONG64 readLength = irpsp->Parameters.Write.Length;
复制代码

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
 楼主| 发表于 2015-8-15 23:29:39 | 显示全部楼层
好像是这么回事啊。。。不过“山寨”是个什么情况。。。

8

主题

77

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3279
发表于 2015-8-17 00:25:26 | 显示全部楼层
顶一下,太深奥了,代码我就不要了.也看不懂

0

主题

52

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
3863
发表于 2016-1-26 00:46:53 | 显示全部楼层
谢谢

0

主题

31

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
180
发表于 2016-1-26 14:27:32 | 显示全部楼层
顶一下

0

主题

49

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
137
发表于 2016-2-19 09:31:25 | 显示全部楼层
谢楼主分享。。。。。。

3

主题

58

帖子

0

精华

铂金会员

Rank: 5

积分
2015
发表于 2016-4-20 12:01:11 来自手机 | 显示全部楼层
谢谢分享,

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
 楼主| 发表于 2016-5-6 22:35:07 | 显示全部楼层
简单更新了一下,把驱动的Checked编译模式改成了Free,顺带加了数字签名,调用者改成默认以Admin权限执行,这下不必关闭DSE了。

ProtMBRx64.zip

183.7 KB, 下载次数: 3616

下载代码不回帖是一种很欠扁的行为

0

主题

6

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
42
发表于 2018-7-29 16:37:29 | 显示全部楼层
顶一下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-19 04:12 , Processed in 0.030928 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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