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. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

  2. 题解 CF1119A 【Ilya and a Colorful Walk】

    此题就是:给你一个数组,让你找出两个不同的元素,并让它们的下标差距最大. 思路:从2到n,如果与1不同,记录距离,与原数比较,取大. 从1到n-1,如果与n不同,记录距离,与原数比较,取大. AC代码 ...

  3. 线程中断:Thread类中interrupt()、interrupted()和 isInterrupted()方法详解

    首先看看官方说明: interrupt()方法 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行. i ...

  4. vue.js table组件封装

    table组件 和 分页组件来自iview,在这里我根据公司业务再次做了一次封装,使用slot进行内容分发,可以随意放置input输入框和button按钮 ,再使用props向子组件传递参数,使用em ...

  5. js中的object类型

    特点: 每个Object类型的实例共有的属性和方法: constructor: 保存着用于创建当前对象的函数. hasOwnProperty:用于检测给定的属性在当前对象的实例中是否存在. isPro ...

  6. mirror - 映射在远端节点上的档案

    总览 SYNOPSIS mirror [flags] -gsite:pathname mirror [flags] [package-files] 描述 DESCRIPTION Mirror 是以 P ...

  7. centos 7 安装相关环境

    How To Create a Sudo User on CentOS 7 https://www.digitalocean.com/community/tutorials/how-to-create ...

  8. diff 比较两个文件的不同

    1.命令功能 diff 逐行比较文件内容,并输出文件差异. 2.语法格式 diff  option   file1    file2 diff  选项   文件1   文件2 参数说明 参数 参数说明 ...

  9. Netty学习第四章 spring boot整合netty的使用

    现在大多数项目都是基于spring boot进行开发,所以我们以spring boot作为开发框架来使用netty.使用spring boot的一个好处就是能给将netty的业务拆分出来,并通过spr ...

  10. CSS3之mix-blend-mode

    <!-- more --> 在线编辑demo 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合. mix-blend-mode: normal; //正常 mix-bl ...