转载: 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 SP2下PsLoadedModuleList满足(pModuleCurrent->FullDllName.Buffer == NULL)。

转载请注明出处!

jpg改rar 

最新文章

  1. linux 纯字符界面显示中文
  2. 又爱又恨系列之枚举enum
  3. [转]解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离
  4. [C++] 几行代码生成漂亮图片,数学家就是牛!
  5. 如何写计算机会议的rebuttal
  6. A Simple Problem with Integers 多树状数组分割,区间修改,单点求职。 hdu 4267
  7. Mysql中查找并删除重复数据的方法
  8. 如何在linux中搭建JEECMS系统
  9. (转)如何在Excel2013中制作条形码
  10. Objective-C MRC多个对象相互引用的内存管理
  11. hdoj 1564 Play a game
  12. jQuery 事件 方法
  13. 构造NFS
  14. android 界面悬浮框实现
  15. 201521123107 《Java程序设计》第11周学习总结
  16. Linux转发性能评估与优化(转发瓶颈分析与解决方式)
  17. 从程序员的角度设计一个Java的神经网络
  18. Python 函数式编程和面向对象编程
  19. 关于Http协议,你必须要知道的
  20. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

热门文章

  1. .net core程序中使用微软的依赖注入框架
  2. ERROR: While executing gem … (Gem::RemoteFetcher::FetchError)
  3. Android 编程下 WebView 加载一个网页如何得到网页的 Cookie 值
  4. HTML5 background-color和background-image问题共用问题
  5. Spring Boot中CrudRepository与JpaRepository Dao中JpaRepository和JpaSpecificationExecutor查询
  6. escape()、encodeURI()、encodeURIComponent()区别详解 (转)
  7. Dictionary简洁
  8. 原创:vsphere概念深入系列三:vSphere命令行管理
  9. 〖Linux〗Kubuntu 14.04的Eclipse 崩溃解决方法总结
  10. 使用quicklz缩小程序体积