EreTIk's Box » Cтатьи, исходники » Потроха отладчика в помощь при исследовании внутренностей ядра


Всем хорошо известен экспортируемый символ ядра CCHAR KeNumberProcessors - переменная, содержащая количество процессоров. Так же не является тайной, что последние версии Windows поддерживают количество процессоров, выходящее за пределы разрядной сетки одного байта. Так а что же стало с переменной? Документация гласит, что переменная стала obsolete. Но взглянем на использование этой переменной в Windows 2008 R2 (начало функции nt!ExSizeOfRundownProtectionCacheAware):


  mov          ecx,[KeNumberProcessors]
  cmp          ecx,1
                

По приведенному коду сразу становится видно, что глобальная переменная nt!KeNumberProcessors стала четыре байта. И тут возник вопрос: когда это произошло? Можно, конечно, пройтись дизассемблером по коллекции файлов ядра, если она под рукой. Но мне пришла в голову другая идея - отладчик. Ведь он умеет определять количество процессоров, и делает он это точно не вызовом KeGetCurrentProcessorNumber(). Ответ можно найти в коде функции kdexts!GetProcessorCount:


  cmp          d,[g_BuildNo],000001900 ; == 6400
  push         esi
  jnc         .0100EEEB9 --1
  mov          esi,01004A508 ;'nt!KeNumberProcessors'
  push         esi
  call         d,[01013D2F8]
  mov          ecx,eax
  or           ecx,edx
  jnz         .0100EEEAD --3
  push         esi
  push         01004A378 ;'unable to get %s'
  call         d,[01013D2F4]
  pop          ecx
  pop          ecx
  xor          al,al
  jmp         .0100EEEB4 --5
3 push         edx
  push         eax
  call         GetByteFromAddress
5 movzx        eax,al
  pop          esi
  retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
1 push         01004A508 ;'nt!KeNumberProcessors'
  call         GetUlongValue
  pop          esi
  retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^- 
                

Сразу становится понятно, что nt!KeNumberProcessors стала ULONG'ом в ядре с номером сборки 6400. Так что отладчик может пригодится не только как средство, но и как объект изучения ядра Windows.


P.S. Файл kdexts.dll является реализацией основных встроенных расширений отладки ядра. Сам файл можно найти в поддиректории winxp директории WinDbg.


ΞρεΤΙκ