1. /*
  2. windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过
  3. */
  4. #include <ntddk.h>
  5. #include "nt_help.h"
  6. DRIVER_INITIALIZE DriverEntry;
  7. typedef struct _OBJECT_TYPE_INITIALIZER {
  8. USHORT Length;
  9. BOOLEAN UseDefaultObject;
  10. BOOLEAN CaseInsensitive;
  11. #if WINVER>=0x0600
  12. ULONG ObjectTypeCode;
  13. #endif
  14. ULONG InvalidAttributes;
  15. GENERIC_MAPPING GenericMapping;
  16. ULONG ValidAccessMask;
  17. BOOLEAN SecurityRequired;
  18. BOOLEAN MaintainHandleCount;
  19. BOOLEAN MaintainTypeList;
  20. POOL_TYPE PoolType;
  21. ULONG DefaultPagedPoolCharge;
  22. ULONG DefaultNonPagedPoolCharge;
  23. PVOID DumpProcedure;
  24. PVOID OpenProcedure;
  25. PVOID CloseProcedure;
  26. PVOID DeleteProcedure;
  27. PVOID ParseProcedure;
  28. PVOID SecurityProcedure;
  29. PVOID QueryNameProcedure;
  30. PVOID OkayToCloseProcedure;
  31. } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
  32. typedef struct _OBJECT_TYPE {
  33. #if WINVER<0x0600
  34. ERESOURCE Mutex;
  35. #endif
  36. LIST_ENTRY TypeList;
  37. UNICODE_STRING Name;            // Copy from object header for convenience
  38. PVOID DefaultObject;
  39. ULONG Index;
  40. ULONG TotalNumberOfObjects;
  41. ULONG TotalNumberOfHandles;
  42. ULONG HighWaterNumberOfObjects;
  43. ULONG HighWaterNumberOfHandles;
  44. OBJECT_TYPE_INITIALIZER TypeInfo;
  45. } OBJECT_TYPE, *POBJECT_TYPE;
  46. extern POBJECT_TYPE* MmSectionObjectType;
  47. PVOID pNtCreateSection = NULL;
  48. SYSTEM_MODULE_INFORMATION ntModInfo = {0};
  49. #pragma alloc_text(INIT, DriverEntry)
  50. NTSTATUS DevicePassthrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  51. {
  52. NTSTATUS status = STATUS_SUCCESS;
  53. PIO_STACK_LOCATION  irpSp;
  54. irpSp = IoGetCurrentIrpStackLocation(Irp);
  55. Irp->IoStatus.Status = status;
  56. IoCompleteRequest(Irp, IO_NO_INCREMENT);
  57. return status;
  58. }
  59. VOID DriverUnload (IN PDRIVER_OBJECT DriverObject)
  60. {
  61. (*MmSectionObjectType)->TypeInfo.OpenProcedure = NULL;
  62. KdPrint(("DriverUnload Done!\n"));
  63. }
  64. #if WINVER>=0x0600
  65. NTSTATUS HookSectionOpen(
  66. IN ULONG OpenReason,
  67. IN ULONG AccessMode,
  68. IN PEPROCESS Process OPTIONAL,
  69. IN PVOID Object,
  70. IN ACCESS_MASK* GrantedAccess,
  71. IN ULONG HandleCount
  72. )
  73. #else
  74. NTSTATUS HookSectionOpen(
  75. IN ULONG OpenReason,
  76. IN PEPROCESS Process OPTIONAL,
  77. IN PVOID Object,
  78. IN ACCESS_MASK GrantedAccess,
  79. IN ULONG HandleCount
  80. )
  81. #endif
  82. {
  83. PVOID* esp = (PVOID*)&esp;
  84. PVOID* esp_end = (PVOID*)((((DWORD64)esp>>12) + 1)<<12);        //4k round up
  85. PVOID* p = esp;
  86. ULONG SectionPageProtection, AllocationAttributes;
  87. HANDLE FileHandle;
  88. NTSTATUS Status;
  89. /*
  90. * do stack walk back to NtCreateSection function
  91. */
  92. while (p < esp_end &&
  93. (*p < pNtCreateSection ||
  94. *p > (PVOID)((PBYTE)pNtCreateSection + 0x300)))
  95. p++;
  96. if (p >= esp_end){
  97. //KdPrint(("no found NtCreateSection %p -> %p\n", esp, esp_end));
  98. return STATUS_SUCCESS;
  99. }
  100. //KdPrint(("%p HookSectionOpen-Object:%p esp:%p %p\n", pNtCreateSection, Object, esp, *p));
  101. #ifdef _WIN64
  102. /*
  103. * esp layout look likes[2003 X64 DUMP]:
  104. fffff800`0104113d nt!KiSystemServiceCopyEnd+0x3 retaddr <-------call nt!NtCreateSection
  105. fffffadf`f662ec00  00000000`00000000 param1
  106. fffffadf`f662ec08  00000000`000f001f param2 DesiredAccess
  107. fffffadf`f662ec10  00000000`00000000
  108. fffffadf`f662ec18  00000000`00000000
  109. fffffadf`f662ec20  00000100`00000010 SectionPageProtection
  110. fffffadf`f662ec28  00000000`01000000 AllocationAttributes
  111. fffffadf`f662ec30  00000000`0000054c FileHandle
  112. * - ...
  113. */
  114. p++;
  115. /*
  116. * search retaddr -> nt!KiSystemServiceCopyEnd
  117. */
  118. while (p < esp_end &&
  119. (*p < ntModInfo.ImageBase ||
  120. *p > (PVOID)((PBYTE)ntModInfo.ImageBase + ntModInfo.ImageSize)))
  121. p++;
  122. if (p >= esp_end){
  123. //KdPrint(("no found nt!KiSystemxxxx %p -> %p\n", esp, esp_end));
  124. return STATUS_SUCCESS;
  125. }
  126. #else
  127. /* stack DUMP from 2003/x86
  128. * ebp = p - 1
  129. fa06f4d8  fa06f540
  130. fa06f4dc  80908715 nt!NtCreateSection+0x15c
  131. ...
  132. fa06f540  fa06f564
  133. fa06f544  808234cb nt!KiFastCallEntry+0xf8
  134. fa06f548  fa06f668 param1
  135. */
  136. p = (PVOID*)*(p - 1);
  137. p++;
  138. #endif
  139. SectionPageProtection = (ULONG)*(p + 5);
  140. AllocationAttributes = (ULONG)*(p + 6);
  141. FileHandle = *(p + 7);
  142. //KdPrint(("%x %x %p\n", SectionPageProtection, AllocationAttributes, FileHandle));
  143. if (FileHandle
  144. && SectionPageProtection == PAGE_EXECUTE
  145. && (AllocationAttributes == SEC_IMAGE || AllocationAttributes == 0x100000)){
  146. /* windows7 AllocationAttributes = 0x100000 to LoadDriver */
  147. PFILE_OBJECT File;
  148. Status = ObReferenceObjectByHandle (FileHandle,
  149. 0,
  150. NULL,
  151. KernelMode,
  152. (PVOID *)&File,
  153. NULL);
  154. if (!NT_SUCCESS(Status)) {
  155. return STATUS_SUCCESS;
  156. }
  157. KdPrint(("FileName:%wZ\n", &File->FileName));
  158. ObDereferenceObject(File);
  159. }
  160. return STATUS_SUCCESS;
  161. }
  162. BOOL GetNtImgBase(PSYSTEM_MODULE_INFORMATION modInfo)
  163. {
  164. PSYSMODULELIST sysModuleList = NULL;
  165. ULONG size, i;
  166. NtQuerySystemInformation(SystemModuleInformation, &size, 0, &size);
  167. sysModuleList = ExAllocatePoolWithTag(PagedPool, size, 'hlpm');
  168. if (sysModuleList){
  169. NtQuerySystemInformation(SystemModuleInformation, sysModuleList, size, NULL);
  170. /* nt module should be the first one */
  171. *modInfo = *sysModuleList->Modules;
  172. ExFreePool(sysModuleList);
  173. return TRUE;
  174. }
  175. return FALSE;
  176. }
  177. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  178. {
  179. DWORD i;
  180. UNICODE_STRING sFuncName;
  181. RtlInitUnicodeString(&sFuncName, L"NtCreateSection");
  182. pNtCreateSection = MmGetSystemRoutineAddress(&sFuncName);
  183. if (!GetNtImgBase(&ntModInfo)){
  184. KdPrint(("EnumSysModule nt base failed!\n"));
  185. return STATUS_UNSUCCESSFUL;
  186. }
  187. KdPrint(("nt:%p pNtCreateSection:%p\nMmSectionObjectType:%p %p %p\n",
  188. ntModInfo.ImageBase,
  189. pNtCreateSection,
  190. *MmSectionObjectType,
  191. (*MmSectionObjectType)->TypeInfo.OpenProcedure,
  192. (*MmSectionObjectType)->TypeInfo.DeleteProcedure));
  193. (*MmSectionObjectType)->TypeInfo.OpenProcedure = HookSectionOpen;
  194. for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  195. DriverObject->MajorFunction[i] = DevicePassthrough;
  196. DriverObject->DriverUnload = DriverUnload;
  197. return STATUS_SUCCESS;
  198. }

