在VC编译出程序中经常会有__EH_prolog这个函数,是用来进行SEH设置的,这个函数代码只有那么几句,但有点技巧,IDA在这里就被弄晕了,无法正确分析出这里面的堆栈变化,如下所示:
.text:004057A4 __EH_prolog proc near ; CODE XREF: TimerFunc+5p
.text:004057A4 ; sub_401DA6+5p ...
.text:004057A4 000 push 0FFFFFFFFh
.text:004057A6 004 push eax
.text:004057A7 008 mov eax, large fs:0
.text:004057AD 008 push eax
.text:004057AE 00C mov eax, [esp+0Ch]
.text:004057B2 00C mov large fs:0, esp
.text:004057B9 00C mov [esp+0Ch], ebp
.text:004057BD 00C lea ebp, [esp+0Ch]
.text:004057C1 00C push eax
.text:004057C2 010 retn
.text:004057C2
.text:004057C2 __EH_prolog endp ; sp = -10h
所以在其它函数调用这个函数时,分析就会出问题:
.text:004050D3 sub_4050D3 proc near ; CODE XREF: sub_4050B7+3p
.text:004050D3 ; sub_405EBE+9j
.text:004050D3 000 mov eax, offset sub_405F68
.text:004050D8 000 call __EH_prolog
.text:004050D8
.text:004050DD 000 push ecx
.text:004050DE -FE push esi
.text:004050DF -FA mov esi, ecx
.text:004050E1 -FA mov [ebp-10h], esi
.text:004050E4 -FA mov dword ptr [esi], offset off_40649C
.text:004050EA -FA and dword ptr [ebp-4], 0
.text:004050EE -FA call CGdiObject::DeleteObject(void)
.text:004050EE
.text:004050F3 -FA mov ecx, [ebp-0Ch]
.text:004050F6 -FA mov dword ptr [esi], offset off_4063AC
.text:004050FC -FA pop esi
.text:004050FD -FE mov large fs:0, ecx
.text:00405104 -FE leave
.text:00405105 -04 retn
.text:00405105
.text:00405105 sub_4050D3 endp ; sp = 4
最后,堆栈不平衡了,这样就有可能造成IDA分析函数参数或局部变量时 出错,不知如何解决,请高手指点,先谢了!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课