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、具體事件的處理的定位