2012-01-26 1 views
3

Я написал инструмент C, чтобы немного поработать с ядром Windows. Теперь, как мы видим, в разделе «PAGE» есть несколько функций, что означает, что эти функции ядра можно выгрузить. Я знаю их адрес, потому что я могу читать PE-заголовок ядра Windows в памяти. (нестранимый, а также основной раздел .text).Windows (64) Kernel Driver and pagable Функции

Итак, вот мой вопрос: что мне нужно сделать, чтобы вызвать pagable функцию ядра windows (из моего драйвера). Точнее, что мне нужно сделать, чтобы гарантировать, что функция в настоящее время выгружается и резидентна как исполняемая память? Иногда я получаю BSOD, когда эти функции выгружаются. Есть ли удобный способ достичь этого? (вместо «MmProbeAndLockPages» для текстового раздела ядра, называемого «PAGE»).

Подсказка: я не использую инструменты для Windows. Мне нужно, чтобы выполнить это в простом старом C (MinGW ToolChain)

С уважением, Майкл


./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: <[email protected]> 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 

ответ

5

Как правило, вы не должны ничего делать, чтобы получить код перемещаемый в - память менеджер позаботится об этом для вас.

Однако, если код помечен как доступный для страницы, это означает, что функция может быть вызвана только тогда, когда система находится на IRQL меньше, чем DISPATCH_LEVEL. Таким образом, любой код, который вы хотите запускать на более высоком IRQL, не должен быть помечен как страница.

Вы можете динамически заблокировать код с помощью MmLockPagableCodeSection() (см. http://msdn.microsoft.com/en-us/library/windows/hardware/ff554307.aspx), но я думаю, что уровень контроля, вероятно, необходим только редко.

Вы можете использовать Driver Verifier с «Force IRQL Checking», чтобы помочь более детерминистически обнаруживать, когда у вас есть код, который вызывается на высоком IRQL.

+0

Теперь MmProbeAndLock для работы с ядром работал на меня. Я предполагаю, что MmLockPagableCodeSection также является способом. Я использую самый низкий IRQL. Но все же мне нужно ProbeAndLock в другом, чтобы получить страницу. Если я этого не сделаю, система иногда возвращает мне читаемое мертвое пространство. Я также заметил изменения в поведении при выполнении подкачки ядра внутри VM или Host CPU. – willsteel