天天看點

Source Insight 3.X 标簽插件v1.0釋出

Source Insight可以說是一款程式員必備的開發/閱讀源碼工具,美中不足的是SI沒有标簽欄,多個源碼之間切換很不友善,于是我就乘閑暇之餘寫了該作品sihook:标簽插件;不過嚴格意義上來說sihook并不算是插件,而是一個内挂:)

  經過幾年的程式設計積累,也有點感悟,越來越覺得c++太繁雜了,而c的清晰精簡讓我越來越欣賞,一段c代碼能很好表達清楚的邏輯,c++開發者喜歡繞上一大圈來實作,更不提那些變形的VC和我從來沒搞懂過的MFC,幾年以前接觸MFC依葫蘆畫瓢的時候總是搞不懂MFC在幹些什麼,現在回過頭來看,MFC完全就是一個失敗的設計.好了,不吐槽c++和該死的VC+MFC了,這次sihook用c開發,gcc編譯,偷懶沒裝MSYS用CodeBlocks做IDE,Makefile都省了:)

  下面我簡單介紹一下sihook的實作原理:

  1,插件的自動加載msimg32

  幾年前dll都是用CreateRemoteThread方法來加載,就是必須要有個exe的loader,而現在有了msimg32延遲加載漏洞,腰不酸了腿不疼了,加載外挂更友善了:),具體原理我就不多介紹了,網上一搜一大把.

  2,肢解SI之siframe

  SI主窗體是siframe,由于msimg32是延遲加載,由hook CreateWindowEx調試發現,當我們的dll載入的時候,siframe和mdiclient已經建立了,而si_sw未建立,那麼我們直接得到目前程序的HWND就是siframe的HWND了,然後SetWindowLong替換視窗過程,隻關心WM_SETTEXT消息,WM_SETTEXT設定标題的時候我們在後面加上"加強版"的字樣,然後以siframe為父窗體建立我們的systabcontrol32控件.

  3,肢解SI之mdiclient

  mdiclient是SI中最重要的一個視窗,它管理着源碼視窗的建立銷毀,首先用FindWindowEx得到mdiclinet的句柄,然後SetWindowLong替換視窗過程,這裡面要處理的消息有WM_WINDOWPOSCHANGING;WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;

  WM_WINDOWPOSCHANGING是視窗大小改變的消息,這時候要處理tab的大小和mdiclient自身的大小,要在oldwndproc執行之前處理;

  WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;要在oldwndproc執行之後處理,這樣就可以直接拿到子視窗的句柄處理了.

  WM_MDICREATE消息用FindWindowEx得到新建立的si_sw源碼視窗的句柄,替換視窗過程

  WM_MDIDESTROY消息直接能拿到HWND,同步删除tab标簽

  WM_MDIACTIVATE也能直接拿到HWND,同步激活tab标簽

  4,肢解SI之si_sw

  si_sw子視窗就是源碼顯示視窗了,這個視窗我們隻關心WM_SETTEXT消息,得到目前源碼的标題(包括标題的變更),直接顯示在tab上,這樣就不用一個定時器去不停的比較了;

  5,tabctl控件

  為了精簡,直接用sdk程式設計,隻能用系統自帶的systabcontrol32控件來做标簽了,我封裝了一層接口友善上層調用,包括增加,删除,輕按兩下關閉,改變頁籤顔色,調整位置高度等.說起來這是我第一次用systabcontrol32這個控件,做的很難看,如果有sdk美化高手知道怎麼做的漂亮一點,可以給我留言,再此先表示感謝.另外輕按兩下關閉标簽的同時要關閉源碼視窗,看orbit的介紹要發WM_CLOSE消息,而且他的代碼确實是這麼實作的,并且有效,但是我怎麼試都不靈,最後用OD一調試,發現SI自己發的是WM_SYSCOMMAND消息,WPARAM參數是SC_CLOSE,于是我也用SC_CLOSE消息來關閉文檔:)

  OK,基本原理就是上面幾點,理清楚了制作标簽内挂就很容易了,整個工程不算tabctl控件源碼不超過10個函數,以下是效果圖和插件下載下傳包

Source Insight 3.X 标簽插件v1.0釋出

  安裝:解壓sihook.zip兩個dll放到SI目錄即可

  删除:删除SI目錄msimg32.dll和sihook.dll即可

  注:測試發現某些XP sp2裝了某些衛士的機器會無法使用此插件,msimg未加載,原因調查中

繼續閱讀