Оказывается, в ядре windows есть и поддержка Branch Tracing(начиная с висты).
Этой функциональностью пользуется driver verifier:
На этапе инициализации:
IoInitSystem(...)
{
...
if ( ViVerifierEnabled )
VfNotifyVerifierOfEvent(0); // initialize branch tracing
...
}
Phase1InitializationDiscard(...):
{
...
push 5
pop eax
call VfNotifyVerifierOfEvent(x) // start branch tracing
...
}
VOID VfNotifyVerifierOfEvent( ULONG eventId )
{
switch ( eventId )
{
case 0:
VfInitializeBranchTracing();
break;
...
case 5:
VfStartBranchTracing();
break;
}
}
Включение branch tracing:
VfStartBranchTracing
{
...
push 0
push 0C0h
push 1D9h // IA32_DEBUGCTL
WRMSR(x,x,x)
...
}
К сожалению, чаще всего драйвера тестируются на виртуалках, а там branch tracing не поддерживается, поэтому полноценно поиграться с ним не выйдет.
Этой функциональностью пользуется driver verifier:
На этапе инициализации:
IoInitSystem(...)
{
...
if ( ViVerifierEnabled )
VfNotifyVerifierOfEvent(0); // initialize branch tracing
...
}
Phase1InitializationDiscard(...):
{
...
push 5
pop eax
call VfNotifyVerifierOfEvent(x) // start branch tracing
...
}
VOID VfNotifyVerifierOfEvent( ULONG eventId )
{
switch ( eventId )
{
case 0:
VfInitializeBranchTracing();
break;
...
case 5:
VfStartBranchTracing();
break;
}
}
Включение branch tracing:
VfStartBranchTracing
{
...
push 0
push 0C0h
push 1D9h // IA32_DEBUGCTL
WRMSR(x,x,x)
...
}
К сожалению, чаще всего драйвера тестируются на виртуалках, а там branch tracing не поддерживается, поэтому полноценно поиграться с ним не выйдет.
В VirtualBox(http://artem.ufoctf.ru/?p=502) можно прокинуть msr и попробовать.
ОтветитьУдалитьСпасибо за инфу.