Aşağıdaki windbg script , recv() ve send() fonksiyonlarına breakpoint koyup , buf() argümanlarını dump etmektedir. Özellikle client ve server’ın aynı windows üzerinde çalıştığı zaman yani loopback network paketlerini dump etmek için basit bir çözüm olabilir.Wireshark loopback paketlerini malesef yakalayamıyordu en son baktığımda.
Tabi aşağıdaki script recv() ‘ e breakpoint koyuyor. Recv() yerine WSARecv vb. fonksiyonlar ya da ReadFile gibi bir API da kullanılabilir. Asıl amaç network paketi dump etmek değil tabi , örnek bir windbg scripti yazmak.
Çünkü windbg scripting bazı süreçleri otomatize etmekte oldukça işe yarıyor. Özellikle crash analizlerinde ve fuzzing’de aşağıdaki gibi benzer windbg scriptleri kullanabilirsiniz. Tabi scripti biraz daha geliştirip , breakpoint access vb. işlemlerle süsleyerek.
Scripting ile haşır neşir olan hemen hemen herkesin kodu anlayacağını düşünüyorum , yine de comment’lar ile açıklamaya çalıştım.
[c]$$ introduction to windbg scripting || dump network packets
$$ usage: $$>< c:/recv.wds
bp ws2_32!recv
.while(1)
{
g
$$ windbg scripting’de 20 adet degisken tanimlanabilir ve t0-t20 araliginda isimlendirilir.
$$recv(s, buf, len)
r $t0 = dwo(esp+4)
r $t1 = dwo(esp+8)
r $t2 = dwo(esp+0x0c)
$$ return ‘ e kadar calistir
pt
$$ simdi stackdeki fonk argumanlarini basabiliriz
.printf "s=%p buf=%p len=%p\n", @$t0, @$t1, @$t2
.printf "[+]Recv’d Bytes:\n"
dc $t1
}
bp ws2_32!send
.while(1)
{
g
$$ send(s, buf, len)
r $t3 = dwo(esp+4)
r $t4 = dwo(esp+8)
r $t5 = dwo(esp+0x0c)
$$ return’e kadar calistir
pt
$$ simdi stackdeki fonk argumanlarini basabiliriz
.printf "s=%p buf=%p len=%p\n", @$t3, @$t4, @$t5
.printf "[+]Send() Bytes:\n"
dc $t4
}[/c]
Windbg Çıktısı