首页
社区
课程
招聘
[原创]Windows内核漏洞初探
发表于: 2015-12-12 00:20 5321

[原创]Windows内核漏洞初探

2015-12-12 00:20
5321
/********************************************************************
  时间:    2015/9/11
  文件:     helloworld.c
  作者:    Netfairy
*********************************************************************/
#include <NTDDK.h>
//创建的设备对象指针
PDEVICE_OBJECT p_DeviceObject;

//驱动卸载函数
VOID DriverUnload( IN PDRIVER_OBJECT  driverObject )
{
  //什么都不做,只是打印一句话
  KdPrint(("驱动卸载,再见!\n"));
} 

//驱动派遣例程函数
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT driverObject,IN PIRP pIrp)
{ 
  
  //设置IRP状态
  pIrp->IoStatus.Status=STATUS_SUCCESS;

  //设置IRP操作字节数
  pIrp->IoStatus.Information=0;

  //完成IRP的处理
  IoCompleteRequest(pIrp,IO_NO_INCREMENT);

  return STATUS_SUCCESS;
}

//驱动入口函数(类似于main或WinMain)
NTSTATUS DriverEntry( IN PDRIVER_OBJECT  driverObject, IN PUNICODE_STRING  registryPath )
{ 

  NTSTATUS       ntStatus;
  UNICODE_STRING devName;
  UNICODE_STRING symLinkName;
  int i=0; 

  //打印一句调试信息
  KdPrint(("Hello world!!!\n"));

  //设置该驱动对象的卸载函数
  //driverObject->DriverUnload = DriverUnload; 

  //创建设备 
  RtlInitUnicodeString(&devName, L"\\Device\\HelloWorld");
  ntStatus = IoCreateDevice( driverObject,0,&devName,FILE_DEVICE_UNKNOWN,0, TRUE,&p_DeviceObject );
  
  //创建符号链接  
  RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\HelloWorld");
  ntStatus = IoCreateSymbolicLink( &symLinkName,&devName );
  
  //设置该驱动对象的派遣例程函数
  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  {
    driverObject->MajorFunction[i] = DrvDispatch;
  }
  //返回成功结果
  return STATUS_SUCCESS;
}
ntStatus = IoCreateDevice( driverObject,0,&devName,FILE_DEVICE_UNKNOWN,0, TRUE,&p_DeviceObject );
ntStatus = IoCreateSymbolicLink( &symLinkName,&devName )
driverObject->MajorFunction[i] = DrvDispatch;
/********************************************************************
  created:  2010/12/06
  filename:   D:\0day\ExploitMe\exploitme.c
  author:    shineast
  purpose:  Exploit me driver demo 
*********************************************************************/
#include <ntddk.h>

#define DEVICE_NAME L"\\Device\\ExploitMe"
#define DEVICE_LINK L"\\DosDevices\\DRIECTX1"
#define FILE_DEVICE_EXPLOIT_ME 0x00008888
#define IOCTL_EXPLOIT_ME (ULONG)CTL_CODE(FILE_DEVICE_EXPLOIT_ME,0x800,METHOD_NEITHER,FILE_WRITE_ACCESS)

//创建的设备对象指针
PDEVICE_OBJECT g_DeviceObject;

/**********************************************************************
 驱动派遣例程函数
  输入:驱动对象的指针,Irp指针
  输出:NTSTATUS类型的结果
**********************************************************************/
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT driverObject,IN PIRP pIrp)
{ 
  PIO_STACK_LOCATION pIrpStack;//当前的pIrp栈
  PVOID Type3InputBuffer;//用户态输入地址
  PVOID UserBuffer;//用户态输出地址 
  ULONG inputBufferLength;//输入缓冲区的大小
  ULONG outputBufferLength;//输出缓冲区的大小 
  ULONG ioControlCode;//DeviceIoControl的控制号
  PIO_STATUS_BLOCK IoStatus;//pIrp的IO状态指针
  NTSTATUS ntStatus=STATUS_SUCCESS;//函数返回值 

  //获取数据
  pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  Type3InputBuffer = pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
  UserBuffer = pIrp->UserBuffer;
  inputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength; 
  outputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; 
  ioControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  IoStatus=&pIrp->IoStatus;
  IoStatus->Status = STATUS_SUCCESS;// Assume success
  IoStatus->Information = 0;// Assume nothing returned

  //根据 ioControlCode 完成对应的任务
  switch(ioControlCode)
  {
  case IOCTL_EXPLOIT_ME: 
    if ( inputBufferLength >= 4 && outputBufferLength >= 4 )
    {
      *(ULONG *)UserBuffer = *(ULONG *)Type3InputBuffer;
      IoStatus->Information = sizeof(ULONG);
    }
    break;
  }  

  //返回
  IoStatus->Status = ntStatus; 
  IoCompleteRequest(pIrp,IO_NO_INCREMENT);
  return ntStatus;
}
/**********************************************************************
 驱动卸载函数
  输入:驱动对象的指针
  输出:无
**********************************************************************/
VOID DriverUnload( IN PDRIVER_OBJECT  driverObject )
{ 
  UNICODE_STRING symLinkName; 
  KdPrint(("DriverUnload: 88!\n")); 
  RtlInitUnicodeString(&symLinkName,DEVICE_LINK);
  IoDeleteSymbolicLink(&symLinkName);
  IoDeleteDevice( g_DeviceObject ); 
} 
/*********************************************************************
 驱动入口函数(相当于main函数)
  输入:驱动对象的指针,服务程序对应的注册表路径
  输出:NTSTATUS类型的结果
**********************************************************************/
NTSTATUS DriverEntry( IN PDRIVER_OBJECT  driverObject, IN PUNICODE_STRING  registryPath )
{ 
  NTSTATUS       ntStatus;
  UNICODE_STRING devName;
  UNICODE_STRING symLinkName;
  int i=0; 
  //打印一句调试信息
  KdPrint(("DriverEntry: Exploit me driver demo!\n"));
  //创建设备 
  RtlInitUnicodeString(&devName,DEVICE_NAME);
  ntStatus = IoCreateDevice( driverObject,
    0,
    &devName,
    FILE_DEVICE_UNKNOWN,
    0, TRUE,
    &g_DeviceObject );
  if (!NT_SUCCESS(ntStatus))
  {
    return ntStatus;  
  }
  //创建符号链接  
  RtlInitUnicodeString(&symLinkName,DEVICE_LINK);
  ntStatus = IoCreateSymbolicLink( &symLinkName,&devName );
  if (!NT_SUCCESS(ntStatus)) 
  {
    IoDeleteDevice( g_DeviceObject );
    return ntStatus;
  }
  //设置该驱动对象的卸载函数
  driverObject->DriverUnload = DriverUnload; 
  //设置该驱动对象的派遣例程函数
  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  {
    driverObject->MajorFunction[i] = DrvDispatch;
  }
  //返回成功结果
  return STATUS_SUCCESS;
}
Type3InputBuffer = pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;

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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 108
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark Windows内核漏洞初探
2015-12-12 09:42
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
膜拜挖漏洞的大婶
2015-12-12 10:24
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
必须mark呀
2015-12-12 23:53
0
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
赞一下内核漏洞。
2015-12-15 15:42
0
游客
登录 | 注册 方可回帖
返回
//