Win32窗口相關API反彙編

1、Win32應用程序入口識別

/*程序入口*/
//APIENTRY(API入口) __stdcall
int APIENTRY WinMain(HINSTANCE hInstance, //ImageBase
	HINSTANCE hPrevInstance, //NULL
	LPSTR lpCmdLine, //命令行參數,可以用Debug版打印,也可以使用Release版使用Dbgview.exe查看
	int nCmdShow) //指定程序窗口如何顯示 

看到KERNEL32.GetVersion GetCommandLineA後繼續往下找 ,找到GetModuleHandleA位置可能是爲第一個參數準備參數,往下走就能看到與程序同名的函數跟進入就可以發現有四個參數。 

2、ESP尋址的特點

很多時候call函數後,第一步並不是保存棧底,而是直接使用ESP尋址,EBP的位置就是函數調用返回的位置。開闢棧的大小就加到了ESP的位置,即ESP - (num / 4) = EBP。[ESP - num / 4 + 4]就是第一個參數的位置,也就是Debug版本的EBP + 8的位置。

3、窗口回調函數的定位

TCHAR className[] = TEXT("My First Window");
	//創建一個自己的窗口
	WNDCLASS wndclass = { 0 }; //即使不用的參數也要賦值爲0,否則窗口創建不出來
	wndclass.hbrBackground = (HBRUSH)COLOR_MENU;    //窗口的背景色		
	wndclass.lpfnWndProc = WindowProc;    //窗口過程函數		
	wndclass.lpszClassName = className;    //窗口類的名字		
	wndclass.hInstance = hInstance;    //定義窗口類的應用程序的實例句柄		
	/*
	typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc; * 2
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance; * 5
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground; * 8
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName; * 10
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
	
	*/
	//註冊窗口
	RegisterClass(&wndclass);

根到RegisterClass的位置,follow傳入地址,鎖定棧地址,找到第二個參數,跟進去就是回調函數。 

4、具體事件的處理的定位
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章