Posted on January 3rd, 2014

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]

output

Windbg Çıktısı