Windbg脚本的使用

暂时先留着,以后深入研究
下条件断点:
bp User32!IsDialogMessageA ".if( poi( poi(esp+8) ) == 控件的句柄 and poi( poi(esp+8) + 4 ) == WM_LBUTTONUP ){}.else{gc}"

常见命令:
$exentry伪寄存器,数值上等于EP
$t0-$t19,WINDBG为我们提供了20个自定义的伪寄存器
R指令能改变几乎所有寄存器的值,包括EAX等
.dvalloc [/b] size 申请内存空间,带/b 地址,可在指定地址申请空间,不带则自动分配,指定地址时不一定成功,暂时的经验指定地址越大越容易成功。
e* 地址 在指定内存中写入数据,EW 写入WORD,EB写入BYTE,ED写入DWORD
注意: EW 00400000 12345会产生溢出错误,同理EB 00400000 123也是错的,正确的例子可见后面的代码
f 地址 L长度 BYTE 在长度的地址写入数据,你可以在示例中看到效果。同样BYTE的位置只能是BYTE,多于8位的数据都会造成溢出错误。
m 源地址 L源地址长度 目的地址 复制内存区域
d* 地址 显示地址中的数据,其中db的效果可在示例中看到。
.dvfree /d 地址 size 释放指定地址的内存,这里指定地址用的是/d要与 .dvalloc的/b相区别。
BP 地址或者函数名 "命令" 命令参数是可选的,存在的情况下,中断的同时会先运行那些命令。
J(条件表达式)'命令1';命令2  相当于.if但是又有点不同命令2只能是1个,后面所有命令会被忽略。
POI() 返回指针的指向位置的内容。
not 非                                    and或者&  与
hi()  取高16位                            or或者^   或
low()  取低16位                           xor或者|  异或
by()   取低8位                            gu  步出,不知道具体原理,有时会出错
wo()   取低16位                           t   步入
mod或者%  模运算


几个windbg脚本,拷到windbg安装目录下面,调试时可以在windbg命令窗口中输入
 
bpeax 用法      $$>< bpeax.txt  0  0x0`1        执行到eax为一个特定值时断下来
                      $$>< bpeax.txt  1  0x0`1        和上面类似,但是遇到函数调用会进到函数内部
 
bpcall 用法      $$>< bpcall.txt                      执行到call指令时停下
 
bpret  用法      $>< bpret.txt                         执行到ret指令时停下
 
// bpret.txt
.while(1) 
{ 
 p; 
 .if ( poi(@eip) & 0x0`ff ) = 0x0`C2 
 {
  .break
 } 
 .elsif ( poi(@eip) & 0x0`ff ) = 0x0`C3 
 {
  .break
 } 
 .elsif ( poi(@eip) & 0x0`ff ) = 0x0`CA 
 {
  .break
 } 
 .elsif ( poi(@eip) & 0x0`ff ) = 0x0`CB
 {
  .break
 }  
 .else 
 { 
  u eip L1 
 }
}
 
// bpcall.txt
.while(1) 
{ 
 p; 
 .if ( poi(@eip) & 0x0`ff ) = 0x0`9a 
 {
  .break
 } 
 .elsif ( poi(@eip) & 0x0`ff ) = 0x0`e8 
 {
  .break
 } 
 .elsif ( poi(@eip) & 0x0`ffff ) = 0x0`15ff 
 {
  .break
 } 
 .else 
 { 
  u eip L1 
 }
}
 
// bpeax.txt
.while(1)
{
 .if ${$arg1}
 {
  t;
 }
 .else
 {
  p;
 } 
 .if ( @eax & 0x0`ffffffff ) = ${$arg2}
 {
  .break
 } 
}
 

【2009-10-22】Create 

【2010-02-05】Modify

$$ [ C++ Runtime Error Script v0.1 ] $$ <Made By SaunterCloud 2009.10.22>

ad *; .cxr; ~0s; aS ufLinkS "<u><link name=\\\"0x%.8X\\\" cmd=\\\".cxr 0x%.8X;kb;\\\">"; aS ufLinkE "</link></col></u>";

r $t0=@eax; r $t1=@ebx; r $t2=@ecx;

r @eax=1; r @ecx=0;

.printf "\n\n\n\n"; .printf "*******************************************************************************\n"; .printf "*                                                                             *\n"; .printf "*                 [ C++ Runtime Error Script v0.1 ]                           *\n"; .printf "*                 <Made By SaunterCloud 2009.10.22>                           *\n"; .printf "*                                                                             *\n"; .printf "*******************************************************************************\n"; .printf "\n\n";

.foreach (placein {!findstack kernel32!UnhandledExceptionFilter 1;}) {  .if (@@masm('${placein}'!='*'))  {   .if(@ecx==0)   {    ;   }   .elsif(@ecx==2)   {    r @ebx=poi(poi(${placein}+8)+4);    .printf /D "Runtime Error Address: ${ufLinkS}0x%.8X${ufLinkE}\n",@ebx,@ebx,@ebx;    r @ecx=@ecx+1;   }   .elsif (@ecx==4)   {    r @ecx=0;   }   .else   {    r @ecx=@ecx+1;    }  }  .else  {   r @ecx=1;  } }

r @eax=$t0; r @ebx=$t1;  r @ecx=$t2;

ad ufLinkS; ad ufLinkE;

改:

$$ [ C++ Runtime Error Script v0.2 ] $$ <Made By SaunterCloud 2010.02.05> .cxr; ~0s; r $t0=@eax; r $t1=@ebx; r $t2=@ecx; r @eax=1; r @ecx=0; .printf "\n\n\n\n"; .printf "*******************************************************************************\n"; .printf "*                                                                             *\n"; .printf "*                 [ C++ Runtime Error Script v0.2 ]                           *\n"; .printf "*                 <Made By SaunterCloud 2010.02.05>                           *\n"; .printf "*                                                                             *\n"; .printf "*******************************************************************************\n"; .printf "\n\n"; .foreach (placein {!findstack kernel32!UnhandledExceptionFilter 1;}) {  .if (@@masm('${placein}'!='*'))  {   .if(@ecx==0)   {    ;   }   .elsif(@ecx==2)   {    r @ebx=poi(poi(${placein}+8)+4);    .printf /D "Runtime Error Address: <u><link name=\"0x%.8X\" cmd=\".cxr 0x%.8X;kb;\">0x%.8X</link></col></u>\n",@ebx,@ebx,@ebx;    r @ecx=@ecx+1;   }   .elsif (@ecx==4)   {    r @ecx=0;   }   .else   {    r @ecx=@ecx+1;    }  }  .else  {   r @ecx=1;  } } r @eax=$t0; r @ebx=$t1; r @ecx=$t2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值