给Source Insight做个外挂系列之四--分析“Source Insight”
生活随笔
收集整理的這篇文章主要介紹了
给Source Insight做个外挂系列之四--分析“Source Insight”
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
外掛的目的就是將代碼注入到其它進程中,所以必須要有目標進程才能完成注入,而所謂的目標進程通常是某軟件的一部分或者是全部,所以要對目標程序有深入地了解。一般外掛都是針對某個應用程序開發的,其裝載、運行都依賴于宿主進程提供的環境,如果“掛”錯了,后果很嚴重。有一些軟件運行時會啟動多個進程,每個進程完成各自的任務,所以要分清到底應該“掛”哪個進程,好在“Source Insight”比較簡單,所有的功能都在一個進程中完成,分析起來比較簡單。
??? 要給“Source Insight”加一個用于文件切換的標簽欄,就要對“Source Insight”的窗口體系進行深入研究,因為文件切換體現在“Source Insight”的界面上就是窗口的切換。除此之外,還要研究窗口之間的消息流向,這樣的工具要首推“Spy++”。“Spy++”工具是Viausl Studio的一部分,我們先用它來看看“Source Insight”程序的窗口層次結構,首先是主框架窗口,也就是整個界面最外層(最大)的那個窗口,如下圖所示:
圖4.1 Source Insight的主窗口
????
主窗口的class name是“si_Frame”,這是一個好兆頭,這說明“Source Insight”程序有固定的主框架窗口class name,TabSiPlus就是根據主框架窗口的class name識別“Source Insight”的。其實要標簽化一個多文檔界面的窗口系統,最重要的是找到子框架窗口以及子框架窗口的宿主,也就是子框架窗口的父窗口。通常這個窗口并不是主框架窗口,而是主框架窗口的一個子窗口,這個子窗口和Toolabr或Rebar窗口一樣,不同之處在于它既不靠頂,也不靠邊,它只是占據主框架窗口的整個客戶區。現在就看看“Source Insight”的子框架窗口的宿主窗口是怎么回事,首先關閉所有文檔,也就是關閉全部子框架窗口,然后拖著“Spy++”的瞄準星到處找,找啊找,就是這個:
圖4.2 MDI Client窗口
注意到它的class name了嗎?是的,它的窗口class name是“MDIClient”,熟悉Windows的程序員都知道,這就是windows的標準多文檔窗口界面,這很令人振奮,要記住這個名字,因為我們的外掛就是通過Hook這個窗口來控制文件標簽的。接下來是研究子框架窗口,打開一個子窗口,不要最大化,然后用“Spy++”的瞄準星慢慢看:
圖4.3 Source Insight的子窗口
原來它的class name是“si_Sw”,它還有很多子窗口,不過不在我們關心之列,重要的就是這個class name,因為“TabSiPlus”只Hook這個子框架窗口。
??? 找到這些窗口之后,就需要研究這些窗口之間的消息了,考慮到文件切換標簽欄的行為,比如當用戶點擊一個標簽的時候要激活對應的子框架窗口,再比如當用戶通過其它方式切換一個窗口的時候(比如使用快捷鍵或Window菜單),需要標簽欄能夠作出相應的更新動作,還有就是窗口的創建和銷毀(對用操作是打開和關閉文件),所以要重點關注的幾個消息是窗口創建,銷毀,窗口激活,窗口去激活等等,如下圖所示設定消息Filter:
圖4.4 消息過濾設置
然后激活這個子框架窗口,可以看到有一個WM_MDIACTIVE消息:
圖4.5 MDI消息流動情況
通過解析消息參數就能得到窗口句柄,再通過窗口句柄和標簽之間的關系(這個關系由我們的外掛自己維護,關于TabSiPlus內部細節將在下篇介紹)更新相應的標簽。同樣的方法,Hook WM_MDICREATE和WM_MDIDESTROY可以感知到窗口的創建和銷毀,據此可以添加一個標簽或刪除一個標簽。當用戶激活某個標簽的時候,通過模擬發送相應的消息使窗口能夠具有相應的行為,這一部分就是標簽外掛的重點。
??? 通過上面的研究,我們來總結一下具有哪些資質的程序才能應用標簽窗口外掛,首先,主窗口要有固定的class name或窗口標題格式,有固定的class name這一點不是必須的,可以通過其它方式找到宿主程序的主窗口,但是窗口標題的格式十分重要,因為在無法獲得宿主程序內部數據結構的情況下,只能通過分析窗口標題來獲知窗口對應的文件名稱。其次是應用程序要是標準的Windows多文檔界面,雖然從理論上講所有擁有固定客戶區窗口class name和子窗口class name的窗口體系都可以使用TabSiPlus使用的技術,但是對于標準的Windows多文檔界面程序,有很多標準的窗口消息可以利用(例如MDICHILD_ACTIVE,MDICHILD_DESTROY等等),能給功能開發帶來更多的便利。最后是用于顯示文件的子窗口要有固定的class name?!癝ource Insight”很好地滿足了這些條件,所以“TabSiPlus”就出現了。
??? 至此,所有有關“TabSiPlus”的外部情況(包括如何找到“Source Insight”,如何裝載外掛動態鏈接庫等等)都介紹完了,本系列的下一篇講深入“TabSiPlus”的內部,詳細講解注入到宿主程序中的代碼是如何工作的,下下篇(可能是最后一篇)會對本文發表過程中讀者提到的一些感興趣的問題進行解答,如果你能耐著性子讀完最后一篇文章,會有一個驚喜等待著你,猜猜會是什么?
????
????
????
Source Insignt文件標簽外掛:TabSiPlus的下載地址:
http://www.winmsg.com/download/tabsiplus.zip
??? 要給“Source Insight”加一個用于文件切換的標簽欄,就要對“Source Insight”的窗口體系進行深入研究,因為文件切換體現在“Source Insight”的界面上就是窗口的切換。除此之外,還要研究窗口之間的消息流向,這樣的工具要首推“Spy++”。“Spy++”工具是Viausl Studio的一部分,我們先用它來看看“Source Insight”程序的窗口層次結構,首先是主框架窗口,也就是整個界面最外層(最大)的那個窗口,如下圖所示:
圖4.1 Source Insight的主窗口
????
主窗口的class name是“si_Frame”,這是一個好兆頭,這說明“Source Insight”程序有固定的主框架窗口class name,TabSiPlus就是根據主框架窗口的class name識別“Source Insight”的。其實要標簽化一個多文檔界面的窗口系統,最重要的是找到子框架窗口以及子框架窗口的宿主,也就是子框架窗口的父窗口。通常這個窗口并不是主框架窗口,而是主框架窗口的一個子窗口,這個子窗口和Toolabr或Rebar窗口一樣,不同之處在于它既不靠頂,也不靠邊,它只是占據主框架窗口的整個客戶區。現在就看看“Source Insight”的子框架窗口的宿主窗口是怎么回事,首先關閉所有文檔,也就是關閉全部子框架窗口,然后拖著“Spy++”的瞄準星到處找,找啊找,就是這個:
圖4.2 MDI Client窗口
注意到它的class name了嗎?是的,它的窗口class name是“MDIClient”,熟悉Windows的程序員都知道,這就是windows的標準多文檔窗口界面,這很令人振奮,要記住這個名字,因為我們的外掛就是通過Hook這個窗口來控制文件標簽的。接下來是研究子框架窗口,打開一個子窗口,不要最大化,然后用“Spy++”的瞄準星慢慢看:
圖4.3 Source Insight的子窗口
原來它的class name是“si_Sw”,它還有很多子窗口,不過不在我們關心之列,重要的就是這個class name,因為“TabSiPlus”只Hook這個子框架窗口。
??? 找到這些窗口之后,就需要研究這些窗口之間的消息了,考慮到文件切換標簽欄的行為,比如當用戶點擊一個標簽的時候要激活對應的子框架窗口,再比如當用戶通過其它方式切換一個窗口的時候(比如使用快捷鍵或Window菜單),需要標簽欄能夠作出相應的更新動作,還有就是窗口的創建和銷毀(對用操作是打開和關閉文件),所以要重點關注的幾個消息是窗口創建,銷毀,窗口激活,窗口去激活等等,如下圖所示設定消息Filter:
圖4.4 消息過濾設置
然后激活這個子框架窗口,可以看到有一個WM_MDIACTIVE消息:
圖4.5 MDI消息流動情況
通過解析消息參數就能得到窗口句柄,再通過窗口句柄和標簽之間的關系(這個關系由我們的外掛自己維護,關于TabSiPlus內部細節將在下篇介紹)更新相應的標簽。同樣的方法,Hook WM_MDICREATE和WM_MDIDESTROY可以感知到窗口的創建和銷毀,據此可以添加一個標簽或刪除一個標簽。當用戶激活某個標簽的時候,通過模擬發送相應的消息使窗口能夠具有相應的行為,這一部分就是標簽外掛的重點。
??? 通過上面的研究,我們來總結一下具有哪些資質的程序才能應用標簽窗口外掛,首先,主窗口要有固定的class name或窗口標題格式,有固定的class name這一點不是必須的,可以通過其它方式找到宿主程序的主窗口,但是窗口標題的格式十分重要,因為在無法獲得宿主程序內部數據結構的情況下,只能通過分析窗口標題來獲知窗口對應的文件名稱。其次是應用程序要是標準的Windows多文檔界面,雖然從理論上講所有擁有固定客戶區窗口class name和子窗口class name的窗口體系都可以使用TabSiPlus使用的技術,但是對于標準的Windows多文檔界面程序,有很多標準的窗口消息可以利用(例如MDICHILD_ACTIVE,MDICHILD_DESTROY等等),能給功能開發帶來更多的便利。最后是用于顯示文件的子窗口要有固定的class name?!癝ource Insight”很好地滿足了這些條件,所以“TabSiPlus”就出現了。
??? 至此,所有有關“TabSiPlus”的外部情況(包括如何找到“Source Insight”,如何裝載外掛動態鏈接庫等等)都介紹完了,本系列的下一篇講深入“TabSiPlus”的內部,詳細講解注入到宿主程序中的代碼是如何工作的,下下篇(可能是最后一篇)會對本文發表過程中讀者提到的一些感興趣的問題進行解答,如果你能耐著性子讀完最后一篇文章,會有一個驚喜等待著你,猜猜會是什么?
????
????
????
Source Insignt文件標簽外掛:TabSiPlus的下載地址:
http://www.winmsg.com/download/tabsiplus.zip
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
總結
以上是生活随笔為你收集整理的给Source Insight做个外挂系列之四--分析“Source Insight”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给Source Insight做个外挂系
- 下一篇: 给Source Insight做个外挂系