找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4080|回复: 2

控制码hook简单模型

[复制链接]

307

主题

228

回帖

7317

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5567 个
贡献
253 次
宅之契约
0 份
在线时间
945 小时
注册时间
2014-1-25
发表于 2015-11-2 17:21:51 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×

  1. #include <Ntddk.h>
  2. #include "DriverMonitor.h"

  3. VOID __stdcall unload(PDRIVER_OBJECT)
  4. {

  5. }

  6. ULONG GetModuleBase(PCHAR modulename);

  7. extern "C"
  8. {
  9.         extern POBJECT_TYPE *IoDriverObjectType;
  10.         extern POBJECT_TYPE *IoDeviceObjectType;
  11.         NTSTATUS __stdcall NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS,PVOID,ULONG,PULONG);
  12.         NTSTATUS __stdcall ObReferenceObjectByName(PUNICODE_STRING,ULONG,PACCESS_STATE,ACCESS_MASK,POBJECT_TYPE,KPROCESSOR_MODE,PVOID,PVOID);
  13. //        NTSTATUS __stdcall IoGetDeviceObjectPointer(PUNICODE_STRING ,ACCESS_MASK,PFILE_OBJECT,PDEVICE_OBJECT);
  14.         NTSTATUS __stdcall ObOpenObjectByName(POBJECT_ATTRIBUTES,POBJECT_TYPE,KPROCESSOR_MODE,PACCESS_STATE,ACCESS_MASK,PVOID,PHANDLE);
  15.         NTSTATUS __stdcall ObOpenObjectByPointer(PVOID,ULONG,PACCESS_STATE,ACCESS_MASK,POBJECT_TYPE,KPROCESSOR_MODE,PHANDLE);
  16.         NTSTATUS __stdcall ObReferenceObjectByPointer(PVOID,ACCESS_MASK,POBJECT_TYPE,KPROCESSOR_MODE);
  17. };

  18. PWCHAR DriverName[]=
  19. {
  20.         L"\\Driver\\QMUDisk",
  21.         L"\\Driver\\TAOAccelerator",
  22.         L"\\Driver\\TAOKernelDriver",
  23.         L"\\Driver\\TSDefenseBt",
  24.         L"\\Driver\\TsFltMgr",
  25.         L"\\Driver\\TSKSP",
  26.         L"\\Driver\\TSSysKit",
  27.         L"\\Driver\\Ts888",
  28. };

  29. const int num=sizeof(DriverName)/sizeof(DriverName[0]);
  30. PDRIVER_OBJECT DriverObject[num]={0};
  31. PDRIVER_DISPATCH OriginDispatch[num]={0};
  32. BOOLEAN bitmap[num]={FALSE};

  33. //打开驱动对象的方式: ObReferenceObjectByName ObOpenObjectByName


  34. NTSTATUS __stdcall IoCtlDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp)
  35. {
  36.         PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
  37.         int index=-1;
  38.         for(int i=0;i<num;i++)
  39.         {
  40.                 if(DriverObject[i] == DeviceObject->DriverObject)
  41.                 {
  42.                         index=i;
  43.                         break;
  44.                 }
  45.         }
  46.         if(stack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
  47.         {
  48.                 ULONG iocode = stack->Parameters.DeviceIoControl.IoControlCode;
  49.                 switch(iocode)
  50.                 {
  51.                         //不监视
  52.                 case 0x222428:
  53.                 case 0x222430:
  54.                 case 0x222800:
  55.                 case 0x222804:
  56.                 case 0x224008:
  57.                 case 0x22E004:
  58.                 case 0x22E040:       
  59.                 case 0x22E064:       
  60.                 case 0x22E08C:       
  61.                 case 0x22E0C4:
  62.                 case 0x22E0C8:       
  63.                 case 0x22E0CC:       
  64.                 case 0x22E0D0:
  65.                 case 0x22E100:       
  66.                 case 0x22E104:       
  67.                 case 0x22E420:       
  68.                 case 0x22E424:       
  69.                         break;
  70.                         //监视且已知
  71.                 case 0x221C00:
  72.                 case 0x222004:
  73.                 case 0x222008:
  74.                 case 0x22200C:
  75.                 case 0x222010:
  76.                 case 0x222404:
  77.                 case 0x222408:
  78.                 case 0x22240C:
  79.                 case 0x222410:
  80.                 case 0x222414:
  81.                 case 0x222418:
  82.                 case 0x22241C:
  83.                 case 0x222420:
  84.                 case 0x222424:
  85.                 case 0x22242C:
  86.                 case 0x22400C:
  87.                 case 0x224010:
  88.                 case 0x224014:
  89.                 case 0x224018:
  90.                 case 0x22401C:
  91.                 case 0x224020:
  92.                 case 0x224024:
  93.                 case 0x22402C:
  94.                 case 0x22E01C:       
  95.                 case 0x22E05C:
  96.                 case 0x22E070:       
  97.                 case 0x22E0D8:       
  98.                 case 0x22E0E0:
  99.                 case 0x22E0E4:        
  100.                 case 0x22E404:
  101.                         DbgPrint("%ws ioctlcode=0x%08x known\n",DriverName[index],iocode);
  102.                         break;
  103.                         //监视且未知
  104.                 case 0x221C04:
  105.                 case 0x221C08:
  106.                 case 0x221C0C:
  107.                 case 0x221C10:
  108.                 case 0x221C14:
  109.                 case 0x224028:
  110.                 case 0x22E008:
  111.                 case 0x22E010:
  112.                 case 0x22E014:       
  113.                 case 0x22E020:       
  114.                 case 0x22E028:       
  115.                 case 0x22E030:       
  116.                 case 0x22E034:       
  117.                 case 0x22E038:       
  118.                 case 0x22E03C:       
  119.                 case 0x22E044:
  120.                 case 0x22E048:
  121.                 case 0x22E04C:
  122.                 case 0x22E050:       
  123.                 case 0x22E054:       
  124.                 case 0x22E058:       
  125.                 case 0x22E06C:       
  126.                 case 0x22E078:       
  127.                 case 0x22E07C:       
  128.                 case 0x22E080:       
  129.                 case 0x22E084:       
  130.                 case 0x22E0E8:
  131.                 case 0x22E0EC:       
  132.                 case 0x22E0F0:
  133.                 case 0x22E108:       
  134.                 case 0x22E10C:       
  135.                 case 0x22E110:       
  136.                 case 0x22E114:       
  137.                 case 0x22E400:       
  138.                 case 0x22E414:       
  139.                 case 0x22E418:       
  140.                 case 0x22E41C:       
  141.                         DbgPrint("%ws ioctlcode=0x%08x unknown1\n",DriverName[index],iocode);
  142.                         break;
  143.                         //完全未知
  144.                 default:
  145.                         DbgPrint("%ws ioctlcode=0x%08x unknown2\n",DriverName[index],iocode);
  146.                         break;
  147.                 }
  148.         }

  149.         NTSTATUS status;
  150.         if(index != -1 && OriginDispatch[index])
  151.                 status=OriginDispatch[index](DeviceObject,Irp);
  152.         return status;
  153. }

  154. BOOLEAN IsHooked(int index,PUCHAR FuncAddr)
  155. {
  156.         if(IoCtlDispatch==DriverObject[index]->MajorFunction[IRP_MJ_DEVICE_CONTROL])
  157.                 return TRUE;
  158.         return FALSE;
  159. }

  160. void Hook(int index,PDRIVER_DISPATCH* FuncAddr)
  161. {
  162.         InterlockedExchangePointer((PLONG)FuncAddr,IoCtlDispatch);
  163. }

  164. void __stdcall OnTimer(PDEVICE_OBJECT DeviceObject,PVOID Context)
  165. {
  166.         for(int i=0;i<num;i++)
  167.         {
  168.                 if(bitmap[i] && !IsHooked(i,(PUCHAR)DriverObject[i]->MajorFunction[IRP_MJ_DEVICE_CONTROL]))
  169.                 {
  170.                         DbgPrint("Hook is unhooked! rehook it\n");
  171.                         Hook(i,&DriverObject[i]->MajorFunction[IRP_MJ_DEVICE_CONTROL]);
  172.                 }
  173.         }
  174. }

  175. extern "C"
  176. {
  177.         NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT pdr,PUNICODE_STRING pus)
  178.         {
  179.                 int ret=0;
  180.                 pdr->DriverUnload=unload;
  181.                 PDEVICE_OBJECT DevObj = NULL;
  182.                 IoCreateDevice(pdr,0,NULL,0x22,0,0,&DevObj);
  183.                 DbgPrint("Hook Everything\n");
  184.                 __debugbreak();
  185.                 for(int i=0;i<num;i++)
  186.                 {
  187.                         UNICODE_STRING uStr;
  188.                         NTSTATUS status=0;
  189.                         PFILE_OBJECT FileObject=NULL;
  190.                         RtlInitUnicodeString(&uStr,DriverName[i]);
  191.                
  192.                         status = ObReferenceObjectByName(&uStr,OBJ_CASE_INSENSITIVE,NULL,0,*IoDriverObjectType,KernelMode,NULL,DriverObject+i);
  193.                         if(NT_SUCCESS(status) && DriverObject[i])
  194.                         {
  195.                                 DbgPrint("%ws ioctl hooked\n",DriverName[i]);
  196.                                 PDRIVER_DISPATCH* Addr=&DriverObject[i]->MajorFunction[IRP_MJ_DEVICE_CONTROL];
  197.                                 OriginDispatch[i]=*Addr;
  198.                                 InterlockedExchangePointer((PLONG)Addr,IoCtlDispatch);
  199.                                 bitmap[i]=TRUE;
  200.                         }
  201.                 }

  202.                 IoInitializeTimer(DevObj,OnTimer,NULL);
  203.                 IoStartTimer(DevObj);
  204.                 __debugbreak();
  205.                 return STATUS_SUCCESS;
  206.         }
  207. };


  208. ULONG GetModuleBase(PCHAR modulename)
  209. {
  210.         PVOID Buffer = NULL;
  211.         ULONG ReturnLength = 0;
  212.         NTSTATUS status;
  213.         PRTL_PROCESS_MODULES modules = NULL;
  214.         ULONG BaseAddr = NULL;
  215.         NtQuerySystemInformation(SystemModuleInformation,&ReturnLength,0,&ReturnLength);
  216.         if(ReturnLength)
  217.                 Buffer = ExAllocatePool(PagedPool,ReturnLength);
  218.         if(Buffer)
  219.                 status = NtQuerySystemInformation(SystemModuleInformation,Buffer,ReturnLength,NULL);
  220.         modules = (PRTL_PROCESS_MODULES)Buffer;
  221.         if(NT_SUCCESS(status))
  222.         {
  223.                 for(int i=0;i<modules->NumberOfModules;i++)
  224.                 {
  225.                         int offset = modules->Modules[i].OffsetToFileName;
  226.                         if(!_stricmp((const char*)(modules->Modules[i].FullPathName+offset),modulename))
  227.                         {
  228.                                 BaseAddr = (ULONG)modules->Modules[i].ImageBase;
  229.                         }
  230.                 }
  231.         }
  232.         if(Buffer)
  233.                 ExFreePool(Buffer);
  234.         return BaseAddr;
  235. }




复制代码
回复

使用道具 举报

5

主题

43

回帖

197

积分

用户组: 小·技术宅

UID
167
精华
0
威望
3 点
宅币
132 个
贡献
11 次
宅之契约
0 份
在线时间
30 小时
注册时间
2014-3-30
发表于 2015-11-6 14:34:17 | 显示全部楼层
NICE
回复

使用道具 举报

0

主题

41

回帖

45

积分

用户组: 初·技术宅

UID
3351
精华
0
威望
2 点
宅币
0 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-1-14
发表于 2018-1-14 15:14:01 | 显示全部楼层
可以可以!!
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-28 18:20 , Processed in 0.042283 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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