关于 msvbvm60.__vbaVarVargNofree 的一些理解

来源:互联网 发布:阿里数据研究中心 编辑:程序博客网 时间:2024/05/16 15:19

完全是猜测!

函数名:__vbaVarVargNofree

函数功能:从一个Variant变量中提取指针

输入变量:ecx(指定的esi值), edx(Variant变量)

输出变量:eax(指针)

参考示例:

005F969B    51              push    ecx
005F969C    52              push    edx
005F969D    8BD7            mov     edx, edi
005F969F    8D4D A8         lea     ecx, dword ptr ss:[ebp-58]
005F96A2    C745 98 0480000>mov     dword ptr ss:[ebp-68], 8004
005F96A9    8945 C0         mov     dword ptr ss:[ebp-40], eax
005F96AC    895D C4         mov     dword ptr ss:[ebp-3C], ebx
005F96AF    C745 B8 0500000>mov     dword ptr ss:[ebp-48], 5
005F96B6    E8 26F4B065     call    msvbvm60.__vbaVarVargNofree

函数体:

66108AE1 >/$  56            push    esi                              ;  __vbaVarVargNofree
66108AE2  |.  8BC2          mov     eax, edx
66108AE4  |.  8BF1          mov     esi, ecx
66108AE6  |.  66:8B08       mov     cx, word ptr ds:[eax]
66108AE9  |.  F6C5 40       test    ch, 40                           ;  判断是否为指针类型
66108AEC  |.  74 15         je      short msvbvm60.66108B03          ;  不是就跳转
66108AEE  |.  66:81F9 0C40  cmp     cx, 400C                         ;  判断是否为Variant指针
66108AF3  |.  75 05         jnz     short msvbvm60.66108AFA          ;  是就跳转
66108AF5  |.  8B40 08       mov     eax, dword ptr ds:[eax+8]        ;  普通指针,直接取出
66108AF8  |.  5E            pop     esi
66108AF9  |.  C3            retn
66108AFA  |>  50            push    eax                              ;  是Variant指针
66108AFB  |.  56            push    esi
66108AFC  |.  E8 DD76FFFF   call    msvbvm60.661001DE                ;  关键call,挺复杂的
66108B01  |.  8BC6          mov     eax, esi
66108B03  |>  5E            pop     esi                              ;  不是指针,直接返回
66108B04  \.  C3            retn


原创粉丝点击