查看文章 |
1。为什么寻找PsLoadedModuleList? 仅仅是想枚举一下系统加载的模块。在MmGetSystemRoutine函数中使用了PsLoadedModuleList变量。 2。2000和xp的寻找过程。 用IDA反汇编ntoskrnl.exe 。找到MmGetSystemRoutine函数。里面有以下语句。 Win2000: mov esi, dword_485B00 8B 35 00 5B 48 0 dword_485B00 是存放PsLoadedModuleList值(00 5B 48 0)的地址。 WinXP: mov esi, _PsLoadedModuleList 8B 35 A0 B4 48 00 xp下面好清楚。A0 B4 48 00。 3。程序找就是根据特征字。 首先获取 MmGetSystemRoutine函数地址,然后搜索“8B 35 ”。 4。代码如下: 只在XP测试通过,希望对搜到这篇文章的人有帮助。 #include <ntddk.h> typedef struct _MODULE_ENTRY { PMODULE_ENTRY PsLoadedModuleList = 0; void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
NTSTATUS GetPsLoadedModuleList() // DbgPrint("MmGetSystemRoutineAddress = %0.8x",StartAddr); for( i=0; i<262; i++) if( *(PUCHAR)SearchP == 0x8B && *((PUCHAR)SearchP+1) == 0x35 )
pDriverObject->DriverUnload = DriverUnload; GetPsLoadedModuleList(); DbgPrint("PsLoadedModuleList = %0.8x",PsLoadedModuleList); pME_tmp = PsLoadedModuleList; // DbgPrint( "name:%w\n",&(pME_tmp->driver_Name) ); // DbgPrint( "path:%w\n",&(pME_tmp->driver_Path) ); DbgPrint( "base:%0.8x\n",pME_tmp->base );
|