浏览器主要用 TCP,TCP 的要害就在 connect() 上。
你只要接管 connect(),让它连你的代理服务器就行了。
如果这程序是写给 BSD/Linux 用的,篡改 libc 的 connect 很简单:
写一个名为 libproxy.so 的库,按标准的 POSIX 接口实现 connect()。
然后在启动浏览器之前设置环境变量 LD_PRELOAD=libproxy.so 就搞定了。
当然除了 connect(),还有和域名查询相关的所有 API 也得自己重写,比如 gethostbyname() 。
以上就是大体思路。就跟写流氓软件似的。
话说 proxychains 好像自从2002年就有了……
BTW: 这个思路好处是简单,不需要管浏览器怎样工作,对任何应用程序都是透明的。缺点是如果人家的程序比较奇葩(例如 Go 语言写的),没用 libc.so 里的 connect(),而是自己写了段汇编直接调系统调用,那就失效了。如果还想继续走这条路,就得写个内核模块,修改系统调用向量表 sv_table 并且监控浏览器 PID,专门截获特定 PID 发出的 connect 系统调用……感觉更邪恶了嘛 =_=