完全是猜测!
函数名:__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