【问题标题】:Windows (64) Kernel Driver and pagable FunctionsWindows (64) 内核驱动程序和可分页函数
【发布时间】:2012-02-19 16:20:38
【问题描述】:

我写了一个 C 工具来稍微弄乱 Windows 内核。现在我们可以看到“PAGE”部分中有几个函数,这意味着内核的这些函数可以被分页。我知道他们的地址,因为我可以在内存中读取 Windows 内核的 PE 标头。 (不可分页以及主要的 .text 部分)。

所以这是我的问题:我必须做什么才能调用 Windows 内核的可分页函数(来自我的驱动程序)。更准确地说,我必须做些什么来确保该函数当前被分页并作为可执行内存驻留?当这些功能被调出时,我偶尔会得到 BSOD。有没有一种方便的方法来做到这一点? (而不是称为“PAGE”的内核文本部分的“MmProbeAndLockPages”)。

提示:我没有使用 Windows 工具。我需要在普通的旧 C(MinGW 工具链)中完成这一点

问候, 迈克尔


./bin/asmdiff.exe info -s /cygdrive/c/Windows/winsxs/amd64_microsoft-windows-os-kernel_31bf3856ad364e35_6.1.7601.17514_none_ca56670fcac29ca9/ntoskrnl.exe 

Trying to get Information for file: /cygdrive/c/Windows/winsxs/amd64_microsoft-windows-    os-kernel_31bf3856ad364e35_6.1.7601.17514_none_ca56670fcac29ca9/ntoskrnl.exe...

BinaryFormat: PE_64

######### Dumping PE64-File sections: #########

Section 0: <.text> base:0x0000000140001000 len:1712881
Section 1: <INITKDBG▒9> base:0x00000001401A4000 len:14768
Section 2: <POOLMI> base:0x00000001401A8000 len:7197
Section 3: <POOLCODE base:0x00000001401AA000 len:11803
Section 4: <RWEXEC> base:0x00000001401AD000 len:4096
Section 5: <.rdata> base:0x00000001401AE000 len:252272
Section 6: <.data> base:0x00000001401EC000 len:603464
Section 7: <.pdata> base:0x0000000140280000 len:196824
Section 8: <ALMOSTRO▒> base:0x00000001402B1000 len:7664
Section 9: <SPINLOCK@> base:0x00000001402B3000 len:6464
Section 10: <PAGELK> base:0x00000001402B5000 len:85739
Section 11: <PAGE> base:0x00000001402CA000 len:2317806
Section 12: <PAGEKD> base:0x0000000140500000 len:19442
Section 13: <PAGEVRFY▒> base:0x0000000140505000 len:136619
Section 14: <PAGEHDLS▒'> base:0x0000000140527000 len:10199
Section 15: <PAGEBGFXLf> base:0x000000014052A000 len:26188
Section 16: <PAGEVRFB> base:0x0000000140531000 len:13312
Section 17: <.edata> base:0x0000000140535000 len:67960
Section 18: <PAGEDATA> base:0x0000000140546000 len:56576
Section 19: <PAGEVRFC)> base:0x0000000140554000 len:10526
Section 20: <PAGEVRFDP> base:0x0000000140557000 len:4688
Section 21: <INIT> base:0x0000000140559000 len:357788
Section 22: <.rsrc> base:0x00000001405B1000 len:221024
Section 23: <.reloc> base:0x00000001405E7000 len:8304

【问题讨论】:

    标签: c windows kernel driver wdk


    【解决方案1】:

    一般情况下,您不需要做任何事情来获取代码分页 - 内存管理器会为您处理这些。

    但是,如果代码被标记为可分页,这意味着该函数只能在系统处于低于 DISPATCH_LEVEL 的 IRQL 时调用。因此,您希望能够以更高的 IRQL 运行的任何代码都不应标记为可分页。

    您可以使用MmLockPagableCodeSection()(参见http://msdn.microsoft.com/en-us/library/windows/hardware/ff554307.aspx)动态锁定可分页代码,但我认为这种级别的控制可能很少需要。

    您可以将驱动程序验证程序与“强制 IRQL 检查”结合使用,以帮助更确定地检测何时有以高 IRQL 调用的可分页代码。

    【讨论】:

    • 现在,内核部分的 MmProbeAndLock 对我有用。我猜 MmLockPagableCodeSection 也是一种方式。我正在使用最低的 IRQL。但我仍然需要 ProbeAndLock 才能获取页面。如果我不这样做,系统有时会返回我可读的死区。我还注意到在 VM 或主机 CPU 中进行内核分页时的行为发生了变化。
    猜你喜欢
    • 2011-03-24
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多