鱼C论坛

 找回密码
 立即注册
查看: 11869|回复: 8

[技术交流] 驱动级进程保护

[复制链接]
发表于 2015-6-29 19:04:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
好久没上论坛了~~
这几天学了驱动 写了个小代码就发个帖子了
国际惯例先上代码

代码很简单 SSDT HOOK NtTerminateProcess 修改返回值实现保护   渣代码忘大牛勿喷(>﹏<)PS:安装WINDDK 编译


源文件 :Driver.C  这是驱动代码
  1. #include <ntddk.h>
  2. [hide]#define NtTerminateProcessIndex 257


  3. #pragma pack(1)
  4. /*  SSDT表 */
  5. typedef struct ServiceDescriptorEntry
  6. {
  7.         unsigned int *ServiceTableBase;
  8.         unsigned int *ServiceCounterTableBase;
  9.         unsigned int NumberOfServices;
  10.         unsigned char *ParamTableBase;
  11. }ServiceDescriptorEntry_t, *PServiceDescriptorEntry;
  12. #pragma pack()
  13. /* 导入数据结构 */
  14. _declspec(dllimport) ServiceDescriptorEntry_t KeServiceDescriptorTable;


  15. /* 变量声明 */
  16. DWORD32 ProtectPID = NULL;
  17. UINT32  SSDTSrcaddress = NULL;  //源函数地址


  18. /* 函数声明 SSDTHOOK开启/关闭*/
  19. VOID SSDTHook_Start();
  20. VOID SSDTHook_Stop();


  21. /* 内存页保护 开启/关闭*/
  22. VOID PageProtectOn();   //开启页保护
  23. VOID PageProtectOff();  //关闭页保护



  24. VOID PageProtectOn()
  25. {
  26.         __asm
  27.         {
  28.                 mov eax, cr0;
  29.                 or eax, 10000h;
  30.                 mov cr0, eax;
  31.                 sti
  32.         }
  33. }
  34. VOID PageProtectOff()
  35. {
  36.         __asm
  37.         {
  38.                 cli
  39.                         mov eax, cr0;
  40.                 and eax, not 10000h;
  41.                 mov cr0, eax;
  42.         }
  43. }





  44. /* 函数指针 */
  45. typedef NTSTATUS(*pNtTerminateProcess)(HANDLE HProcess, NTSTATUS ExitStaus);


  46. /* 跳转函数 */
  47. NTSTATUS MNtTerminateProcess(HANDLE Hprocess, NTSTATUS ExitStaus)
  48. {


  49.         /* 变量 */
  50.         USHORT uPID = NULL;
  51.         NTSTATUS rtStatus = NULL;
  52.         PEPROCESS pEProcess = { NULL };

  53.        


  54.         /* 开始过滤 */
  55.         rtStatus = ObReferenceObjectByHandle(Hprocess, FILE_READ_DATA, NULL, KernelMode, (PVOID*)&pEProcess, NULL);
  56.         if (!NT_SUCCESS(rtStatus)) { DbgPrint("获取进程对象失败!\n"); }


  57.         /* 通过进程对象获取进程PID */
  58.         else
  59.         {
  60.                 uPID = PsGetProcessId(pEProcess);
  61.                 DbgPrint("该进程PID:%d", uPID);
  62.                 /* 判断要保护的进程PID是否和该PID想等 */
  63.                
  64.                 if (uPID == ProtectPID && ProtectPID > 0)
  65.                 {
  66.                         /* 返回 */
  67.                         return STATUS_ACCESS_DENIED;
  68.                 }
  69.                 else { DbgPrint("未设置进程PID或进程PID不想等"); }
  70.         }

  71.        
  72.        
  73.         DbgPrint("进程句柄:%d 被关闭", Hprocess);
  74.         return ((pNtTerminateProcess)SSDTSrcaddress)(Hprocess, ExitStaus);

  75. }

  76. VOID SSDTHook_Start()
  77. {

  78.         /* 关闭页保护 */
  79.         PageProtectOff();

  80.         /* 保存源函数地址 */
  81.         SSDTSrcaddress = KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex];
  82.         /* 修改为我们的函数地址 */
  83.         KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex] = (unsigned int)&MNtTerminateProcess;

  84.         /* 开启页保护 */
  85.         PageProtectOn();
  86.        
  87. }

  88. VOID SSDTHook_Stop()
  89. {
  90.         /* 关闭页保护 */
  91.         PageProtectOff();

  92.         /* 已经开始HOOK */
  93.         if (SSDTSrcaddress)  
  94.         /* 修改回原来的函数 */
  95.         KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex] = SSDTSrcaddress;

  96.         /* 开启页保护 */
  97.         PageProtectOn();

  98. }
  99. /* 派遣函数 */
  100. NTSTATUS DriverDispatch(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  101. {
  102.        
  103.         PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  104.        
  105.         switch (pIrpStack->MajorFunction)
  106.         {
  107.         case IRP_MJ_DEVICE_CONTROL:
  108.            {
  109.                         ProtectPID = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  110.                         DbgPrint("进程PID:%d\n", ProtectPID);
  111.                           
  112.                         break;
  113.            }
  114.         case IRP_MJ_CLOSE:
  115.            {
  116.                           
  117.                         break;
  118.            }
  119.         case IRP_MJ_CREATE:
  120.            {
  121.                           
  122.                         break;
  123.            }
  124.         default:
  125.            {
  126.                           
  127.                          break;
  128.            }
  129.         }
  130.         Fished:
  131.         pIrp->IoStatus.Status = STATUS_SUCCESS;
  132.         pIrp->IoStatus.Information = 0;
  133.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  134.         return STATUS_SUCCESS;

  135. }
  136. VOID Unload( PDRIVER_OBJECT DriverObject )
  137. {
  138.         UNICODE_STRING SysbolLink = { NULL };
  139.         PDEVICE_OBJECT pDeviceObj = DriverObject->DeviceObject;
  140.         DbgPrint("Unload Function \n");
  141.         if (pDeviceObj != NULL)
  142.         {
  143.                 DbgPrint("删除设备对象%d", pDeviceObj);
  144.                 IoDeleteDevice(DriverObject->DeviceObject);
  145.                 RtlInitUnicodeString(&SysbolLink, L"\\??\\Fuhao");
  146.                 IoDeleteSymbolicLink(&SysbolLink);
  147.         }

  148.         /* 停止HOOK */
  149.         SSDTHook_Stop();
  150.           
  151. }
  152. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  153. {
  154.        
  155.         NTSTATUS Ntstatus = NULL;

  156.         UNICODE_STRING DeviceName = { NULL };
  157.         UNICODE_STRING SysbolLink = { NULL };
  158.         PDEVICE_OBJECT pDeviceObj = { NULL };


  159.         DbgPrint("Entry Function \n");


  160.         //设备名称和符号链接
  161.         RtlInitUnicodeString(&DeviceName, L"\\Device\\Fuhao");
  162.         RtlInitUnicodeString(&SysbolLink, L"\\??\\Fuhao");

  163.         /* 创建设备对象 */
  164.         Ntstatus = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObj);
  165.         if (!NT_SUCCESS(Ntstatus)) DbgPrint("驱动创建失败");


  166.         pDeviceObj->Flags |= DO_BUFFERED_IO;
  167.         pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;  //设备初始化完成标记


  168.         /* 创建符号链接和ring0通信 */
  169.         Ntstatus = IoCreateSymbolicLink(&SysbolLink, &DeviceName);
  170.         if (!NT_SUCCESS(Ntstatus)) DbgPrint("符号链接创建失败");

  171.         /* 设置派遣函数 接收PID*/
  172.         DriverObject->DriverUnload = Unload;
  173.         DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;
  174.         DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatch;
  175.         DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDispatch;


  176.         /* 开始HOOK */
  177.         SSDTHook_Start();
  178.     return STATUS_SUCCESS;
  179. }
