The Desktop Item Position Saver (DIPS) Utility 程式解析

前言:

DIPS Utility (Windows via C/C++, Fifth Edition Page 633) 是 Jeffrey Richter 示範 DLL Injection 的一個範例,內容讀起來對我來說有點複雜,所以做一下心得報告以加深印象。




整個流程可以分成下列幾個步驟來看

主程式 (DIPS.EXE)

  1. 尋找 Desktop ListView Window (視窗名稱可靠 Spy++ 取得)
  2. 呼叫 SetDIPSHook 將 DIPSLib.dll 加入該視窗
  3. 利用 GetMessage 進入 Suspend 等待 Server Window 建立完成
  4. 與該視窗聯繫,進行儲存或載入 Icon 位置
  5. 關閉該視窗
  6. 關閉 Hook
主程式 (DIPSLib.dll)
  1. 將目前的 ThreadId 存入 Shared Data,以便 Server Window 跟主程式溝通用
  2. 在 Desktop ListView Window 設定 WH_GETMESSAGE Hook
  3. 利用 PostThreadMessage 將 Desktop LivtView Window 喚醒,以便載入 DIPSLib.dll 執行 GetMsgProc
Hook 端 (DIPSLib.dll)
  1. 第一次執行則建立一個隱藏的 Server Window 並通知主程式建立完成
  2. 呼叫 NextHook 執行原本的動作
Server Window (DIPSLib.dll)
  1. 接受主程式的命令,進行儲存或載入 Icon 位置
值得注意的是:最後在收尾的時候,一定要先將 Server Window 關閉後,才能移除 Hook。否則先移除 Hook 後,假設又有 Message 進來,那沒有對應的 Dlg_Proc 可以處理 Message,將造成程式當機。

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