天天看點

《Web性能實踐日志》一第1章 WebPageTest内部原理1.1 函數攔截

本節書摘來自異步社群《web性能實踐日志》一書中的第1章,第1.1節,作者【加拿大】stoyan stefanov,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

web性能實踐日志

作者:patrick meenan

我想借着今年的這次機會向大家介紹一下webpagetest是如何從浏覽器擷取性能資料的。雖然它與windows下一些工具的技術原理大同小異,但本章介紹的内容并不能代表這些工具的工作原理。

首先,請看圖1-1,這張圖可以幫助我們從浏覽器端了解windows的網絡堆棧。

《Web性能實踐日志》一第1章 WebPageTest内部原理1.1 函數攔截

不管是什麼浏覽器,隻要運作在windows下,體系結構幾乎就如圖1-1描述的一樣,所有的傳輸都是通過windows socket api完成的,即windows下幾乎所有應用程式都使用tcp/ip協定,如圖1-1描述。

在記憶體中找到目标函數(如果從dll導出會比較零碎)。

把函數的前幾個位元組複制下來(確定x86指令完好無損)。

使用跳轉指令(jmp)重寫函數入口讓它指向到一個新函數。

提供一個替代函數,這個函數包含剛才從源函數複制下來的位元組以及用于指向剩餘代碼的跳轉指令(jmp)。

這是一件非常細緻的事情,稍不留神就會出岔子,但是使用定義良好的函數(如全部的windows api),你就可以輕松地攔截任何你想攔截的内容。

這麼做有一個缺點,就是你隻能把調用重定向到運作在同一個程序下的代碼,如果這些代碼是你自己寫的,那就沒什麼問題,但如果你要監測那些不受自己控制的軟體的話就不太好了,反而可能還會帶來一些麻煩。

繼續閱讀