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. C++ cin相关函数总结

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  2. [FJOI2007]轮状病毒 题解(dp(找规律)+高精度)

    [FJOI2007]轮状病毒 题解(dp(找规律)+高精度) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1335733 没什么好说的,直接把规律找出来,有 ...

  3. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

  4. 使用 ref 和 out 传递数组注意事项

    1.与所有的 out参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由被调用方为其赋值 示例 :在此例中,在调用方(Main 方法)中声明数组 theArray,并在 FillArra ...

  5. luogu P5329 [SNOI2019]字符串

    传送门 显然要写一个排序,那只要考虑cmp函数怎么写就行了.第\(i\)个字符串和第 \(j\)个,首先前\(min(i,j)-1\)个字符是相同的,然后就是要比较后缀\(min(i,j)\)和\(m ...

  6. git的配置设置

    git的基本配置 git是一个版本控制工具,既然是工具,那么就可以根据人的个人喜好来进行设置,git也提供了配置,可以根据自己的喜好来对它进行个性化的设计,以让自己舒服的玩. git有三个配置文件 / ...

  7. css隐藏滚动条 兼容谷歌、火狐、IE等各个浏览器

    项目中,页面效果需要展示一个页面的移动端效果,使用的是一个苹果手机样式背景图,咋也没用过苹果,咋也不敢形容. 如下图所示: 在谷歌浏览器如图一滚动条顺利隐藏,但是火狐就如图二了,有了滚动条丑的一批. ...

  8. C# wpf 列出文件夹所有文件

    在网上找了 cmd输入 dir "要列出的文件夹*.*" /a /b /s>"要输出的文件" 可以重定向把文件夹内容输出到文件 tree "要列 ...

  9. PCA原理推导及其在数据降维中的应用

    一个信号往往包含多个维度,各个维度之间可能包含较强的相关性.下图表示的是一组二维信号x=(x1,x2),可以看到数据点基本上分布在x2=x1这条直线上,二者存在很强的相关性(也就是确定x1之后,就能确 ...

  10. FPGA异步时钟系统中信号处理之单比特信号

    有些东西当你习以为常而不去深思熟虑的时候,致命的错误就会因此埋下!      FPGA开发中难免会遇到跨时钟域处理的问题,而对于单比特信号,我会不假思索的回答:打两拍不久解决了吗?但是事实时,这佯作的 ...