《Web性能实践日志》一第1章 WebPageTest内部原理1.1 函数拦截

本节书摘来自异步社区《Web性能实践日志》一书中的第1章,第1.1节,作者【加拿大】Stoyan Stefanov,更多章节内容可以访问云栖社区“异步社区”公众号查看

第1章 WebPageTest内部原理

Web性能实践日志
作者:Patrick Meenan

我想借着今年的这次机会向大家介绍一下WebPageTest是如何从浏览器获取性能数据的。虽然它与Windows下一些工具的技术原理大同小异,但本章介绍的内容并不能代表这些工具的工作原理。

首先,请看图1-1,这张图可以帮助我们从浏览器端理解Windows的网络堆栈。


c7d9cc6b25d7acfa10845e37131e3456b784b737

不管是什么浏览器,只要运行在Windows下,体系结构几乎就如图1-1描述的一样,所有的传输都是通过Windows Socket API完成的,即Windows下几乎所有应用程序都使用TCP/IP协议,如图1-1描述。

1.1 函数拦截

WebPageTest工作的关键是能够拦截任意函数调用和检查,甚至可以中途改变请求和响应(也可以选择完全不传输)。很幸运,有人已经做了绝大部分重要的工作,并且提供了一个非常优秀的开源库(http://newgre.net/ncodehook),有了这个库,你就不需要关注实现的细节了,但你还是可以了解一下工作原理。

  • 在内存中找到目标函数(如果从dll导出会比较零碎)。
  • 把函数的前几个字节复制下来(确保x86指令完好无损)。
  • 使用跳转指令(jmp)重写函数入口让它指向到一个新函数。
  • 提供一个替代函数,这个函数包含刚才从源函数复制下来的字节以及用于指向剩余代码的跳转指令(jmp)。

这是一件非常细致的事情,稍不留神就会出岔子,但是使用定义良好的函数(如全部的Windows API),你就可以轻松地拦截任何你想拦截的内容。

这么做有一个缺点,就是你只能把调用重定向到运行在同一个进程下的代码,如果这些代码是你自己写的,那就没什么问题,但如果你要监测那些不受自己控制的软件的话就不太好了,反而可能还会带来一些麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值