linux命令列代理神器-proxychains
什麼是 proxychains-ng
專案主頁:https://github.com/rofl0r/proxychains-ng
proxychains-ng 介紹
proxychains ng (new generation) - a preloader which hooks calls to sockets in dynamically linked programs and redirects it through one or more socks/http proxies. continuation of the unmaintained proxychains project.
proxychains-ng是proxychains的加強版,主要有以下功能和不足:
• 支援http/https/socks4/socks5
• 支援認證
• 遠端dns查詢
• 多種代理模式
• 不支援udp/icmp轉發
• 少部分程式和在後臺執行的可能無法代理
proxychains-ng 原理
簡單的說就是這個程式 Hook 了 sockets 相關的操作,讓普通程式的 sockets 資料走 SOCKS/HTTP 代理。
其核心就是利用了 LD_PRELOAD 這個環境變數(Mac 上是 DYLD_INSERT_LIBRARIES)。
在 Unix 系統中,如果設定了 LD_PRELOAD 環境變數,那麼在程式執行時,動態連結器會先載入該環境變數所指定的動態庫。也就是說,這個動態庫的載入優先於任何其它的庫,包括 libc。
ProxyChains 建立了一個叫 libproxychains4.so(Mac 上是 libproxychains4.dylib)的動態庫。裡面重寫了 connect、close 以及 sendto 等與 socket 相關的函式,通過這些函式發出的資料將會走代理,詳細程式碼可以參考 libproxychains.c。
在主程式裡,它會讀取配置檔案,查詢 libproxychains4 所在位置,把這些資訊存入環境變數後執行子程式。這樣子程式裡對 socket 相關的函式呼叫就會被 Hook 了,對子程式來說,跟代理相關的東西都是透明的。
可以用 printenv 程式來檢視增加的環境變數,在 Mac 上輸出結果類似於:
$ proxychains4 printenv
[proxychains] config file found: /usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf [proxychains] preloading /usr/local/Cellar/proxychains-ng/4.11/lib/libproxychains4.dylib [proxychains] DLL init: proxychains-ng 4.11 ... PROXYCHAINS_CONF_FILE=/usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=/usr/local/Cellar/proxychains-ng/4.11/lib/libproxychains4.dylib |
一共設定了三個環境變數,其中 PROXYCHAINS_CONF_FILE 儲存的是配置檔案路徑,DYLD_INSERT_LIBRARIES 儲存的是動態庫路徑,在 Mac 中,必須使DYLD_FORCE_FLAT_NAMESPACE 為 1 才能保證 DYLD_INSERT_LIBRARIES 起作用。