瀏覽器主要用 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 系統呼叫……感覺更邪惡了嘛 =_=
瀏覽器主要用 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 系統呼叫……感覺更邪惡了嘛 =_=