Sunday, April 3, 2011

Способ передачи була по ntkernl-овски

В семерке оригинально реализован сабж. Вот так выглядит экспортируемая функция RtlPrefetchMemoryNonTemporal в памяти:
kd> u 0x82603000+FB9A*4
nt!RtlPrefetchMemoryNonTemporal:
82641e68 90 nop
82641e69 a1b4aa7282 mov eax,[nt!KePrefetchNTAGranularity (8272aab4)]
82641e6e 0f184100 prefetchnta byte ptr [ecx]
82641e72 03c8 add ecx,eax
82641e74 2bd0 sub edx,eax
82641e76 77f6 ja nt!RtlPrefetchMemoryNonTemporal+0x6 (82641e6e)
82641e78 c3 ret
82641e79 90 nop
А вот так она же выглядит на диске:
kd> u 0x00050800+FB9A*4
0008f668 c3 ret
0008f669 a1b4aa7282 mov eax,[nt!KePrefetchNTAGranularity (8272aab4)]
0008f66e 0f184100 prefetchnta byte ptr [ecx]
0008f672 03c8 add ecx,eax
0008f674 2bd0 sub edx,eax
0008f676 77f6 ja 0008f66e
0008f678 c3 ret
0008f679 90 nop
_Winnie C++ Colorizer

WRK объясняет, откуда взялось отличие - ntldr таким чудесным образом передает знание о свойствах процессора непосредственно ядру. Т.е. он делает что-то в духе:
*(char*)GetProcAddr(ntosBase, "RtlPrefetchMemoryNonTemporal") = 0xC3
Как по мне, через именованную секцию данных было бы красивее, но и так тоже ничего

No comments: