windbg条件断点II

编程入门 行业动态 更新时间:2024-10-27 20:28:25

windbg条件<a href=https://www.elefans.com/category/jswz/34/1759729.html style=断点II"/>

windbg条件断点II

    想逆向一个程序,发现很久不用条件断点居然生疏了,只能先写个示例程序温故一下,程序如下:

int condbp(char* str,int val)
{printf("%s-%d\n",str,val);return 0;
}int _tmain(int argc, _TCHAR* argv[])
{int idx = 0;char* strtab[3]={"abc","edf","hig"};while(1){do{condbp(strtab[idx],idx);Sleep(200);idx++;}while(idx%3);printf("\n");idx=0;}return 0;
}

想要达到的目标:循环中,如果condbp的参数1的内容为"edf",则让windbg停下,打印参数2 idx的值。一步到位似乎有点困难,容我分步实现这个目标。

Step 1 依次获得参数的值:

0:000:x86> uf 4dbg!main
...4dbg!main+0x43 [c:\users\eugene\desktop\studio\4dbg\4dbg\4dbg.cpp @ 22]:22 00a072b3 8b45f8          mov     eax,dword ptr [ebp-8]22 00a072b6 50              push    eax22 00a072b7 8b4df8          mov     ecx,dword ptr [ebp-8]22 00a072ba 8b548de4        mov     edx,dword ptr [ebp+ecx*4-1Ch]22 00a072be 52              push    edx22 00a072bf e89de5ffff      call    4dbg!ILT+2140(?condbpYAHPADHZ) (00a05861) ;<-------下断点的位置,此时参数已经入栈,可以通过esp获得各个参数值
...
0:000:x86> bp 00a072bf ;00a072bf 是指令call 4dbg!ILT+2140处的地址
0:000:x86> g
Breakpoint 1 hit
4dbg!main+0x4f:
00a072bf e89de5ffff      call    4dbg!ILT+2140(?condbpYAHPADHZ) (00a05861)
0:000:x86> dd esp L4	;查看栈变量
010ffbfc  00a51c7c 00000000 00a05a1e 00a05a1e ;esp+0是strtab[idx],esp+4是idx;dwo取指定地址处双字节
0:000:x86> r @$t0=dwo (@esp+4)
0:000:x86> r @$t0
$t0=00000000
;poi取指定指定处指针
0:000:x86> r @$t1=poi(@esp)
0:000:x86> da @$t1
00a51c7c  "abc"

Step 2 比较参数1的内容是否为"edf",如果是,则让windbg中断:

0:000:x86> ad* ;删除先前使用过的别名;准备条件断点
0:000:x86> bp 00a072bf "as /ma $ustr poi(@esp); .block{r @$t0=$scmp(@\"$ustr\",@\"edf\");.if(@$t0==0){};.else{gc;}}"
;这条命令将@esp+0处的栈变量(当然是字符串指针),以ASCII字符串的形式赋值给ustr变量,赋值由as /ma $ustr poi(@esp);完成
;windbg变量可能要在.block中使用,因此,后半句比较判断语句需要放在.block{}中
;注意,条件断点的条件由""包括,所以在条件中要表示"",如在字符串中用到""则需要用@\"\",进行转义!!!
;$scmp是windbg内置的字符串比较函数,比较的结果存放在伪寄存器$t0中
0:000:x86> g
4dbg!main+0x4f:
00a072bf e89de5ffff      call    4dbg!ILT+2140(?condbpYAHPADHZ) (00a05861)
0:000:x86> g
4dbg!main+0x4f:
00a072bf e89de5ffff      call    4dbg!ILT+2140(?condbpYAHPADHZ) (00a05861)
;windbg在call指令处中断,查看参数2的内容
0:000:x86> r @$t1=dwo (@esp+4)
0:000:x86> r @$t1
$t1=00000001

Step 3 基于上一步的比较结果,结合.printf元命令,将参数1的值输出:

0:001> bp 00a072bf "as /ma $ustr poi(@esp); .block{r @$t0=$scmp(@\"$ustr\",@\"edf\");.if(@$t0==0){r @$t1=dwo (@esp+4);.printf @\"idx equal to %d\",@$t1;gc;};.else{gc;}}"
breakpoint 0 redefined

看下效果图:

 

更多推荐

windbg条件断点II

本文发布于:2024-02-17 07:17:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693164.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:断点   条件   windbg   II

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!