Windbg脚本的使用
$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相区别。
J(条件表达式)'命令1';命令2 相当于.if但是又有点不同命令2只能是1个,后面所有命令会被忽略。
POI() 返回指针的指向位置的内容。
hi() 取高16位 or或者^ 或
low() 取低16位 xor或者| 异或
by() 取低8位 gu 步出,不知道具体原理,有时会出错
wo() 取低16位 t 步入
mod或者% 模运算
// 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;