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. Coding 地址

    Coding 连接 https://dev.tencent.com/u/leexi

  2. Excel如何通过关键字模糊匹配查找全称

    打开excel,以其素材为例,通过关键字模糊匹配查找全称.   在公司名下输入公式:=LOOKUP(1,0/FIND(D2,A2:A5),A2:A5),按回车键确定即可.   FIND(D2,A2:A ...

  3. 安装sysbench,报错"Could not resolve 'ports.ubuntu.com'"

    在ubuntu系统中安装sysbench时报错“Could not resolve 'ports.ubuntu.com'”怎么办呢? 安装时报错: 亲测可用的方法: 修改 resolv.conf 文件 ...

  4. windows_vs编译过程

    visual studio 2010 编译程序时,首先是cpp经过预处理,处理掉#define,#include等等.#include部分,将头文件部分替换到cpp中.之后进行优化过程,到.s.之后进 ...

  5. CRMEasy知识库点击无法弹出窗体问题

    丢失控件   MSDATLST.OCX 将此控件放在路径下    C:\Windows\System32 并进行注册,具体方法为: 打开控件方式选择   C:\Windows\System32\reg ...

  6. springboot中常用注解总结

    1.@RestController(组合注解):标注在类上,等价于@Controller和@Responsebody @Controller:将该类标记为Controller层的类,并且注入到Spri ...

  7. SSM整合中错误:Data truncation: Data too long for column 'gender' at row 1

    错误描述 ### SQL: insert into t_customer(name,gender,phone,address) values (?,?,?,?) ### Cause: com.mysq ...

  8. NOIP2015 D1T1 神奇的幻方

    洛谷P2615 很简单的模拟题……每枚举一个点只要保存上一个点的x,y值即可,不用开数组存放 另外题目中对于K的操作都在K-1的九宫格范围内,所以我们巧妙运用++和--就可以做到每个分支一行代码 还有 ...

  9. Java日期时间以及日期相互转换_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; impor ...

  10. 【宝藏】题解(五校联考3day1)

    分析 如果打爆搜的话可以拿60分. 首先知道期望是可以累加的,即i通过j去到k的期望,等于i去到j的期望加j去到k的期望. 所以令d[i]表示i的出度,F[i]表示从i到i的父亲的期望,G[i]表示i ...