标签:style blog class code java tar
main函数是编译环境提供给用户的入口函数,但main函数是如何执行的?它也同样作为一个函数,被另外的函数所调用执行。
利用编译器的栈回溯,可以找到编译器调用main函数的父函数(此处使用编译器为vs2010):
在main函数内下断,让程序运行在main函数内停止;
观察vs2010的调用堆栈窗口(可按 调试 -> 窗口 -> 调用堆栈 顺序显示该窗口);
可发现当前栈顶指针指向 main()函数,且_tmainCRTStartup()函数比main()函数先入栈,双击tmainCRTStartup()处即可转入函数入栈前的
中断处,发现此处正调用的main函数;
(crtexe.c)
//要求在*部分写代码使整个程序运行后输出“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() { }
标签:style blog class code java tar
原文地址:http://www.cnblogs.com/91Kesson/p/3705051.html