windbg 脚本导致内存访问冲突

windbg script causes memory access violation

我正在使用以下 windbg 脚本在读取文件时在缓冲区中遇到特定值时中断

bp ReadFile

.while(1)
{
  g

  $$ Get parameters of ReadFile()
  r $t0 = dwo(esp+4)
  r $t1 = dwo(esp+8)
  r $t2 = dwo(esp+0x0c)

  $$ Execute until return is reached
  pt

  $$ Read magic value in the buffer
  $$ CHANGE position in buffer here
  r $t5 = dwo(@$t1+0x00)

  $$ Check if magic value matches
  $$ CHANGE constant here
  .if(@$t5 == 0x70170000)
  {
    $$db @$t1

    $$ break
    .break
  }
}

$$ Clear BP for ReadFile (assume it is the 0th one)
bc 0

当我 运行 这个脚本时,我遇到了以下内存访问冲突。

Memory access error at ');;  $$ Check if magic value matches;  $$ CHANGE constant here;  .if(@$t5 == 0x70170000);  {;    $$db @$t1;;    $$ break;    .break;  };'

为什么会这样?

如果您需要在kernel32!ReadFile 读取缓冲区内容,您需要保存缓冲区地址并使用gu(goup 或step out)跳出函数

在 ReadFile esp+8 上中断时指向缓冲区,因此保存并退出

r $t1 = poi(@esp+8);gu

缓冲区的第一个 Dword 是 poi(@$t1) 将其与所需的 Dword 进行比较 并使用 .if .else

采取必要的措施

.if( poi(@$t1) != 636c6163 ) {gc} .else {db @$t1 l10;gc}

将所有这些放在一行中,脚本应该是

bp k*32!ReadFile "r $t1 =poi(@esp+8);gu;.if((poi(@$t1))!=636c6163){gc}.else{db @$t1 l10;gc}"

这里的 636c6163 是 'clac'(反向计算)使用你想要的双字代替这个

calc.exe xp sp3 32 位

上的示例 运行
bl
bp k*32!ReadFile "r $t1=poi(@esp+8);gu;.if((poi(@$t1))!=636c6163){gc}.else{db @$t1 l10;gc}"
.bpcmds
bp0 0x7c801812  "r $t1 = poi(@esp+8);gu;.if( (poi(@$t1))!=636c6163){gc}.else{db @$t1 l10;gc}"
0:002> g
00b865b0  63 61 6c 63 5f 77 68 61-74 69 73 5f 69 6e 74 72  calc_whatis_intr
00374df0  63 61 6c 63 00 ab ab ab-ab ab ab ab ab fe ee fe  calc............