首页
社区
课程
招聘
[求助]如何让IDA正确分析: __EH_prolog 函数?
发表于: 2007-11-19 11:37 11971

[求助]如何让IDA正确分析: __EH_prolog 函数?

2007-11-19 11:37
11971
在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直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
加载vc32rtf这个sig
2007-11-19 11:50
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
放心吧
IDA不会分析出错的

IDA使用的是EBP或者ESP做为基准来命名变量的
不会受这个影响。
只是偶尔需要自己手工改下
2007-11-19 12:44
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
分析之前,已经加载了vc32rt和vc32mfc .郁闷!

回3楼: 如果函数以EBP为基准,那么IDA分析这个函数参数时,应该不会出错,但若以ESP为基准, 那很可能会出错, 因为它在分析_EH_prolog这个函数时,已经将堆栈指针算错了,那么再往下分析时,分析变量自然就会出错. 我手头上的一个程序就是这样的.
2007-11-19 13:33
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
自己调整栈指针喽。加个差值
2007-11-19 15:02
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
ESP为基准为什么出错?

就我看到的结果,那个Prolog里的栈指针的改变并没有什么影响
那个CALL可以粗略认为只是用来分配临时变量而已,所有临时变量的地址仅仅是做了平移
IDA是根据指令中通过EBP/ESP的相对寻址来命名变量的,变量相对地址没有变化

本人孤陋寡闻,楼主可以把那段出错的程序贴上来让我们学习学习,看看没遇见过的情况
2007-11-19 15:03
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
我那个程序太长,而且交叉关系有点复杂,这里只简单说一下原因:

.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 004                 push    esi
.text:004050DF 008                 mov     esi, ecx
.text:004050E1 008                 mov     [ebp-10h], esi
.text:004050E4 008                 mov     dword ptr [esi], offset off_40649C
.text:004050EA 008                 and     dword ptr [ebp-4], 0
.text:004050EE 008                 call    CGdiObject::DeleteObject(void)
.text:004050EE
.text:004050F3 008                 mov     ecx, [ebp-0Ch]
.text:004050F6 008                 mov     dword ptr [esi], offset off_4063AC
.text:004050FC 008                 pop     esi
.text:004050FD 004                 mov     large fs:0, ecx
.text:00405104 004                 leave
.text:00405105 -04                 retn
.text:00405105
.text:00405105     sub_4050D3      endp ; sp =  4

如上,04050D8处调用call    __EH_prolog后,堆栈指针应该下移10h大小,但从上面可以看出,OD并没有分析出它有变化,调用后,堆栈指针偏移仍为: 000. 最后,可能是由于它导致了sub_4050D3这个函数执行完后,堆栈仍然存在 4h 的偏差。这个函数是以EBP为基准的,参数分析自然不会有问题,但是:

若另外一个函数若调用了这个函数,调用这个函数后,ESP就计算错了,如果这个函数是以ESP为参考,由于ESP的值已经错误,其后面分析出的变量都会出现偏移错误,也就是说:[ESP+Var1]应该是[ESP+Var2],[ESP+Var2]应该是[ESP+Var3]...
2007-11-19 16:10
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
噢~~谢谢

发现一点点差别呵,你那个程序,检测出来的编译器版本是多少?

我见到的大多数像下面的,里面包含参数栈空间的分配,比你那个应该更复杂才对
IDA都能正常处理
另外,你顶楼贴的prolog的代码
text:004057C2     __EH_prolog     endp ; sp = -10h
说明IDA已经正确计算了,很奇怪
2007-11-19 21:02
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
VC 6.0 的程序

虽然IDA 在函数__EH_prolog内部已经计算正确,但返回到上一级函数时,它直接认为这个堆栈还是平衡的,偏差值没有加进来,这一级函数堆栈就算错了,当然这一级函数应该还是不会有问题,它既然调用了__EH_prolog  函数,肯定是以EBP为基准来引用变量的。

我担心的是,当其它函数再调用这一级函数时,就可能会存在问题。
2007-11-19 21:54
0
游客
登录 | 注册 方可回帖
返回
//