首页
社区
课程
招聘
[原创]基于diskperf写了一个U盘控制程序
2013-4-3 20:54 9792

[原创]基于diskperf写了一个U盘控制程序

2013-4-3 20:54
9792
  之前见到过一款系统,可以实现对U盘的访问控制,只有注册过的U盘才能正常使用,否则会提示  请将磁盘插入驱动器...  

    简单用IDA膜拜了一下它的一个驱动,貌似是从diskperf上修改的,就想着模仿一下它的功能,因为其工作比较复杂,不止一个驱动,所以打算简单实现功能即可。。。没加多少代码,高手飘过~~
  
  曾经在一个群里问过怎么才能实现  弹出 请将磁盘插入驱动器  这个对话框,估计问题太2,没人摆我,于是就在IDA里翻啊翻,在其   ReadWriteDispatch 翻到这么一段代码:(感谢F5插件,要不我等水货肯定头大)
  
  
if ( pDeviceObject == DeviceObject )          // xxx的  FDO
  {
      status = 0xC0000010u;     // STATUS_INVALID_DEVICE_REQUEST
  LABEL_3:
      Irp->IoStatus.Status = status;
      returnValue = status;
  LABEL_44:
      Irp->IoStatus.Information = 0;
      IofCompleteRequest(Irp, 0);
      return returnValue;
  }

  想着也许就是这个  STATUS_INVALID_DEVICE_REQUEST 起了作用,该怎么测试呢?自己修改diskperf试试不就完了嘛,开工。
  
1、 尝试在 DiskPerfReadWrite 里面返回 STATUS_INVALID_DEVICE_REQUEST,直接返回肯定不行了,要不系统都起不来,仅仅在插入U盘时返回即可,怎么判断呢?
   
    看看设备栈:
  > 81fe2a30  \Driver\xxxxxx       81fe2ae8  
    81fe2c40  \Driver\PartMgr      81fe2cf8  
    82051ab8  \Driver\Disk         82051b70  DR4                U盘
    81fd3d40  \Driver\USBSTOR      81fd3df8  00000087           USBSTOR

看来只要判断最下面的设备所属驱动是不是USBSTOR就行了,如下(XP   SP3 硬编码):

//也可以在AddDevice里面保存最底层的设备
   
RealDevice=*(ULONG*)(*(ULONG*)((ULONG)DeviceObject+0xb0)+0x18);  //AttachedTo     XP SP3
    RealDevice=*(ULONG*)(*(ULONG*)((ULONG)RealDevice+0xb0)+0x18);    //AttachedTo
    UsbStorDevice=*(ULONG*)(*(ULONG*)((ULONG)RealDevice+0xb0)+0x18); //AttachedTo
    UsbStorDriverObj=UsbStorDevice->DriverObject;
    ObQueryNameString(UsbStorDriverObj,pDeviceName,512,&uactLength);
    //DbgPrint("驱动对象:%x    驱动名称:%wZ\n",UsbStorDriverObj,pDeviceName);

    RtlInitUnicodeString(&CompareString,L"\\Driver\\USBSTOR");
    if(RtlCompareUnicodeString(&CompareString,pDeviceName,FALSE))
    {
	    ;
    }
    else
    {
	    DbgPrint("访问移动分区\n");
		DbgPrint("禁止访问\n");
	    status=STATUS_DEVICE_NOT_READY;
	    
	    Irp->IoStatus.Status = status;
		
		Irp->IoStatus.Information = 0;
		IofCompleteRequest(Irp, 0);
		return status;
    }

    这样就行啦,丢进虚拟机里试了一下,还真的可以,哈哈~~

2、接下来就该考虑如何实现认证U盘的正常使用了,那个xxx系统制作的U盘丢在普通电脑上显示未格式化,应该是对MBR(DBR)动了手脚,那咱也试试呗
   
   用WinHex修改U盘的DBR,对NTFS文件系统我修改的是 'NTFS' 标志为  0x1b 0x01 0x13 0x06 在DiskPerfReadWrite 调用 FltReadSectors 读取DBR,判断DBR的标志,如果是加密标志,
   
   则调用 FltWriteSectors 改写DBR为正常,这样就能正常识别了,测试可行。
   
   那么,标志还得改回去啊,要不插在普通电脑上也能识别了~~什么时候改呢?

   一开始加了个计数器,每访问一次就加一,对NTFS文件系统测试发现,在识别文件系统后再修改DBR是可以的,不影响文件操作,但FAT32会将DBR修改回去。。。
   
   结果发现不好使,不能精确确定计数器的值,使得在此之后修改DBR不影响文件访问~~~看了看diskperf,想到可以在U盘安全卸载的时候写入啊(作为测试,不考虑强制拔出的情况了)

   于是在 DiskPerfRemoveDevice 加入了回写标志的代码,之后开始测试,然后就郁闷了,在盘符上点击弹出,FltWriteSectors会返回写入磁盘错误,因为磁盘无效,上群里问啊,各种没人摆啊

   去看雪发帖问啊,感谢   ITSailor   作了回答和测试,虽然没解决原因~~~后来发现点击右下角的  安全弹出硬件却能正常,可能是 两种弹出方式有一些差别,还望知道的给个解释,调试能力不行~~~搞不定啊
   这是第一个版本,只要选择安全弹出,就能正常使用。。。

