1.main函数执行前
main函数是编译环境提供给用户的入口函数,但main函数是如何执行的?它也同样作为一个函数,被另外的函数所调用执行。
利用编译器的栈回溯,可以找到编译器调用main函数的父函数(此处使用编译器为vs2010):
在main函数内下断,让程序运行在main函数内停止;
观察vs2010的调用堆栈窗口(可按 调试 -> 窗口 -> 调用堆栈 顺序显示该窗口);
可发现当前栈顶指针指向
main()函数,且_tmainCRTStartup()函数比main()函数先入栈,双击tmainCRTStartup()处即可转入函数入栈前的
中断处,发现此处正调用的main函数;
(crtexe.c)
2.在main函数之前输出hello world
问题:
//要求在*部分写代码使整个程序运行后输出“hello world”
#include "stdio.h"
void print()
{
*
}
void main()
{
}
解决方案:
#include "stdio.h"
extern "C" int __cdecl mainCRTStartup(void); //若源文件是.c结尾,不需要这一句
void print()
{
#pragma comment(linker, "/entry:print") //修改入口点代码为print函数
#pragma comment(linker, "/SECTION:.text,ERW") //设置代码段可读、写、执行
#pragma comment(lib, "msvcrt.lib")
int mainCRTStartup();
void main();__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //0xB8 机器码 相当于MOV EAX,
MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING //将printf语句地址放在eax+1处
MOV WORD PTR[EAX+5], 0xE0FF //???mainCRTStartup();
__asm
{
leave
ret
}SHOWSTRING:
printf("hello,world!\n");
__asm
{
xor eax,eax
ret
}}
void main()
{
}
main启动函数
时间: 2024-10-12 01:42:07