首页
社区
课程
招聘
[原创]IRP Function Hook
发表于: 2008-11-19 23:16 8678

[原创]IRP Function Hook

2008-11-19 23:16
8678
大虾们可以飘过~

  相信各位都玩过HOOK,就不多说了。

  下午看了一大虾写的RootKit专题,提到IRP HOOK ,于是小菜我试了一下其中的法3. 

http://bbs.pediy.com/showthread.php?t=60022

   具体见代码,我只是HOOK 了 IRP_MJ_DEVICECONTROL 很简单~ 

   只说自己遇到的一个问题,虽不普遍但说出来我爽下 

   在安装我的驱动的时候,发现老是返回STATUS_ACCESS_DENIED,郁闷,遂翻开WRK查查函数IoGetDeviceObjectPointer,应该是在NtOpenFile处返回了这个拒绝…………

  就是我打开的驱动没有设置共享,IoCreateDevice的Exclusive应该是当初被设置成TRUE了(的确就是这样的 呵呵 因为这个驱动就是我写的~~),不过还好,一般都是设置成FALSE的,否则驱动就被独占了。
FROM MSDN:Most drivers set this value to FALSE.

下面提供相关CODE,请斧正(大菜鸟以上飘过):

#include "ntddk.h"


typedef NTSTATUS (_stdcall *fnDevIoControl)(PDEVICE_OBJECT pdev,PIRP pIrp);
fnDevIoContro RealDevIoControl;


NTSTATUS HookDevIoControl(PDEVICE_OBJECT pdev,PIRP pIrp)
{
  KdPrint(("被我Hook了  哈哈哈哈哈哈哈哈哈啊哈哈哈 \n"));
  
  return RealDevIoControl(pdev,pIrp);

}

//注意这里我没有恢复HOOK
VOID Unload(IN PDRIVER_OBJECT DriverObject)
{
  PDEVICE_OBJECT pDevObj;
  UNICODE_STRING sysLinkName;


  RtlInitUnicodeString(&sysLinkName,L"\\??\\Fuck");

  KdPrint(("==>DriverUnload……\n"));

  pDevObj=DriverObject->DeviceObject;


  KdPrint(("删除符号链接……\n"));
  IoDeleteSymbolicLink(&sysLinkName);




  KdPrint(("删除CDO……\n"));
  IoDeleteDevice(pDevObj);



  KdPrint(("<==DriverUnload……\n"));

}

NTSTATUS  DriverEntry(IN PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
  NTSTATUS ststus;
  UNICODE_STRING devName;
  UNICODE_STRING linkName;
  PDEVICE_OBJECT pdevObj,fuckdevObj;
  PFILE_OBJECT fuckfileObj;
  UNICODE_STRING fuckName;

  ULONG uAddr=0;
  ULONG MJEntry=0;
  ULONG IRP_Mj_Create=0;
  ULONG IRP_Mj_DeviceIoControl=0;


  //完成一些工作先,当然就这个程序而言,不需要创建设备及链接
  RtlInitUnicodeString(&devName,L"\\Device\\Fuck");

  KdPrint(("==>DriverEntry\n"));

  DriverObject->DriverUnload=Unload;


  ststus=IoCreateDevice(DriverObject,0,&devName,FILE_DEVICE_UNKNOWN,0,TRUE,&pdevObj);

  if (!NT_SUCCESS(ststus))
  {
    return ststus;
  }

  DriverObject->Flags|= DO_BUFFERED_IO;


  RtlInitUnicodeString(&linkName,L"\\??\\Fuck");

  ststus=IoCreateSymbolicLink(&linkName,&devName);
  if (!NT_SUCCESS(ststus))
  {
    IoDeleteDevice(pdevObj);
    return ststus;
  }

  KdPrint(("Now Fuck^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"));

  RtlInitUnicodeString(&fuckName,L"\\Device\\mySSDT");//这个mySSDT是我们HOOK的对象,具体设备名可以用DDK自带的DeviceTree看看

  _try
  {
    ststus=IoGetDeviceObjectPointer(&fuckName,FILE_ALL_ACCESS,&fuckfileObj,&fuckdevObj);
    if (!NT_SUCCESS(ststus))
    {
      KdPrint(("Fuck Failure!IoGetDeviceObjectPointer status Failure\n"));
      KdPrint(("status : %x\n",ststus));
      return STATUS_SUCCESS;
    }

    KdPrint(("Fuck SUCCESS! fuckdevObj: %x\n",fuckdevObj));

    //delete the object ~
//     KdPrint(("delete the object ~\n"));
// 
//     IoDeleteDevice(fuckdevObj);
//     KdPrint(("delete the object OK ~\n"));
    KdPrint(("MajorFunction: %x\n",*(ULONG*)((ULONG)fuckdevObj+0x8)+0x38));   //可以不用硬编码,直接用结构体,是有导出的,见WinDBG

    uAddr=(ULONG)fuckdevObj;
    uAddr+=0x8;
    uAddr=*(ULONG*)uAddr;
    uAddr+=0x38;

    MJEntry=uAddr;

    IRP_Mj_Create=*(ULONG*)MJEntry;
    KdPrint(("IRP_MJ_CREATE: %x\n",IRP_Mj_Create));


    
        IRP_Mj_DeviceIoControl=*(ULONG*)(MJEntry+0x0e*4);
    RealDevIoControl=(fnDevIoContro)IRP_Mj_DeviceIoControl;
        *(ULONG*)(MJEntry+0x0e*4)=(ULONG)HookDevIoControl;
    KdPrint(("IRP_Mj_DeviceIoControl %x\n",IRP_Mj_DeviceIoControl));
        KdPrint(("IRP_Mj_DeviceIoControl Hook %x\n",HookDevIoControl));
    

  }
  _except(EXCEPTION_EXECUTE_HANDLER)
  {
    KdPrint(("Fuck Failure!IoGetDeviceObjectPointer Failure\n"));
  }

  KdPrint(("<==DriverEntry\n"));

  return ststus;

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
不错~Address Hook简单好用
2008-11-20 09:17
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
看了看
就是替换dispatch function了
2008-11-20 09:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
KdPrint(("MajorFunction: %x\n",*(ULONG*)((ULONG)fuckdevObj+0x8)+0x38));

是加0x8? 应该是8个字节吧, 前面是ULONG,加0x02吧?
2008-11-22 21:47
0
雪    币: 167
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
不是滴~

直接加上8个字节。

前面如果是PULONG 才是加0x02~不知道说的对不对,你可以试试,不过我上面的肯定是准确的~
2008-11-23 10:26
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ls正解,ULONG不是指针
2008-11-23 17:46
0
雪    币: 132
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
提个建议,是不是可以把错别字FUCK改成HOOK?
2009-4-29 17:23
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
8
我记得开始学驱动的时候这种东西很难找...还inline hook 未导出的.XX..
2009-4-29 17:55
0
游客
登录 | 注册 方可回帖
返回
//