百度首页 | 百度空间
 
查看文章
 
[转载]寻找PsLoadedModuleList
2008-07-25 13:23

1。为什么寻找PsLoadedModuleList?

仅仅是想枚举一下系统加载的模块。在MmGetSystemRoutine函数中使用了PsLoadedModuleList变量。

2。2000和xp的寻找过程。

用IDA反汇编ntoskrnl.exe   。找到MmGetSystemRoutine函数。里面有以下语句。

Win2000:   mov      esi, dword_485B00                        8B 35    00 5B   48 0
                  cmp      esi, offset dword_485B00              81 FE    00 5B 48 00

dword_485B00 是存放PsLoadedModuleList值(00 5B   48 0)的地址。

WinXP:      mov      esi, _PsLoadedModuleList             8B 35   A0 B4 48 00
                 mov      ebx, offset _PsLoadedModuleList   BB       A0 B4 48 00

xp下面好清楚。A0 B4 48 00。

3。程序找就是根据特征字。

首先获取 MmGetSystemRoutine函数地址,然后搜索“8B 35    ”。

4。代码如下:

只在XP测试通过,希望对搜到这篇文章的人有帮助。

#include <ntddk.h>
#include <windef.h>

typedef struct _MODULE_ENTRY {
LIST_ENTRY le_mod;
DWORD   unknown[4];
DWORD   base;
DWORD   driver_start;
DWORD   Size;
UNICODE_STRING driver_Path;
UNICODE_STRING driver_Name;
} MODULE_ENTRY, *PMODULE_ENTRY;

PMODULE_ENTRY PsLoadedModuleList = 0;

void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{


}

NTSTATUS GetPsLoadedModuleList()
{
ULONG SearchP    = 0;
unsigned int i = 0;
ULONG   StartAddr = (ULONG)(MmGetSystemRoutineAddress);

// DbgPrint("MmGetSystemRoutineAddress = %0.8x",StartAddr);

for(   i=0; i<262; i++)
{
   SearchP = StartAddr + i;

   if( *(PUCHAR)SearchP == 0x8B && *((PUCHAR)SearchP+1) == 0x35   )
   // && *(PULONG)((PUCHAR)SearchP+2)== *(PULONG)((PUCHAR)SearchP+7)   在非xp机器,严格条件限制反而找不到
   {
//   DbgPrint("%x\n",*(PULONG)((UCHAR*)SearchP+2));
    PsLoadedModuleList = (PMODULE_ENTRY)(*(PULONG)( *(PULONG)(SearchP+2) ) ); //试出来
    break;
   }
}
return STATUS_SUCCESS;
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
PLIST_ENTRY pLE_tmp;
PMODULE_ENTRY pME_tmp;
UINT i = 0;

pDriverObject->DriverUnload = DriverUnload;

GetPsLoadedModuleList();
// FindPsLoadedModuleList(pDriverObject) ;

DbgPrint("PsLoadedModuleList = %0.8x",PsLoadedModuleList);

pME_tmp = PsLoadedModuleList;
while( pME_tmp->base)
{
   DbgPrint("--%d--",i++);

// DbgPrint( "name:%w\n",&(pME_tmp->driver_Name) );
   KdPrint(("Name:   %wZ\n", &(pME_tmp->driver_Name)));

// DbgPrint( "path:%w\n",&(pME_tmp->driver_Path) );
   KdPrint(("Path:   %wZ\n", &(pME_tmp->driver_Path)));

   DbgPrint( "base:%0.8x\n",pME_tmp->base );
   DbgPrint( "start:%0.8x\n",pME_tmp->driver_start );
   DbgPrint( "size:%x\n",pME_tmp->Size );


   pME_tmp = (PMODULE_ENTRY)pME_tmp->le_mod.Flink ;
}



return STATUS_SUCCESS;
}


类别:Windows Kernel | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu