__alloca_probe(堆栈分配函数)
Apocalypse @ 2004-09-22 15:19
这个函数是在很多程序中间都能够看到的一个东西,Caller Function 调用了这个以后,堆栈结构就不再是一般的BP Frame 了,而变成Local Variable 使用 ESP 定位的方式了,一般用来在堆栈里分配大量的空间。
它一般在Caller Function 构建好BP Frame 之后马上调用,EAX 中存放需要分配的字节数。
函数返回之后 ESP = EBP - EAX。
.text:00458210 __alloca_probe proc near ; CODE XREF: .text:00414718p
.text:00458210 ; sub_41487A+8p ...
.text:00458210
.text:00458210 savedEBP = dword ptr 8
.text:00458210
.text:00458210 push ecx
.text:00458211 cmp eax, 1000h
.text:00458216 lea ecx, [esp+savedEBP]
.text:0045821A jb short AllocLess1000h
.text:0045821C
.text:0045821C AllocStack1000h: ; CODE XREF: __alloca_probe+1Ej
.text:0045821C sub ecx, 1000h
.text:00458222 sub eax, 1000h
.text:00458227 test [ecx], eax ; 看是否溢出
.text:00458229 cmp eax, 1000h
.text:0045822E jnb short AllocStack1000h
.text:00458230
.text:00458230 AllocLess1000h: ; CODE XREF: __alloca_probe+Aj
.text:00458230 sub ecx, eax
.text:00458232 mov eax, esp ; 记录原来的堆栈指针
.text:00458234 test [ecx], eax ; 看是否溢出
.text:00458236 mov esp, ecx ; 修改堆栈指针
.text:00458238 mov ecx, [eax] ; 相当于 pop ecx
.text:0045823A mov eax, [eax+4] ; 这里存放的是返回地址
.text:0045823D push eax ; 构建一个假的Far Return 堆栈返回地址
.text:0045823E retn
.text:0045823E __alloca_probe endp
用IDA看这个libc中的函数时硬时搞不明白 他这两句test有什么用
test [ecx], eax ; 看是否溢出
百度一下 看到说时检查溢出 那么 test检查溢出是什么原理呢? 怎么达到检查异常的目的的? 触发异常?
哪个蝈蝈解释下啊 谢谢了先
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!