驱动开发:内核监视LoadImage映像回调

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

在笔者上一篇文章《驱动开发:内核注册并监控对象回调》介绍了如何运用ObRegisterCallbacks注册进程与线程回调,并通过该回调实现了拦截指定进行运行的效果,本章LyShark将带大家继续探索一个新的回调注册函数,PsSetLoadImageNotifyRoutine常用于注册LoadImage映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。
监视模块加载与卸载需要费别使用两个函数,这两个函数的参数传递都是自己的回调地址。

  • PsSetLoadImageNotifyRoutine 设置回调
  • PsRemoveLoadImageNotifyRoutine 移除回调
此处MyLySharkLoadImageNotifyRoutine回调地址必须有三个参数传递组成,其中FullImageName代表完整路径,ModuleStyle代表模块类型,一般来说ModuleStyle=0表示加载SYS驱动,如果ModuleStyle=1则表示加载的是DLL,最后一个参数ImageInfo则是映像的详细参数结构体。
  1. VOID MyLySharkLoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ModuleStyle, PIMAGE_INFO ImageInfo)
复制代码
那么如何实现监视映像加载呢,来看如下完整代码片段,首先PsSetLoadImageNotifyRoutine注册回调,当有模块被加载则自动执行MyLySharkLoadImageNotifyRoutine回调函数,其内部首先判断ModuleStyle得出是什么类型的模块,然后再通过GetDriverEntryByImageBase拿到当前进程详细参数并打印输出。
  1. // 署名权
  2. // right to sign one's name on a piece of work
  3. // PowerBy: LyShark
  4. // Email: me@lyshark.com
  5. #include <ntddk.h>
  6. #include <ntimage.h>
  7. // 未导出函数声明
  8. PUCHAR PsGetProcessImageFileName(PEPROCESS pEProcess);
  9. // 获取到镜像装载基地址
  10. PVOID GetDriverEntryByImageBase(PVOID ImageBase)
  11. {
  12.         PIMAGE_DOS_HEADER pDOSHeader;
  13.         PIMAGE_NT_HEADERS64 pNTHeader;
  14.         PVOID pEntryPoint;
  15.         pDOSHeader = (PIMAGE_DOS_HEADER)ImageBase;
  16.         pNTHeader = (PIMAGE_NT_HEADERS64)((ULONG64)ImageBase + pDOSHeader->e_lfanew);
  17.         pEntryPoint = (PVOID)((ULONG64)ImageBase + pNTHeader->OptionalHeader.AddressOfEntryPoint);
  18.         return pEntryPoint;
  19. }
  20. // 获取当前进程名
  21. UCHAR* GetCurrentProcessName()
  22. {
  23.         PEPROCESS pEProcess = PsGetCurrentProcess();
  24.         if (NULL != pEProcess)
  25.         {
  26.                 UCHAR *lpszProcessName = PsGetProcessImageFileName(pEProcess);
  27.                 if (NULL != lpszProcessName)
  28.                 {
  29.                         return lpszProcessName;
  30.                 }
  31.         }
  32.         return NULL;
  33. }
  34. // 设置自己的回调函数
  35. VOID MyLySharkLoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ModuleStyle, PIMAGE_INFO ImageInfo)
  36. {
  37.         PVOID pDrvEntry;
  38.         // MmIsAddress 验证地址可用性
  39.         if (FullImageName != NULL && MmIsAddressValid(FullImageName))
  40.         {
  41.                 // ModuleStyle为零表示加载sys
  42.                 if (ModuleStyle == 0)
  43.                 {
  44.                         // 得到装载主进程名
  45.                         UCHAR *load_name = GetCurrentProcessName();
  46.                         pDrvEntry = GetDriverEntryByImageBase(ImageInfo->ImageBase);
  47.                         DbgPrint("[LyShark SYS加载] 模块名称:%wZ --> 装载基址:%p --> 镜像长度: %d --> 装载主进程: %s \n", FullImageName, pDrvEntry, ImageInfo->ImageSize, load_name);
  48.                 }
  49.                 // ModuleStyle非零表示加载DLL
  50.                 else
  51.                 {
  52.                         // 得到装载主进程名
  53.                         UCHAR *load_name = GetCurrentProcessName();
  54.                         pDrvEntry = GetDriverEntryByImageBase(ImageInfo->ImageBase);
  55.                         DbgPrint("[LyShark DLL加载] 模块名称:%wZ --> 装载基址:%p --> 镜像长度: %d --> 装载主进程: %s \n", FullImageName, pDrvEntry, ImageInfo->ImageSize, load_name);
  56.                 }
  57.         }
  58. }
  59. VOID UnDriver(PDRIVER_OBJECT driver)
  60. {
  61.         PsRemoveLoadImageNotifyRoutine((PLOAD_IMAGE_NOTIFY_ROUTINE)MyLySharkLoadImageNotifyRoutine);
  62.         DbgPrint("[LyShark.com] 驱动卸载完成...");
  63. }
  64. NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
  65. {
  66.         DbgPrint("hello lyshark.com \n");
  67.         PsSetLoadImageNotifyRoutine((PLOAD_IMAGE_NOTIFY_ROUTINE)MyLySharkLoadImageNotifyRoutine);
  68.         DbgPrint("[LyShark.com] 驱动加载完成...");
  69.         Driver->DriverUnload = UnDriver;
  70.         return STATUS_SUCCESS;
  71. }
复制代码
运行这个驱动程序,则会输出被加载的驱动详细参数。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表