main()的激活记录

时间:2011-03-13 17:30:53

标签: c++ c function stack reverse-engineering

我是新手来倒车。如果问题听起来似乎是道歉,我很抱歉:)我在XP SP3上的Visual Studio C ++ 2010中创建了简单的代码:

int main()
{
    return 0;
}

每当我在Olly中打开它时,它会显示执行暂停的堆栈的以下状态:

0012FFC4   7C817077  RETURN to kernel32.7C817077
0012FFC8   7C910228  ntdll.7C910228
0012FFCC   FFFFFFFF
0012FFD0   7FFD5000
0012FFD4   80544CFD
0012FFD8   0012FFC8
0012FFDC   82537DA8
0012FFE0   FFFFFFFF  End of SEH chain
0012FFE4   7C839AD8  SE handler
0012FFE8   7C817080  kernel32.7C817080
0012FFEC   00000000
0012FFF0   00000000
0012FFF4   00000000
0012FFF8   004012A0  Reversin.<ModuleEntryPoint>
0012FFFC   00000000

我可以看到SEH链和SE处理程序的结束,其余部分对我来说没有意义。我找到了安装了异常处理程序的函数的以下堆栈布局:

Function_Local_Variables
Exception_Registration_Record
Exception_Handler
Callers_EBP
Return_Address_in_Caller
Function_Arguments

它似乎不适用于我的情况。我需要帮助试图了解堆栈中存储的内容。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您正在尝试通过查看Olly中的十六进制来学习堆栈约定,那么您应该考虑代码遵循的堆栈约定。默认情况下,大多数C ++代码遵循__cdecl约定。查看此链接:http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl