__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

posted @ 2012-07-13 12:47  keepfocus  阅读(1474)  评论(0编辑  收藏  举报