编程论坛-编程学习教程分享,编程技术交流,从零开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 125|回复: 0

[逆向破解/内核驱动] 隐藏驱动源码

[复制链接]

1086

主题

1812

帖子

3724

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3724

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2020-1-11 04:25:01 | 显示全部楼层 |阅读模式

  1. #include <ntifs.h>
  2. #include <intrin.h>

  3. #define        DEVICE_NAME                                        L"\\Device\\HideDrvTest"
  4. #define LINK_NAME                                        L"\\DosDevices\\HideDrvTest"
  5. #define LINK_GLOBAL_NAME                        L"\\DosDevices\\Global\\HideDrvTest"

  6. #define DEVICE_WIN32_NAME                        L"\\\\.\\HideDrvTest"

  7. //
  8. //global var
  9. //
  10. KSPIN_LOCK                        g_spinLock;

  11. //
  12. //create process notify
  13. //
  14. void CreateProcessNotifyRoutine(
  15.         _In_ HANDLE ParentId,
  16.         _In_ HANDLE ProcessId,
  17.         _In_ BOOLEAN Create
  18.         )
  19. {
  20.         if (Create)
  21.         {

  22.                 DbgPrint("进程创建: pid:%d ppid:%d\n", ProcessId,ParentId);
  23.         }

  24.         else
  25.         {
  26.                 DbgPrint("进程退出: pid:%d\n", ProcessId);
  27.         }
  28. }

  29. //
  30. //关闭内存写保护的代码
  31. //
  32. KIRQL WPOFFx64()
  33. {
  34.         KIRQL irql = KeRaiseIrqlToDpcLevel();
  35.         UINT64 cr0 = __readcr0();
  36.         cr0 &= 0xfffffffffffeffff;
  37.         __writecr0(cr0);
  38.         _disable();
  39.         return irql;
  40. }

  41. //
  42. //打开内存写保护的代码
  43. //
  44. void WPONx64(
  45.         KIRQL irql)
  46. {
  47.         UINT64 cr0 = __readcr0();
  48.         cr0 |= 0x10000;
  49.         _enable();
  50.         __writecr0(cr0);
  51.         KeLowerIrql(irql);
  52. }

  53. //
  54. //test hide driver
  55. //
  56. BOOLEAN HideDriver(
  57.         _In_ PDRIVER_OBJECT pDrvObj)
  58. {
  59.         if (pDrvObj->DriverSection != NULL)
  60.         {
  61.                 PLIST_ENTRY nextSection = ((PLIST_ENTRY)pDrvObj->DriverSection)->Blink;
  62.                 RemoveEntryList((PLIST_ENTRY)pDrvObj->DriverSection);
  63.                 pDrvObj->DriverSection = nextSection;

  64.                 return TRUE;
  65.         }
  66.         return FALSE;
  67. }


  68. //
  69. //DriverUnload
  70. //
  71. VOID
  72. DriverUnload(
  73. _In_ PDRIVER_OBJECT pDriverObj)
  74. {
  75.         UNREFERENCED_PARAMETER(pDriverObj);

  76.         UNICODE_STRING                linkName;

  77.         if (IoIsWdmVersionAvailable(1, 0x10))
  78.                 RtlInitUnicodeString(&linkName, LINK_GLOBAL_NAME);
  79.         else
  80.                 RtlInitUnicodeString(&linkName, LINK_NAME);


  81.         IoDeleteSymbolicLink(&linkName);
  82.         IoDeleteDevice(pDriverObj->DeviceObject);

  83. }

  84. //
  85. //DriverCtlDefault
  86. //
  87. NTSTATUS
  88. DriverCtlDefault(
  89. _In_ PDEVICE_OBJECT pDevObj,
  90. _In_ PIRP                        pIrp)
  91. {
  92.         UNREFERENCED_PARAMETER(pDevObj);

  93.         pIrp->IoStatus.Status = STATUS_SUCCESS;
  94.         pIrp->IoStatus.Information = 0;
  95.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);

  96.         return STATUS_SUCCESS;
  97. }

  98. //
  99. //DriverCtlHandle
  100. //
  101. NTSTATUS
  102. DriverCtlHandle(
  103. _In_ PDEVICE_OBJECT pDevObj,
  104. _In_ PIRP                        pIrp)
  105. {
  106.         UNREFERENCED_PARAMETER(pDevObj);

  107.         NTSTATUS                        status = STATUS_INVALID_DEVICE_REQUEST;
  108.         PIO_STACK_LOCATION        pIrpStack;
  109.         ULONG                                uIoControlCode;

  110.         PVOID                                pIoBuffer;
  111.         ULONG                                uInSize, uOutSize;

  112.         pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

  113.         uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

  114.         pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;

  115.         uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;

  116.         uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

  117.         KdBreakPoint();

  118.         switch (uIoControlCode)
  119.         {
  120.         case 1:break;
  121.         default:
  122.                 break;
  123.         }

  124.         if (status == STATUS_SUCCESS)
  125.                 pIrp->IoStatus.Information = uOutSize;
  126.         else
  127.                 pIrp->IoStatus.Information = 0;

  128.         pIrp->IoStatus.Status = status;
  129.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  130.         return status;
  131. }


  132. //
  133. //DriverEntry
  134. //
  135. #ifdef __cplusplus
  136. extern "C"
  137. NTSTATUS
  138. DriverEntry(
  139. _In_ PDRIVER_OBJECT pDriverObj,
  140. _In_ PUNICODE_STRING pRegisterPath)
  141. {
  142.         UNREFERENCED_PARAMETER(pRegisterPath);

  143.         NTSTATUS                        status = STATUS_SUCCESS;
  144.         UNICODE_STRING                linkName, devName;
  145.         PDEVICE_OBJECT                pDevObj;

  146.         // set default irp handle
  147.         for (int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  148.         {
  149.                 pDriverObj->MajorFunction[i] = DriverCtlDefault;
  150.         }
  151.         // set control irp handle
  152.         pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverCtlHandle;

  153.         // set driver unload hanle
  154.         pDriverObj->DriverUnload = DriverUnload;

  155.         // create  device
  156.         RtlInitUnicodeString(&devName, DEVICE_NAME);
  157.         status = IoCreateDevice(pDriverObj, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
  158.         if (!NT_SUCCESS(status))
  159.         {
  160.                 return status;
  161.         }

  162.         // create symbolic link
  163.         if (IoIsWdmVersionAvailable(1, 0x10))
  164.                 RtlInitUnicodeString(&linkName, LINK_GLOBAL_NAME);
  165.         else
  166.                 RtlInitUnicodeString(&linkName, LINK_NAME);

  167.         status = IoCreateSymbolicLink(&linkName, &devName);
  168.         if (!NT_SUCCESS(status))
  169.         {
  170.                 IoDeleteDevice(pDevObj);
  171.                 return status;
  172.         }

  173.         KeInitializeSpinLock(&g_spinLock);

  174.         //
  175.         //set create process notify
  176.         //
  177.         NTSTATUS notify_status = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, FALSE);
  178.         if (!NT_SUCCESS(notify_status))
  179.                 KdPrint(("PsSetCreateProcessNotifyRoutine fail! status = %08X\n", notify_status));

  180.         //
  181.         //hide driver test
  182.         //
  183.         HideDriver(pDriverObj);

  184.         return status;
  185. }
  186. #endif


复制代码


不积跬步,无以至千里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

展开

QQ|Archiver|手机版|小黑屋|从零开始学编程 ( 豫ICP备15032706号-2 )

GMT+8, 2020-1-27 20:30 , Processed in 0.119479 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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