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. ThinkPHP5 与 composer

    我是通过安装composer来获取tp5安装的,也是学习一下 在 Windows 中,你需要下载并运行 Composer-Setup.exe. 安装时,要选择本地环境中php.exe作为跟目录,这个可 ...

  2. css3实现颤动的动画

    需求 页面要做一个活动入口,不能太显眼,但是又要用户能一眼就看出来. 演示 https://jsfiddle.net/vtsxc18q/ 实现 (部分动画代码) @keyframes chanDong ...

  3. HeidiSQL

    相关链接 https://www.heidisql.com/ - 官网 https://github.com/HeidiSQL/HeidiSQL - 源码 参考 ...

  4. MFC- 网络编程

    一.MFC网络编程 a)CAsyncSocket用于异步非阻塞类,用UDP通信: b)CAsyncSocket的子类(派生类):Csocket同步阻塞类,用于TCP通信: c)通信前,必须调用AfxS ...

  5. numpy中的range()

    1.arange返回一个array对象,arange(5)=([0,1,2,3,4]) 2.如果是两个参数,第一个参数是起点,第二个参数是终点 3.如果是三个参数,那么第三个参数就是步长

  6. 四、绑定SignaIR的用户管理

    一.用户分组(第一个默认我的好友,禁删和更改) 没有分组id,更改layim代码: 更改id即可. layui.define('jquery', function (exports) { " ...

  7. 一、JsonTree

    一.JsonTree [ {"id":"4","pid":"1","name":"大家电& ...

  8. Thinking in Annotation

    Thinking in Java这本书很久前就购买了,打算有时间看一下,因为自己的时间被自己安排的紧张,也没时间看书.黄师傅上次课程讲到了注解的使用和反射的使用,今天打算学习一下注解.该文章参考Thi ...

  9. 20190614笔记(颜色透明度,css,filter,滤镜,计算属性,json和formData转换)

    今天忙里偷闲,把最近做的笔记做一下整理. 1.json和formData互相转换 适用场景:对接后台接口.后台接口写的因人而异,不同的人有不同的风格.比如,文件上传,原本就是formData格式,有人 ...

  10. 通过jenkins给gitlab某代码路径打tag的方式

    1.构建后设置里的git publisher插件 https://blog.csdn.net/workdsz/article/details/77931812 2.通过gitlab api接口来 ht ...