posts - 20,comments - 15,trackbacks - 0
最近要分析一程序的数据收发, 先准备用截包软件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 阅读(2249) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理