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............
我正在使用以下 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............