我写了一个C工具来混淆一下windows内核。 现在我们可以看到在“PAGE”部分有几个函数,这意味着内核的这个函数可以被调出。 我知道他们的地址,因为我可以在内存中读取Windows内核的PE头。 (不可分页以及主要的.text部分)。
所以这里是我的问题:我需要做什么才能调用Windows内核(从我的驱动程序)的pagable函数。 更确切地说,我必须做些什么来确保函数目前被作为可执行内存分页和驻留? 当这些function被分页时,偶尔会出现BSOD。 有没有一个方便的方法来完成? (而不是内核文本部分的“MmProbeAndLockPages”部分,称为“PAGE”)。
提示:我不使用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
一般来说,你不需要做任何事情来让代码分页 – 内存管理器将为你照顾。
但是,如果代码被标记为可分页,则意味着只有当系统处于小于DISPATCH_LEVEL的IRQL时才能调用该函数。 所以你希望能够在更高的IRQL上运行的代码不应该被标记为可分页的。
您可以使用MmLockPagableCodeSection()
(请参阅http://msdn.microsoft.com/en-us/library/windows/hardware/ff554307.aspx )动态锁定可分页代码,但是我认为这种控制级别可能只需要很少。
您可以使用驱动程序验证器与“强制IRQL检查”来帮助更确定地检测何时可以在高IRQL调用可分页的代码。