在*号处加一段代码,使程序可以输出“Hello World”
include “stdio.h”
void print()
{
*
}
void main()
{
}
这该怎么弄呢?实际上,C/C++有许多的运行时库函数,一些运行库函数是其他代码执行的基础,必须在执行用户的代码前初始化。由于main是程序的入口函数,因而就要在main前初始化。事实上,编译器会为每个程序添加一个入口函数,进入这个入口函数做一些初始化工作后再调用用户的入口函数,在用户入口函数返回后做一个清理工作。这个编译器添加的入口函数即称为CRT(C Run Time)入口函数:
CRTmainStartUp()
{
CRT Init();
Call main();
CRT CleanUp();
}
默认情况下,链接器会将CRT入口函数注册为模块的入口。不过连接器支持通过/entry:function 选项指定其他函数作为入口。
#pragma comment(linker, “/entry:print”)
把程序的入口点设为print函数
MainCRTStartup是C运行期库的初始化函数。CRT堆必须在用户代码调用之前被初始化好,即在入口函数之前调用运行库的初始化函数。我们在设定函数入口为print函数之后,必须显示调用mainCRTStartup。
main CRT入口:mainCRTStartup
WinMain CRT入口:WinMainCRTStartup
DLL模块的CRT入口函数是 _DllMainCRTStartup
CRT 源码 crt0.c 中包含了CRT入口函数的代码,CRT入口函数的初始化工作主要有以下几项:
__security_init_cookie 初始化安全Cookie
_heap_init 创建和初始化CRT堆
_mtinit 初始化多线程支持
_ioinit 初始化低级IO
_cinit 初始化C和C++数据
… …
因而这道题的解法为:
#include “stdio.h”
void print()
{
#pragma comment(linker, “/entry:print”)
#pragma comment(linker, “/SECTION:.text,REW” )
int mainCRTStartup();
void main();
__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x
MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX
}
mainCRTStartup();
SHOWSTRING:
printf (“i am MentalDease\n”);
getchar();
}
void main()
{
}