Source Insight可以說(shuō)是一款程序員必備的開(kāi)發(fā)/閱讀源碼工具,美中不足的是SI沒(méi)有標(biāo)簽欄,多個(gè)源碼之間切換很不方便,于是我就乘閑暇之余寫了該作品sihook:標(biāo)簽插件;不過(guò)嚴(yán)格意義上來(lái)說(shuō)sihook并不算是插件,而是一個(gè)內(nèi)掛:)
sihook實(shí)現(xiàn)原理:
1,插件的自動(dòng)加載msimg32
幾年前dll都是用CreateRemoteThread方法來(lái)加載,就是必須要有個(gè)exe的loader,而現(xiàn)在有了msimg32延遲加載漏洞,腰不酸了腿不疼了,加載外掛更方便了:),具體原理我就不多介紹了,網(wǎng)上一搜一大把.
2,肢解SI之siframe
SI主窗體是siframe,由于msimg32是延遲加載,由hook CreateWindowEx調(diào)試發(fā)現(xiàn),當(dāng)我們的dll載入的時(shí)候,siframe和mdiclient已經(jīng)創(chuàng)建了,而si_sw未創(chuàng)建,那么我們直接得到當(dāng)前進(jìn)程的HWND就是siframe的HWND了,然后SetWindowLong替換窗口過(guò)程,只關(guān)心WM_SETTEXT消息,WM_SETTEXT設(shè)置標(biāo)題的時(shí)候我們?cè)诤竺婕由?quot;加強(qiáng)版"的字樣,然后以siframe為父窗體創(chuàng)建我們的systabcontrol32控件.
3,肢解SI之mdiclient
mdiclient是SI中最重要的一個(gè)窗口,它管理著源碼窗口的創(chuàng)建銷毀,首先用FindWindowEx得到mdiclinet的句柄,然后SetWindowLong替換窗口過(guò)程,這里面要處理的消息有WM_WINDOWPOSCHANGING;WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;
WM_WINDOWPOSCHANGING是窗口大小改變的消息,這時(shí)候要處理tab的大小和mdiclient自身的大小,要在oldwndproc執(zhí)行之前處理;
WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;要在oldwndproc執(zhí)行之后處理,這樣就可以直接拿到子窗口的句柄處理了.
WM_MDICREATE消息用FindWindowEx得到新創(chuàng)建的si_sw源碼窗口的句柄,替換窗口過(guò)程
WM_MDIDESTROY消息直接能拿到HWND,同步刪除tab標(biāo)簽
WM_MDIACTIVATE也能直接拿到HWND,同步激活tab標(biāo)簽
4,肢解SI之si_sw
si_sw子窗口就是源碼顯示窗口了,這個(gè)窗口我們只關(guān)心WM_SETTEXT消息,得到當(dāng)前源碼的標(biāo)題(包括標(biāo)題的變更),直接顯示在tab上,這樣就不用一個(gè)定時(shí)器去不停的比較了;
5,tabctl控件
為了精簡(jiǎn),直接用sdk編程,只能用系統(tǒng)自帶的systabcontrol32控件來(lái)做標(biāo)簽了,我封裝了一層接口方便上層調(diào)用,包括增加,刪除,雙擊關(guān)閉,改變選項(xiàng)卡顏色,調(diào)整位置高度等.說(shuō)起來(lái)這是我第一次用systabcontrol32這個(gè)控件,做的很難看,如果有sdk美化高手知道怎么做的漂亮一點(diǎn),可以給我留言,再此先表示感謝.另外雙擊關(guān)閉標(biāo)簽的同時(shí)要關(guān)閉源碼窗口,看orbit的介紹要發(fā)WM_CLOSE消息,而且他的代碼確實(shí)是這么實(shí)現(xiàn)的,并且有效,但是我怎么試都不靈,最后用OD一調(diào)試,發(fā)現(xiàn)SI自己發(fā)的是WM_SYSCOMMAND消息,WPARAM參數(shù)是SC_CLOSE,于是我也用SC_CLOSE消息來(lái)關(guān)閉文檔:)
OK,基本原理就是上面幾點(diǎn),理清楚了制作標(biāo)簽內(nèi)掛就很容易了,整個(gè)工程不算tabctl控件源碼不超過(guò)10個(gè)函數(shù)。
安裝于卸載:
安裝:解壓sihook.zip兩個(gè)dll放到SI目錄即可
刪除:刪除SI目錄msimg32.dll和sihook.dll即可
本插件將開(kāi)源,取之于網(wǎng)絡(luò),反饋于網(wǎng)絡(luò),大家?guī)屯扑]一個(gè)能訪問(wèn)的代碼服務(wù)器,不用的,google code老抽,github貌似也掛了.