__alloca_probe分析
用IDA分析程序时,经常可以看到__alloc_probe(malloc.h中的alloca函数)这个函数,这个函数有什么用呢!
现在分析一下这个函数。
seg000:004042E0 __alloca_probe proc near
seg000:004042E0 arg_0 = byte ptr 4
seg000:004042E0
seg000:004042E0 push ecx
seg000:004042E1 cmp eax, 1000h ; 判断申请的大小是为小于1000h
seg000:004042E6 lea ecx, [esp+4+arg_0] ; 取得原来参数在栈中的地址,用于用来提升栈空间
seg000:004042EA jb short loc_404300 ; 小于
seg000:004042EC
seg000:004042EC loc_4042EC
seg000:004042EC sub ecx, 1000h
seg000:2 sub eax, 1000h ; 这相当于把栈提高了
seg000:7 test [ecx], eax ; 看是否溢出
seg000:9 cmp eax, 1000h
seg000:004042FE jnb short loc_4042EC
seg000:00404300
seg000:00404300 loc_404300:
seg000:00404300 sub ecx, eax ; 再减去1000h的余数
seg000:00404302 mov eax, esp ; 记录原来的栈顶指针
seg000:00404304 test [ecx], eax ; 看是否溢出
seg000:00404306 mov esp, ecx ; 修改堆栈指针
seg000:00404308 mov ecx, [eax] ; 还原ecx的值
seg000: mov eax, [eax+4] ; 这里存放的是返回地址
seg000:0040430D push eax ; 构建一个假的Far Return 堆栈返回地址
seg000:0040430E retn
seg000:0040430E __alloca_probe endp
函数分为三部分,首先一开始检查申请的栈大小是否大小0x1000,如果大于的话,不停的循环,依次将大小和栈顶地址减0x1000,再判断一下是否溢出,通过test [ecx], eax来判断是否溢出,因为栈大小有限制,如果申请的空间过大,到了低端地址,是无法访问的,所在test一下,如果无法访问,则会报错产生一上访问异常。最后再减去0x1000的余数,再检查一下是否到了低地址,再修改esp的值,还原原来ecx的值,再构建一个假的Far return返回地址。
流程如下:
http://hi.baidu.com/evilknight/item/6314a1d373a232e2b2f77733