zoukankan      html  css  js  c++  java
  • 核态获取PsLoadedModuleList地址的稳定方法

    转载: https://blog.csdn.net/celestialwy/article/details/1261407

        PsLoadedModuleList是Windows加载的所有内核模块构成的链表的表头,利用它可以枚举所有这些模块的信息,这些信息可用在AntiRootkit等方面。
        由于Windows 2003 Server SP1开始不再支持用户态访问Physical Memory,所以我这介绍一种在内核态获取PsLoadedModuleList地址的稳定方法。次方法已在Windows XP SP2和Windows 2003 SP1下测试通过。
        代码如下:
       

    typedef struct _LDR_DATA_TABLE_ENTRY {
        LIST_ENTRY InLoadOrderLinks;
        LIST_ENTRY InMemoryOrderLinks;
        LIST_ENTRY InInitializationOrderLinks;
        PVOID DllBase;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        ULONG Flags;
        USHORT LoadCount;
        USHORT TlsIndex;
        union {
            LIST_ENTRY HashLinks;
            struct {
                PVOID SectionPointer;
                ULONG CheckSum;
            };
        };
        union {
            struct {
                ULONG TimeDateStamp;
            };
            struct {
                PVOID LoadedImports;
            };
        };
    } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

    extern PLIST_ENTRY g_PsLoadedModuleList   ;
    PLIST_ENTRY FindPsLoadedModuleList (IN PDRIVER_OBJECT DriverObject)
    {
        PLDR_DATA_TABLE_ENTRY pModuleCurrent = NULL;
        PLDR_DATA_TABLE_ENTRY PsLoadedModuleList = NULL;

        if (DriverObject == NULL)
            return 0;

     

       pModuleCurrent = *((PLDR_DATA_TABLE_ENTRY*)(DriverObject->DriverSection));
        if (pModuleCurrent == NULL)
            return 0;

     

       PsLoadedModuleList = pModuleCurrent;

        while ((PLDR_DATA_TABLE_ENTRY)pModuleCurrent->InLoadOrderLinks.Flink != PsLoadedModuleList)
        {


            if (((pModuleCurrent->SizeOfImage == 0x00000000)
                  && (pModuleCurrent->FullDllName.Length == 0))
                  || (pModuleCurrent->FullDllName.Buffer == NULL))
            {
                return (PLIST_ENTRY) pModuleCurrent;
            }

     

            pModuleCurrent = (PLDR_DATA_TABLE_ENTRY)pModuleCurrent->InLoadOrderLinks.Flink;
        }

        return NULL;
    }

     

        我在测试中发现了这样一个有趣的现象,在Windows 2003 Server SP1下PsLoadedModuleList满足((pModuleCurrent->SizeOfImage == 0x00000000)&& (pModuleCurrent->FullDllName.Length == 0))而在WindowXP SP2PsLoadedModuleList满足(pModuleCurrent->FullDllName.Buffer == NULL)。

     

      转载请注明出处!

    jpg改rar 

  • 相关阅读:
    ES ElasticSearch 7.x 下动态扩大索引的shard数量
    Java框架Spring Boot & 服务治理框架Dubbo & 应用容器引擎Docker 实现微服务发布
    谈一下Docker与Kubernetes集群的日志和日志管理-转载
    Elasticsearch优化 & filebeat配置文件优化 & logstash格式配置 & grok实践
    Nginx错误日志(error_log)配置及信息详解
    赵总的运维体系专栏学习的总结
    APP或者前端通过识别用户代理详细信息和浏览器数据进行安全防御
    Kubernetes使用Eedpoints连接外部服务端口
    CDN域名解析问题
    Istio 实践 之 Circuit breakers 断路器 (请求熔断)
  • 原文地址:https://www.cnblogs.com/kuangke/p/9621494.html
Copyright © 2011-2022 走看看