复制代码
[/hide]

QQ截图20150629185900.png


为了方便驱动加载器我就用易写了
驱动.zip (8.92 KB, 下载次数: 117)

直接运行后输入PID 点保护就OK了


注意了 这个驱动只运行在XP SP3 因为操作系统不同 SSDT索引不同(>﹏<)  这个是XP版的  其它系统运行可能蓝屏
编译 Free Win7 就好了  还好记得修改 [hide]#define NtTerminateProcessIndex 257  257是XP SP3 NtTerminateProcess函数的SSDT索引号
自己修改编译就好了



截图:
1.png
2.png


评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +4 收起 理由
拈花小仙 + 5 + 5 + 4 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-29 23:20:07 | 显示全部楼层
沙发..........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-30 08:44:14 | 显示全部楼层
楼主厉害!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2015-6-30 21:43:44 | 显示全部楼层
先收藏起来等开始学习驱动了再说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-30 23:57:17 | 显示全部楼层
谢谢LZ分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-2 08:38:45 | 显示全部楼层
贴下 [inline hook]HOOK NtCreateFile 实现文件无法打开
http://bbs.fishc.com/thread-62548-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-5 08:26:18 | 显示全部楼层
感觉很屌的样子,不知道什么时候能有你样的水平。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-5 09:44:59 | 显示全部楼层
灭·世 发表于 2015-7-5 08:26
感觉很屌的样子,不知道什么时候能有你样的水平。

其实吧这是比较简单的驱动程序 如果你会C语言再去学驱动开发  学过几章你就能写这个了

评分

参与人数 1荣誉 +2 鱼币 +1 贡献 +1 收起 理由
灭·世 + 2 + 1 + 1 谢谢你的鼓励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-5 09:57:25 | 显示全部楼层
迷雾少年 发表于 2015-7-5 09:44
其实吧这是比较简单的驱动程序 如果你会C语言再去学驱动开发  学过几章你就能写这个了

C学了一点,C++也学了一点,不过都是自学的,感觉没学到什么东西,学历也低,年龄也30岁了,哈哈,我会一直学下去,学习是一种习惯,一种爱好,不为工作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 01:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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