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