通过HookNtCreateSection 动态监控驱动sys、动态链接库dll、可执行文件exe加载的更多相关文章

  1. 动态链接库dll的 静态加载 与 动态加载

    dll 两种链接方式  : 动态链接和静态链接(链接亦称加载) 动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统 ...

  2. [转载] 动态链接库dll的 静态加载 与 动态加载

    转载自:http://blog.csdn.net/youxin2012/article/details/11538491 dll 两种链接方式  : 动态链接和静态链接(链接亦称加载)   动态链接是 ...

  3. 动态监控驱动、dll、exe加载

    /* windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过 */ #include <ntddk.h> #include " ...

  4. DLL中加载其它DLL使用LoadLibrary加载动态库失败的解决办法

    方式一 采用LoadLibraryEx 若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载.但若调用的DLL内部又调用另外一个DLL,此时调用 ...

  5. Win64 驱动内核编程-13.回调监控模块加载

    回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载.传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver ...

  6. module_init宏解析 linux驱动的入口函数module_init的加载和释放

    linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...

  7. dll显式加载与隐式加载

    使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...

  8. 动态符号链接的细节 与 linux程序的加载过程

    转: http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952 值得玩味的一篇分析程序链接.装载.动态链接细节的好文档 导读: by ...

  9. linux驱动的入口函数module_init的加载和释放【转】

    本文转载自:http://blog.csdn.net/zhandoushi1982/article/details/4927579 就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含 ...

