VS2015版本release查找main函數入口
vc++開發的程序main或WinMain函數是語法規定的用戶入口,而不是應用程序入口。入口代碼是mainCRTstartup、wmainCRTStartup、WinMainCRTSartup或wWinMainCRTStarup,具體情況由編譯器制定。
VS2015版本debug查找main函數在《VS程序反匯編找main函數》。release版本找main函數入口有所區別的地方在於一開始就單步步過一個call指令,jmp跳轉。然后經過三個push,進入call內到達用戶入口,而且需要注意用戶入口點是程序員自己也是可以修改的。
VC編譯器的版本不同,mainCRTSartup函數也可能會有所不同,IDA中將mainCRTSartup函數命名為___tmainCRTStartup。

main函數有三個參數,分別為命令行參數個數、命令行參數信息和環境變量信息。根據main函數調用的特征會將3個參數壓入棧內作為函數的參數。所以查找用戶入口main()前必然會有3個push指令。

IDA中的基本數據類型-局部變量
測試代碼
局部變量有三個int、float、char。分別賦值。
int main()
{
	//局部變量
	// 整型
	int nNum = 1;
	
	// 浮點型
	float fNum = 2.5;
	// 字符型
	char ch = 'A';
	printf("int %d , float %f ,char %c", nNum, fNum, ch);
    return 0;
}
 
        vs反匯編結果
在掌握IDA反匯編工具之前,先調試VS編譯的debug版本程序熟悉int 型變量、float型變量、char型變量反匯編后的指令,因為經過VS編譯器優化過所以看起來比較容易理解。VS快捷鍵【alt+8】打開反匯編窗口。

IDA匯編結果
IDA的逆向結果中 var_ 是局部變量,為了讓逆向時更容易弄懂這些參數。可以使用快捷鍵【n】將變量改名。

在IDAF5鍵大法轉換為源碼前,可以看到float型變量是16進制,char變量是16進制。那么我們可以點擊數值,右鍵或者R鍵將char型變量的值直接顯示出來。

而float型變量雙擊dword_415878,在IDA中【edit】->【Operand type】->【Number】->【Floatingpoint】,將值改為float顯示。這里將40200000h轉換成了2.5。
.text:004113F5                 movss   xmm0, ds:dword_415878 ; fNum
 
        
修改之后的反匯編代碼。

再次按F5后,IDA將反匯編的源碼轉換后我們可以得到與源碼近乎相同的偽C代碼,但是變量類型上還有一些偏差。

參考:
C++反匯編與逆向分析技術揭秘,46頁
