The Desktop Item Position Saver (DIPS) Utility 程式解析
前言:
DIPS Utility (Windows via C/C++, Fifth Edition Page 633) 是 Jeffrey Richter 示範 DLL Injection 的一個範例,內容讀起來對我來說有點複雜,所以做一下心得報告以加深印象。
整個流程可以分成下列幾個步驟來看
主程式 (DIPS.EXE)
DIPS Utility (Windows via C/C++, Fifth Edition Page 633) 是 Jeffrey Richter 示範 DLL Injection 的一個範例,內容讀起來對我來說有點複雜,所以做一下心得報告以加深印象。
整個流程可以分成下列幾個步驟來看
主程式 (DIPS.EXE)
- 尋找 Desktop ListView Window (視窗名稱可靠 Spy++ 取得)
- 呼叫 SetDIPSHook 將 DIPSLib.dll 加入該視窗
- 利用 GetMessage 進入 Suspend 等待 Server Window 建立完成
- 與該視窗聯繫,進行儲存或載入 Icon 位置
- 關閉該視窗
- 關閉 Hook
主程式 (DIPSLib.dll)
- 將目前的 ThreadId 存入 Shared Data,以便 Server Window 跟主程式溝通用
- 在 Desktop ListView Window 設定 WH_GETMESSAGE Hook
- 利用 PostThreadMessage 將 Desktop LivtView Window 喚醒,以便載入 DIPSLib.dll 執行 GetMsgProc
Hook 端 (DIPSLib.dll)
- 第一次執行則建立一個隱藏的 Server Window 並通知主程式建立完成
- 呼叫 NextHook 執行原本的動作
Server Window (DIPSLib.dll)
- 接受主程式的命令,進行儲存或載入 Icon 位置
值得注意的是:最後在收尾的時候,一定要先將 Server Window 關閉後,才能移除 Hook。否則先移除 Hook 後,假設又有 Message 進來,那沒有對應的 Dlg_Proc 可以處理 Message,將造成程式當機。
留言