最近要分析一程序的数据收发, 先准备用截包软件WireShark来分析, 不过看了一会儿不得要领, 不是太会用它的filter, 还是用windbg来分析吧, 因此写一脚本来截取数据包, 相当于根据SOCKET句柄来过滤包。
$$------------------------------------------------------------
$$ windbg script
$$ Usage: $$>a<fsocket.txt dllname
$$ example: $$>a<d:\script\fsocket.txt module 1
$$ analyze client socket connetion
$$ break connect/send/recv function
$$ 2009-11-11
$$ write by wangkang
$$ blog: http://www.cppblog.com/wangkang2009
$$------------------------------------------------------------
.if(${/d:$arg1})
{
bc*
$$ calc the length of module
$$ poi(${$arg1}+poi(${$arg1}+3c)+50);
$$ judge the module is loaded.
r $t5=0
bp ws2_32!connect ".echo <<<<<<<<<<<<<<<<<<<<<<;.if(@$t5=0){.foreach(obj {lm1mo}){.if(0==$sicmp(\"${obj}\", \"${$arg1}\")){r $t5=1;.echo >>>>>>>>>>>>>>;}}}; .if(@$t5=1){.echo -------->>>>>>>;r $t9=poi(${$arg1}+poi(${$arg1}+3c)+50); ? @$t9;dds esp l1;? poi(esp);.if(poi(esp)>${$arg1} and poi(esp)<${$arg1}+@$t9) {.echo ------<<<;r $t3=poi(esp+4);.logappend c:\\log.txt;.echo <------connect;.for(r $t1=poi(esp+8)+4; @$t1<poi(esp+8)+8;r $t1=@$t1+1){r $t2=by(@$t1);.printf /D \"%d.\", @$t2;};.echo \"<---ip\";dds @esp l1;.logclose;bc0;};};gc;"
bp ws2_32!recv ".if(@$t5=1){.if(poi(esp+4)=@$t3) {r $t1=poi(esp+8);gu;.if(@eax>0){.logappend c:\\log.txt;.echo <------recv;db @$t1 l@eax;.logclose;};g};};gc;"
.if(${/d:$arg2})
{
bp wsock32!recv ".if(@$t5=1){.if(poi(esp+4)=@$t3) {r $t1=poi(esp+8);gu;.if(@eax>0){.logappend c:\\log.txt;.echo <------recv;db @$t1 l@eax;.logclose;};g};};g;"
}
bp ws2_32!send ".if(@$t5=1){.if(poi(esp+4)=@$t3) {r $t1=poi(esp+c);.logappend c:\\log.txt;.echo <------send;db poi(esp+8) l@$t1;.logclose;};};gc;"
}
recv函数有些会在WSOCK32模块中发生, 对于这种情况, 调用时使用第二个参数, 如在ws2_32中发生则不用第二个参数。
脚本开始时会清除全部断点, 使用前先把原有断点保存。
执行后, 结果会输出到c:\log.txt
posted on 2009-11-14 11:40
wangkang 阅读(2274)
评论(0) 编辑 收藏 引用