Windbg Scripting
Aunque el lenguaje de scripting del Windbg no es precisamente una maravilla, si se usa el Windbg con la suficiente frecuencia siempre acaba siendo conveniente tener tus scripts para llevar a cabo algunas tareas repetitivas.
Un ejemplo tipico es el caso en el que cargas un ejecutable dentro del Windbg y quieres comenzar poniendo BreakPoins hardware. Como el punto en el que el Loader de Windows ejecuta el DebugBreak es anterior al punto en el que se inicializa el contexto del hilo principal del programa, tus BreakPoints hadware desapareceran.
Una forma de solucionar ese problema es, por ejemplo, poner un BreakPoint en el EntryPoint de la aplicacion que queremos depurar y poner los BreakPoints hardware una vez que hayamos alcanzado dicho punto. Tener un Script que te ponga un punto de ruptura en el EntryPoint de la aplicacion simplifica muchisimo esta tarea:
{
r? $t0 = &@$peb->Ldr->InLoadOrderModuleList
r? $t0 = *(ntdll!_LDR_DATA_TABLE_ENTRY**)@$t0;
as /x ${/v:$Base} @@c++(@$t0->DllBase)
as /msu ${/v:$Mod} @@c++(&@$t0->FullDllName)
.block
{
.echo ${$Mod} at ${$Base}
r $t0 = ${$Base} + poi(${$Base} + 3c)
.printf "PeHeader at: %p \n", @$t0
r $t1 = ${$Base} + poi(@$t0 + 28)
.printf "Entry point found at %p \n", @$t1
bp @$t1
}
ad ${/v:$Base}
ad ${/v:$Mod}
}
Un ejemplo de uso de este script depurando la calculadora de windows:
0:000> .reload
Reloading current modules
………..
0:000> $$>a<c:\ep.wds
C:\WINDOWS\system32\calc.exe at 0x1000000
PeHeader at: 010000f0
Entry point found at 01012475
A mi personalmente me gusta mas el sistema de extensiones del Windbg, pero tengo que reconocer que para algunas cosas en las que no te quieres complicar mucho la vida, los scripts de Windbg pueden estar bien :o)