如何尋找main函數的入口點,先看下mainCRTStartup的啓動代碼 mainCRTStartup函數在VC++6.0中的代碼; //預編譯宏 #else /*_WINMAIN_*/ #ifdef WPRFLAG //寬字符版控制檯啓動函數 void wmainCRTStartup( #else/*WPRFLAG*/ //多字節版控制檯啓動函數 void mainCRTStartup( #endif /*WPRFLAG*/ #endif /*_WINMAIN_*/ void ) { //獲取系統版本信息 _osver=GetVersion(); _winminor=(_oserver>>8)&0x00FF; _winmajor=_oserver & 0xFF; //主版本 _winver=(_winmajor<<8)+_winminor; _osver=(_osver>>16) & 0x00FFFF; //堆空間初始化過程,在這個函數裏,指定了程序中堆空間的起始地址 //_MT是多線程標記 #ifdef _MT if(!_heap_init(1)) #else /*_MT*/ if(!_heap_intit(0)) #endif /*_MT*/ fast_error_exit(_RT_HEAPINIT); //初始化多線程環境 #ifdef _MT if(!_mtinit()) fast_error_exit(_RT_THREAD); #endif /*_MT*/ _try{ //寬字符處理代碼略 //多字節版獲取命令行 _acmdln=(char*)GetCommandLineA(); //多字節版獲取環境變量信息 _aenvptr=(char*)_crtGetEnvironmentStringsA(); //多字節版獲取命令行信息 _setargv(); //多字節版獲取環境變量信息 _setenvp(); #endif /*WPRFLAG*/ //初始化全局數據和浮點寄存器 _cinit(); //窗口程序處理代碼略 //寬字符串裏代碼略 //獲取環境變量信息 _initenv=_environ; //調用main函數,傳遞命令行參數信息 mainret=main(_argc,_argv,_environ); #endif /*WPRFLAG*/ #endif/*_WINMAIN_*/ //檢查main函數返回值執行析構函數或atexit註冊函數指針,並結束程序 exit(mainret) } //退出結束代碼略 } 可見調用的函數有: GetVersion() _heap_init() GetCommandLineA() _crtGetEnvironmentStringsA() _setargv() _setenvp() _cinit() 一共七個函數以後開始調用main函數; 並且main函數有三個參數,會有壓棧動做 好比3個push操做下的一個call就是main 了~ 識別main函數入口點上OllyDBG彷佛沒有IDA作的好~ 雖然OD也有那一個選項,但每次都停在了加載地址上,IDA直接識別main~