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;I/O管理器在装载驱动时,首先调用IopLoadDriver()函数,该函数执行一下功能 1. 确定要装载的驱动名称,查询该驱动是否已经被装载。系统中包含一个已经装载的驱动链表,I/O管理器是通过查询这个链表确定驱动是否被装载的,如果已经被装载,则返回成功;另外注册表中也必须配置相关的信息 2. 如果驱动没有被装载,I/O管理器请求虚拟存储管理器(VMM)将驱动可执行文件映射到内存中,VMM在映射时检查该文件是否为可用的PE格式,如果不是,VMM使请求失败,驱动装载失败 3. I/O管理器通过对象管理器创建驱动对象,该驱动对象存储在非分页内存池中,因此任意IRQL都可以访问 4. I/O管理器将驱动对象结构清零,MajorFunction中的每一个元素被设置为IopInvalidDeiviceRequest()。该函数仅仅返回STATUS_INVALID_DEVICE_REQUEST状态码 5. I/O管理器将DriverInit字段设置为驱动的入口程序(DriverEntry),DriverSection被初始化为驱动的Section对 象指针,该section对象指向驱动的可执行文件;DriverStart设置为驱动映像的基址;DriverSize被设置为驱动映像的尺寸。 6. I/O管理器将该驱动对象插到 NT Object Manager维护的驱动列表中 7. HardwareDatabase字段初始化为Configuration Manager的硬件配置信息。底层驱动可以使用这个字段决定驱动启动顺序的配置;DriverName也被初始化,这样错误记录服务可以记录相关的信息 8. I/O 管理器调用驱动初始化程序。该初始化程序总是在系统进程中IRQL_PASSIVE_LEVEL级别被调用。 |
通过DriverSection链表遍历系统模块
GetImageBase_M proc
LOCAL LinkHead:ULONG LOCAL FileName:UNICODE_STRING ;;eax = DRIVER_OBJECT->DriverSection mov eax,pDrvObj mov eax,[eax+14h] ;; 遍历LDR_DATA_TABLE_ENTRY->InLoadOrderLinks链表 mov LinkHead,eax mov ebx,[eax] ;; eax=eax->Flink .while ebx != LinkHead mov esi,ebx add esi,24h assume esi:ptr UNICODE_STRING invoke DbgPrint,$CTA0("\n---%ws\n"), [esi].Buffer mov ebx,[ebx] ;; eax=eax->Flink .endw ret GetImageBase_M endp 以下是显示结果: ---(null) ---\WINDOWS\system32\ntkrnlpa.exe ---\WINDOWS\system32\hal.dll ---\WINDOWS\system32\KDCOM.DLL ---\WINDOWS\system32\BOOTVID.dll ---ACPI.sys ---\WINDOWS\system32\DRIVERS\WMILIB.SYS ---pci.sys ---isapnp.sys ---compbatt.sys ---\WINDOWS\system32\DRIVERS\BATTC.SYS ---pciide.sys ---\WINDOWS\system32\DRIVERS\PCIIDEX.SYS ---intelide.sys ---MountMgr.sys ---ftdisk.sys ---dmload.sys ---dmio.sys ---PartMgr.sys ---ACPIEC.sys ---\WINDOWS\System32\DRIVERS\OPRGHDLR.SYS ---nvrd32.sys ---\WINDOWS\system32\DRIVERS\CLASSPNP.SYS ---VolSnap.sys ---atapi.sys ---iastor7.sys ---vmscsi.sys ---\WINDOWS\system32\DRIVERS\SCSIPORT.SYS ---viamraid.sys ---disk.sys ---fltMgr.sys ---KSecDD.sys ---usbohci.sys ---\WINDOWS\system32\DRIVERS\USBPORT.SYS ---mouhid.sys ---\WINDOWS\system32\DRIVERS\HIDPARSE.SYS ---kbdhid.sys ---Ntfs.sys ---NDIS.sys ---hidusb.sys ---\WINDOWS\system32\DRIVERS\HIDCLASS.SYS ---\WINDOWS\system32\DRIVERS\USBD.SYS ---RsNTGdi.sys ---Mup.sys ---agp440.sys ---\SystemRoot\system32\DRIVERS\intelppm.sys ---\SystemRoot\system32\DRIVERS\i8042prt.sys ---\SystemRoot\system32\DRIVERS\kbdclass.sys ---\SystemRoot\system32\DRIVERS\vmmouse.sys ---\SystemRoot\system32\DRIVERS\mouclass.sys ---\SystemRoot\system32\DRIVERS\parport.sys ---\SystemRoot\system32\DRIVERS\serial.sys ---\SystemRoot\system32\DRIVERS\serenum.sys ---\SystemRoot\system32\DRIVERS\fdc.sys ---\SystemRoot\system32\DRIVERS\cdrom.sys ---\SystemRoot\system32\DRIVERS\redbook.sys ---\SystemRoot\system32\DRIVERS\ks.sys ---\SystemRoot\system32\DRIVERS\usbuhci.sys ---\SystemRoot\system32\DRIVERS\vmx_svga.sys ---\SystemRoot\system32\DRIVERS\VIDEOPRT.SYS ---\SystemRoot\system32\DRIVERS\vmxnet.sys ---\SystemRoot\system32\drivers\es1371mp.sys ---\SystemRoot\system32\drivers\portcls.sys ---\SystemRoot\system32\drivers\drmk.sys ---\SystemRoot\system32\DRIVERS\usbehci.sys ---\SystemRoot\system32\DRIVERS\CmBatt.sys ---\SystemRoot\system32\DRIVERS\fsvga.sys ---\SystemRoot\system32\DRIVERS\audstub.sys ---\SystemRoot\system32\DRIVERS\rasl2tp.sys ---\SystemRoot\system32\DRIVERS\ndistapi.sys ---\SystemRoot\system32\DRIVERS\ndiswan.sys ---\SystemRoot\system32\DRIVERS\raspppoe.sys ---\SystemRoot\system32\DRIVERS\raspptp.sys ---\SystemRoot\system32\DRIVERS\TDI.SYS ---\SystemRoot\system32\DRIVERS\psched.sys ---\SystemRoot\system32\DRIVERS\msgpc.sys ---\SystemRoot\system32\DRIVERS\ptilink.sys ---\SystemRoot\system32\DRIVERS\raspti.sys ---\SystemRoot\system32\DRIVERS\rdpdr.sys ---\SystemRoot\system32\DRIVERS\termdd.sys ---\SystemRoot\system32\DRIVERS\swenum.sys ---\SystemRoot\system32\DRIVERS\update.sys ---\SystemRoot\system32\DRIVERS\mssmbios.sys ---\SystemRoot\system32\DRIVERS\usbhub.sys ---\SystemRoot\System32\Drivers\NDProxy.SYS ---\SystemRoot\system32\DRIVERS\gameenum.sys ---\SystemRoot\System32\Drivers\Fs_Rec.SYS ---\SystemRoot\System32\Drivers\Null.SYS ---\SystemRoot\System32\Drivers\Beep.SYS ---\SystemRoot\System32\drivers\vga.sys ---\SystemRoot\System32\Drivers\mnmdd.SYS ---\SystemRoot\System32\DRIVERS\RDPCDD.sys ---\SystemRoot\System32\Drivers\Msfs.SYS ---\SystemRoot\System32\Drivers\Npfs.SYS ---\SystemRoot\system32\DRIVERS\rasacd.sys ---\SystemRoot\system32\DRIVERS\ipsec.sys ---\SystemRoot\system32\DRIVERS\tcpip.sys ---\SystemRoot\system32\DRIVERS\ipnat.sys ---\SystemRoot\system32\DRIVERS\netbt.sys ---\SystemRoot\system32\DRIVERS\wanarp.sys ---\SystemRoot\System32\drivers\afd.sys ---\SystemRoot\system32\DRIVERS\netbios.sys ---\??\C:\WINDOWS\system32\Drivers\safeboxkrnl.sys ---\SystemRoot\system32\DRIVERS\rdbss.sys ---\SystemRoot\system32\DRIVERS\mrxsmb.sys ---\SystemRoot\system32\drivers\HookSys.sys ---\SystemRoot\system32\drivers\HOOKHELP.sys ---\SystemRoot\system32\drivers\HookCont.sys ---\SystemRoot\System32\Drivers\Fips.SYS ---\SystemRoot\System32\Drivers\Fastfat.SYS ---\SystemRoot\System32\win32k.sys ---\SystemRoot\System32\drivers\Dxapi.sys ---\SystemRoot\System32\watchdog.sys ---\SystemRoot\System32\drivers\dxg.sys ---\SystemRoot\System32\drivers\dxgthk.sys ---\SystemRoot\System32\vmx_fb.dll ---\SystemRoot\system32\DRIVERS\ndisuio.sys ---\SystemRoot\System32\DRIVERS\hgfs.sys ---\SystemRoot\system32\drivers\wdmaud.sys ---\SystemRoot\system32\drivers\sysaudio.sys ---\SystemRoot\System32\Drivers\ParVdm.SYS ---\??\C:\Program Files\VMware\VMware Tools\Drivers\memctl\vmmemctl.sys ---\SystemRoot\system32\DRIVERS\srv.sys