小编Inv*_*ion的帖子

Windows在调用Main()之前做了什么?

Windows必须做一些事情来解析PE头,在内存中加载可执行文件,并将命令行参数传递给main().

使用OllyDbg我已将调试器设置为在main()上中断,以便我可以查看调用堆栈: http://puu.sh/t5vxB/3d52089d22.png

好像符号缺失所以我们无法获得函数名称,只能看到它的内存地址.但是我们可以看到main的调用者kernel32.767262C4,也就是被调用者ntdll.77A90FD9.在堆栈的底部,我们看到RETURN ntdll.77A90FA4,我认为它是第一个被调用来运行可执行文件的函数.看起来传递给该函数的值得注意的参数是Windows的结构化异常处理程序地址和可执行文件的入口点.

那么这些函数究竟是如何最终将程序加载到内存中并为入口点执行做好准备呢?调试器之前main()是否显示了OS执行的整个过程?

windows x86 assembly portable-executable

9
推荐指数
1
解决办法
2363
查看次数

编译器为什么在子程序之间插入INT3指令?

在调试某些软件时,我注意到在很多情况下,子程序之间插入了INT3指令.

这是一个例子.

我假设这些技术上并没有在'之间'插入函数,而是在它们之后,为了暂停执行,如果子程序retn在最后没有执行,无论出于何种原因.

我的假设是否正确?如果不是,这些说明的目的是什么?

compiler-construction x86 assembly

5
推荐指数
2
解决办法
870
查看次数