這篇談下c++如何hook網頁中的js函式,即網頁可以執行我們修改的js函式。
相應的步驟可分為:
1.找到需要修改函式的時機。
2.得到需要修改函式的com物件。
3.將我們新的com物件替換修改函式。
第一步,找到需要修改函式的時機,在談這個問題之前,需要搞清楚js執行發生在什麼時候。
我們知道在網頁載入過程中,會根據接收到的html文字,去解析對應裡面的指令碼和樣式以及js。
譬如:
在網頁載入渲染過程中,本地會逐行解析指令碼,css和繪製不是我們這裡討論的,略過,當執行到一行時,網頁會停止建立dom樹,開始載入對應的js,載入過程就是把encoder.js和jquery.js裡面的物件(也包括函式)會一併建立。如果我們需要修改的js函式在就是在類似的這樣的頭裡面建立的,那麼很簡單了,我們只要找乙個載入點沒執行修改函式就行,然後執行我們的第二步。在mfc中,一般考慮ondocumentcomplete函式作為我們修改函式的時機。具體函式實現如下:
void cweblogindlg::ondocumentcomplete(lpdispatch pdisp, lpctstr szurl)
} if (pdisp == lpwbdisp )
lpwbdisp->release();
第二步,得到修改函式的com物件。這裡tk_installpage函式就是我們的要修改的函式。首先獲取doc物件,然後根據doc物件通過getjscript獲得指令碼物件,再次在指令碼物件上通過名字tk_installpage得到js物件。具體**如下:
bool cwebpage::setdocument(idispatch* pdisp)
return true;
}bool cwebpage::getjscript(ccomptr& spdisp)
dispid cweblogindlg::findid( idispatch *pobj, lpolestr pname )
hresult cweblogindlg::getproperty( idispatch *pobj, lpolestr pname, variant *pvalue )
第三步,將我們新的com物件替換修改函式。
首先需要構造我們新的com物件,
typedef void _stdcall jsfunction_callback();
class jsfunction:public idispatch
~jsfunction(void)
public:
// iunknown methods
stdmethodimp queryinte***ce(refiid iid,void**ppvobject)
return e_nointe***ce;
} stdmethodimp_(ulong) addref()
stdmethodimp_(ulong) release()
return _refnum;
} // idispatch methods
hresult _stdcall gettypeinfocount(
unsigned int * pctinfo)
hresult _stdcall gettypeinfo(
unsigned int itinfo,
lcid lcid,
itypeinfo far* far* pptinfo)
hresult _stdcall getidsofnames(
refiid riid,
olechar far* far* rgsznames,
unsigned int cnames,
lcid lcid,
dispid far* rgdispid
) hresult _stdcall invoke(
dispid dispidmember,
refiid riid,
lcid lcid,
word wflags,
dispparams* pdispparams,
variant* pvarresult,
excepinfo* pexcepinfo,
unsigned int* puargerr
) };static void _stdcall button1_onclick()
其次,通過com物件的invoke函式進行替換。**如下:
hresult cweblogindlg::setproperty( idispatch *pobj, lpolestr pname, variant *pvalue )
最終效果,在網頁在執行tk_installpage函式時候,實際上是執行的我們的函式button1_onclick。
極限程式設計之實踐
今天上班的路上聽了下微軟的webcast,是王為老師講的極限程式設計,回顧了下自己的專案中用到的極限程式設計,就在這整理一下。此專案是自己在2年多之前做的,也算是第一次接觸到極限程式設計。我逐一說明該專案中如何應用極限程式設計的一些要求來完成開發的。此專案組成員為7人,工作環境相對集中,完全可應用極...
二 myca實戰之實踐
一 配置 mycat配置檔案目錄 mycat conf 最主要的配置檔案 server.xml schema.xml rule.xml 1 server.xml 配置跟例項資料庫的連線資訊,資料庫使用者名稱 密碼 資料庫名稱,如下 123456 supply 123456 supply,operat...
敏捷測試之實踐篇
最近一直在想 敏捷測試 如何實施的事情,敏捷測試在敏捷開發中貫穿始末,涉及到了多種角色的參與 客戶 開發 設計 專職測試等等,每個角色承擔著不同的測試任務,客戶與設計可以進行驗證需求實現的測試,而開發進行 單元測試,專職測試人員進行詳細測試。我們這裡主要是來談談專職測試人員如何開展敏捷測試,其實這個...