这图做PPT时自己画的,利用的是内核中FS指向kpcr。
1、对于combojiang大侠给出的系统地址空间分布,有没有windows版本或者是平台
的差异性?还是说这是intel本身的架构?
特指windows平台。“我们的驱动程序就是加载在系统布局图的80000000h到a0000000h的区间中”这不准确,看了WRK中NtLoadDriver的实现,确定加载驱动基址是在MiLoadImageSection函数中
以下是WRK中部分代码(有删除):
FirstPte = MiReserveSystemPtes (NumberOfPtes, SystemPteSpace);
PointerPte = FirstPte;
SystemVa = MiGetVirtualAddressMappedByPte (PointerPte);
*ImageBaseAddress = SystemVa;
MiReserveSystemPtes 从系统PTE中申请NumberOfPtes个页面,系统PTE的起始地址由MmNonPagedSystemStart指定,不会低于MM_LOWEST_NONPAGED_SYSTEM_START(0xEB000000),所以我们的驱动程序加载地址不会小于0xEB000000(当然,对ntoskrnl不适用
)。系统PTE的结束地址在MmNonPagedPoolExpansionStart之前,另外还有一个叫系统PTE额外区,详细介绍可以参考《Windows内核原理与实现》P223 4.2.3系统PTE区域的管理
ImageBaseAddress 为驱动加载的基址
以ntkrnlpa.5.1.2600.6055为例,在805A3C0E处调用MiReserveSystemPtes,返回值左移9位就是驱动的加载基址,
PAGE:805A3C0E call _MiReserveSystemPtes@8
windbg中调用堆栈,
kd> kp
ChildEBP RetAddr
f7a40ac4 805a4d81 nt!MiLoadImageSection+0xea
f7a40c6c 80577595 nt!MmLoadSystemImage+0x4c9
f7a40d4c 805779a1 nt!IopLoadDriver+0x371
f7a40d74 80535ca0 nt!IopLoadUnloadDriver+0x45
f7a40dac 805c72c2 nt!ExpWorkerThread+0x100
f7a40ddc 80542e82 nt!PspSystemThreadStartup+0x34
00000000 00000000 nt!KiThreadStartup+0x16
2、下面combojiang大侠补充说,并没有考虑到多核的情况是怎么一回事?
ntoskrnl.exe单核,没有启用PAE
ntkrnlpa.exe单核,启用PAE
ntkrnlmp.exe多核,没有启用PAE
ntkrpamp.exe多核,启用PAE
Intel的CPU,双核情况下,系统安装时将ntkrnlmp.exe拷贝为ntoskrnl.exe,系统加载时加载这个(原来是ntkrnlmp.exe的)ntoskrnl.exe。
所以Intel双核情况下,内核文件名仍然是ntoskrnl.exe,但是其源文件名是ntkrnlmp.exe,如果加载符号,符号文件名也是ntkrnlmp.pdb。
因此单核双核下都叫ntoskrnl.exe是正确的。
http://bbs.pediy.com/showthread.php?t=97717
3、下面回复中,说到了内核中FS指向的问题,不知道有没有详细一点的资料?
内核中FS指向kpcr,用户态指向TEB