通过挂钩 NtCreateSection 监控可执行模块

在 Win32 中,我们使用 CreateFileMapping 来创建映射文件对象,函数原型如下:

HANDLE CreateFileMapping(

HANDLE hFile,  // handle to file to map

LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes

DWORD flProtect,   // protection for mapping object

DWORD dwMaximumSizeHigh,     // high-order 32 bits of object size

DWORD dwMaximumSizeLow, // low-order 32 bits of object size

LPCTSTR lpName     // name of file-mapping object

);

这个函数会调用 Native Api(Ntdll.dll) 中的 ZwCreateSection ( NtCreateSection )函数,而后者又通过系统调用 Ntoskrnl.exe 中的 NtCreateSection 函数,其函数原型如下:

NTSTATUS

NtCreateSection(

OUT PHANDLE  SectionHandle ,

IN ACCESS_MASK  DesiredAccess ,

IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,

IN PLARGE_INTEGER  MaximumSize OPTIONAL,

IN ULONG  SectionPageProtection ,

IN ULONG  AllocationAttributes ,

IN HANDLE  FileHandle OPTIONAL

);

不仅是用户创建的映射文件, Windows 加载所有的可执行模块,包括 EXE 文件、 DLL 文件等都使用了此函数(博文《使用 Native Api 创建进程》就曾调用),只是在参数 SectionPageProtection 和 AllocationAttributes 与普通的映射文件有所区别:

根据这个特点,我们可以通过挂钩 NtCreateSection 函数来截获所有将要加载的可执行模块的文件名称(关于如何获取文件名称,可以参看博文《获取文件对象的名称》)反馈给用户。用户根据文件路径、文件的 MD5 或其他信息来判断是否允许该模块的加载。

(AllocationAttributes == 0X1000000) && (SectionPageProtection & PAGE_EXECUTE)

参考文章:

1. Hooking the native API and controlling process creation on a system-wide basis

( http://www.codeproject.com/KB/system/soviet_protector.aspx )

2. 天书夜读

最新文章

  1. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
  2. Example: Encoded SNMP Message - SNMP Tutorial
  3. javascript生成GUID的代码
  4. [LeetCode]题解(python):80-Remove Duplicates from Sorted Array II
  5. SSIS -->> Variable Data Type vs SSIS Data Type
  6. 集成Jenkins Notifier for Chrome到Jenkins CI
  7. 【转】larbin主要代码说明
  8. 移动平台3G手机网站前端开发布局技巧
  9. CONTAINING_RECORD 宏
  10. Linux系统下安装phpmyadmin方法
  11. python中的异常如何处理
  12. offsetHeight在OnLoad中为0的现象
  13. Spring mvc,uploadifive 文件上传实践(转自:https://segmentfault.com/a/1190000004503262)
  14. MVVM设计模式加RAC响应式编程
  15. 使用EWS API读取邮件
  16. tessaract ocr简介
  17. Lisp之根源 --- 保罗格雷厄姆
  18. python使用dbutils的PooledDB连接池,操作数据库
  19. Xcode缓存数据清除
  20. 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式

热门文章

  1. 5.1_springboot2.x与安全(spring security)
  2. 终于搭好了WinCE上MFC的SDK环境
  3. 【学术篇】SDOI2017 数字表格
  4. Java怎样判断身份证号
  5. Sublime Text最舒服的主题
  6. jQuery - DOM对象和jQuery对象
  7. php+jquery 上拉加载
  8. 费用流模板(带权二分图匹配)——hdu1533
  9. nginx的配置:目的是使用nginx反向代理后,应用程序获取用户真实ip
  10. css3 鼠标悬浮动画效果