龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4980|回复: 0

关于拦截“通过WMI读取硬件序列号”的一些心得

[复制链接]

20

主题

1

回帖

31

积分

编程入门

Rank: 1

龙马币
96

        大家都知道,WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机,在这里只讨论它的硬件信息管理功能。

      所有硬件设备的信息要能被WMI收集,其编写的驱动程序必须符合WMI规范,即WMI相当于这些硬件信息的管理员。通过IRPTrace这个工具可以很方便看到,当ring3有读取硬件序列号的动作,传到ring0层是这样:WMIDataDevice内核设备会收到一个名叫IRP_MJ_SYSTEM_CONTROL的通知,当然该通知还会附加着一个类似于IRP_MN_QUERY_ALL_DATA的通知。只要有一定驱动编程基础的人都知道,该通知会层层传递下去,得到结果后返回上来。

      所以,我的拦截思路很简单,编写一个过滤驱动设备,附载在WMIDataDevice内核设备上,我的过滤驱动只对IRP_MJ_SYSTEM_CONTROL进行过滤:

  1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING RegistryPath)
  2. {
  3. .................
  4.      for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
  5.         DriverObject->MajorFunction[i] = LS2capDispatchGeneral;
  6.     }

  7.     // Our read function is where we do our real work.
  8.     DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = LS2DispatchSystemControl;
  9.     return LS2capInit( DriverObject );
  10. }
复制代码


然后再设置完成例程,目的是等该通知取到序列号后可以拦截并任意修改序列号。
主要就是编写
  1. NTSTATUS  LS2DispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  2. {
  3. ....
  4. }
复制代码


例程。
代码如下:
  1. NTSTATUS  LS2DispatchSystemControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
  2. {
  3.     //PAGED_CODE();
  4.     PIO_STACK_LOCATION  currentIrpStack;
  5.     PIO_STACK_LOCATION  nextIrpStack;
  6.         NTSTATUS status ;
  7.     PDEVICE_EXTENSION   devExt;
  8.     UCHAR minorFunc;
  9.     PIO_STACK_LOCATION        IrpSp;
  10.         char teststr2[34]="IRP_MN_QUERY_ALL_DATA";
  11.         char teststr3[34]="IRP_MN_QUERY_SINGLE_INSTANCE";
  12.         char teststr0[34]="NOTHING";
  13.     IrpSp = IoGetCurrentIrpStackLocation( Irp );
  14.         devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
  15.         status = STATUS_SUCCESS ;

  16.     minorFunc = IrpSp->MinorFunction;
  17.         switch(minorFunc)
  18.         {
  19.         case IRP_MN_QUERY_ALL_DATA:
  20.                 devExt->controlcode=2;
  21.                 currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
  22.         nextIrpStack = IoGetNextIrpStackLocation(Irp);   
  23.         *nextIrpStack = *currentIrpStack;
  24.         IoSetCompletionRoutine( Irp, Ctrl2capWMIComplete,
  25.                                 DeviceObject, TRUE, TRUE, TRUE );

  26.             WriteFileTest(teststr2,34);
  27.                 break;
  28.         case IRP_MN_QUERY_SINGLE_INSTANCE:
  29.                 devExt->controlcode=3;
  30.                 currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
  31.         nextIrpStack = IoGetNextIrpStackLocation(Irp);   
  32.         *nextIrpStack = *currentIrpStack;
  33.         IoSetCompletionRoutine( Irp, Ctrl2capWMIComplete,
  34.                                 DeviceObject, TRUE, TRUE, TRUE );

  35.             WriteFileTest(teststr3,34);
  36.                 break;
  37.         case IRP_MN_REGINFO:
  38.         case IRP_MN_REGINFO_EX:
  39.         case IRP_MN_CHANGE_SINGLE_INSTANCE:
  40.         case IRP_MN_CHANGE_SINGLE_ITEM:
  41.         case IRP_MN_EXECUTE_METHOD:
  42.         case IRP_MN_DISABLE_EVENTS:
  43.         case IRP_MN_ENABLE_COLLECTION:
  44.         case IRP_MN_DISABLE_COLLECTION:
  45.         case IRP_MN_ENABLE_EVENTS:
  46.         default:
  47.        #if WIN2K
  48.            IoSkipCurrentIrpStackLocation(Irp);
  49.        #else // WIN2K
  50.        //
  51.        // This is the equivalent of the IoSkipCurrentIrpStackLocation macro,
  52.        // which doesn't exist in the NT 4 DDK.
  53.        //
  54.            Irp->CurrentLocation++;
  55.            Irp->Tail.Overlay.CurrentStackLocation++;
  56.        #endif // WIN2K
  57.                    WriteFileTest(teststr0,34);
  58.            return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->TopOfStack, Irp);
  59.                    break;
  60.         }
  61.         // 完成IRP
  62.         /*
  63.         Irp->IoStatus.Status = status;
  64.         Irp->IoStatus.Information = 0;                           // bytes xfered
  65.         IoCompleteRequest( Irp, IO_NO_INCREMENT );             //结束IRP请求,即不再往下传递

  66.     return status;
  67.     */
  68.         return IoCallDriver( devExt->TopOfStack, Irp );
  69. }
复制代码


为了方便检测是否过滤成功,可以创建一个文本文件,并往里写入标记。本人已实现对硬盘,主板,MAC地址等读取拦截。主要思路和代码就是这些,请各位多多指教。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表