3、既然第一个版本可以了,就该思考一下怎么在强制拔出的情况下也能正常使用的问题了,换个思路想想,其实只要让文件系统识别器和文件系统看到的是正常的DBR数据就行了,那么可以在

   在DiskPerfReadWrite上做手脚啊,考虑了一下,判断读请求的  偏移和大小,如果是读DBR,就设置一个完成函数,在完成函数里修改返回的数据为正常的DBR不就行了
,经过测试,仅判断偏移

   是否为0即可,这是第二个版本,个人认为功能比较健全了,呵呵(具体处理细节见代码。。。)

   由于仅仅做个测试,修改DBR标志这种强度是远远不够的,有兴趣的可以在这上面增加功能,例如动态的标志,交互服务进程实现动态配置等。。。

   马上工作了,工作以后估计很难摸到电脑,破事很多,就做到这个程度吧~~
   
   附件里是两个版本的代码(IRP HOOK就是个鸡肋,在系统启动的时候被自动修复了貌似)和bin,还包含一个制作认证U盘的  控制台程序(要在不装这个驱动的电脑上运行)。   

PS:原系统不是这么做的,貌似还有一个文件过滤驱动,还没研究。。。

欢迎交流,羡慕每天有代码敲的................

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞3
打赏
分享
最新回复 (14)
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2013-4-3 22:57
2
0
破解这些XX程序一向很有动力~
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2013-4-3 22:58
3
0
话说,人家在普通电脑上显示未格式化的真正原因是。。。。透明加密~~
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-3 23:37
4
0
这个还真没想到啊~~不过破解来讲,方法太多了,直接IRP HOOK都够了,黑月教主的摘除方法就显得繁琐了~ 俺甚至想到了装一个USB转串口驱动,接个单片机,挂个U盘读写模块了事,不过没实际制作,懒了~~膜拜achillis
雪    币: 51
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
西风X 2013-4-4 06:51
5
0
鞋子分享。。。
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wrgg 2013-4-4 08:22
6
0
学习了。。。IRP
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-4 09:33
7
0
我没拿到过这种U盘,不过听有人说只是在U盘的某个偏移处写了一个标志啊~~
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-8 00:28
8
0
居然没发现 achillis 就是黑月教主~~
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ITSailor 2013-4-8 10:34
9
0
    抱歉,你跟我说的安全弹出,我一直以为是托盘的安全弹出,这个跟在盘符右击的弹出有差别。托盘的弹出是设备弹出,也就是移除设备,PNP管理器发的IRP应该是IRP_MN_REMOVE_DEVICE,盘符右键的弹出是设备里媒介的弹出(可以想象是光驱里的光盘),发的IRP应该是IOCTL_STORAGE_EJECT_MEDIA,区别你也看到了吧,前者是移除Device,后者移除Media。

    至于强制拔出的问题,之前你也没告诉我你的需求,刚看到你的需求。其实没有必要在DiskPerfReadWrite 读DBR的时候去Write会正确的标识,你可以再DiskPerfReadWrite 读DBR的时候,直接修改读完后的缓冲区,把你的标识改回来,这样就算强制移除,U盘的数据一样不会有变化。
    普通系统下,U盘显示请将磁盘插入驱动器,的问题,这个跟文件系统有关,如果你的盘被raw识别,那么只会弹出未格式化对话框,所以你需要做个手脚,让NTFS或FAT文件系统识别你的盘,但又让他们觉得在某些参数上有问题(比如大小),让他们无法正常操作,这个时候就访问盘的时候,文件系统就会报错,由于文件系统已经挂载了,当然不会弹出未格式化框了。你想想,“请将磁盘插入驱动器”,像不像把软盘插入软驱的提示呢?这里的磁盘和驱动器的关系像不像前面提到到Media和Device的关系呢?
雪    币: 298
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tedrick 2013-4-8 23:17
10
0
嗯,某涉密信息管理系统就是~07年逆向时分析过。应该算是方便管理权限的漏洞。而受限U盘是全盘加密的。同时固定格式文档也被接口加密。
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-9 21:25
11
0
感谢ITSailor关于弹出的解释~不知道你是怎么知道的啊?调试出来的么?

另外,可能我没说清楚,我在设置的 完成例程里面 就是修改的缓冲区,而没有回写数据到U盘,嘿嘿~~非常感谢!
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-9 21:32
12
0
全盘加密的话,应该是文件过滤驱动的事吧?为什么只XX了磁盘过滤驱动就能正常使用 非特定U盘呢?  或许是版本不一样?
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
elapseyear 2013-4-11 16:15
13
0
读卷的头格式,再解析也可以吧.研究过,但没有具体实现.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oneatree 2013-4-16 13:02
14
0
全盘加密的话,应该是文件过滤驱动的事吧?为什么只XX了磁盘过滤驱动就能正常使用 非特定U盘呢?  或许是版本不一样?
雪    币: 860
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-4-16 21:34
15
0
为毛copy我的回复,骚年?
游客
登录 | 注册 方可回帖
返回