随机推荐

  1. Django使用Celery进行异步任务

    Celery Celery是一个功能完备即插即用的异步任务队列系统.它适用于异步处理问题,当发送邮件.或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用 ...

  2. tensorflow学习笔记二----------变量

    tensorflow里面的变量表示,需要使用特定的语法进行.如果想构造一个行(列)向量,需要调用Variable函数进行.对两个变量进行操作,也要调用相应的函数. import tensorflow ...

  3. GridView做加

    原文:http://www.cnblogs.com/insus/archive/2012/09/22/2697862.html 下面是Insus.NET实现演示: CObj.cs代码: using S ...

  4. 关于BeanUtils.copyProperties的用法和优缺点

    一.简介:  BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对Jav ...

  5. delete释放空间时出错的原因

    int *a=new int[10]; ...... delete []a; 后面“delete []a;”出现错误的情况大致有: 1 数组的首地址a被你有意无意更改了,如:a++之类的: 2 变量的 ...

  6. C#的Class的几个修饰符

    none or internal     类只能在当前的工程中访问 Public                    类可以在任何地方访问 abstract or internal abstract ...

  7. <转>ThinkPHP的开发常用系统配置项

    /* 项目设定 */ ’APP_DEBUG’ => false, // 是否开启调试模式 ’APP_DOMAIN_DEPLOY’ => false, // 是否使用独立域名部署项目 ’AP ...

  8. Consul学习研究

    参考资料 Consul 集群部署

  9. bzoj3091 城市旅行 LCT + 区间合并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...

  10. layui数据表格,当数据过长出现三个...的时候,点击会弹出一个框全部显示,如何去掉这个框

    最笨的方法就是通过css把那个框隐藏掉 .layui-table-tips-main{display:none} .layui-table-tips-c{display:none}