Модифицируя код или данные ядра, необходимо быть на 100% уверенным, что в данный момент времени их не использует никакой другой поток. Невыполнение этого условия приводит к непредсказуемому поведению системы. В лучшем случае – к голубому экрану, в худшем — к потери всего дискового тома (особенно, если мы вмешиваемся в файловые операции). Проблема возникает как на многопроцессорных, так и на однопроцессорных системах без поддержки Hyper Heading, причем универсальных путей выхода из ситуации не существует. Каждый случай требует индивидуального подхода, описание которого тянет на целую статью, а поэтому здесь не рассматривается.
Анализ исходных текстов (или драйверов) великих гуру далеко не всегда идет на пользу начинающим хакерам. На то они и гуру, чтобы знать, какими трюками когда можно пользоваться, а когда нет. Начинающие же обычно запоминают лишь сам трюк, а о границах его применимости зачастую даже не догадываются. В частности, в ранних версиях свой утилиты DbgView Марк Руссинович вставлял в начало ядерной функции DbgPring команду перехода на свой обработчик (см. листинг 3).
.text:00010646 B8 D4 0A 01+ mov eax, offset loc_10AD4 ; jmp:DbgPrint
.text:0001064B 8B 40 02 mov eax, [eax+2] ; операнд jmp:[DbgPrint]
.text:0001064E A3 A8 0B 01+ mov _pDbgPrn, eax
.text:00010653 8B 08 mov ecx, [eax] ; DbgPrint
.text:00010655 89 0D A8 0B+ mov _pDbgPrn, ecx
.text:0001065B 8A 41 01 mov al, [ecx+1] ; второй
байт DbgPrint
.text:0001065E 3C 8D cmp al, 8Dh ; PUSH EBP/MOV EBP,ESP
.text:00010660 75 04 jnz short loc_10666