背景
很多時候在我們不知道目标程式調用了哪些 api 時,需要使用消息斷點粗略的定位關鍵代碼位置。比如在遊戲裡點選一次滑鼠,可以根據這個消息向下跟蹤點選完滑鼠後遊戲執行的邏輯。
方法
一個簡單的消息循環是這樣的 :
while( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg); //将 WM_XXXKEYXXX 消息翻譯為 WM_CHAR 消息
DispatchMessage(&msg); //傳遞消息到視窗過程
}
TranslateMessage
BOOL TranslateMessage(
const MSG *lpMsg
);
typedef struct tagMSG {
HWND hwnd;
UINT message; // 消息代碼
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
DWORD lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;
由此可知,隻要對 message 這個成員變量設定條件斷點就可以實作所謂的消息斷點 。
32位:
[[esp+0x4]+0x4]==0x1234 (這裡的 1234
[[rcx]+0x8]==0x1234 (HANDLE 是 void* 類型,是以 64 位下偏移是 0x8)