1. 程式人生 > 其它 >linux命令列代理神器-proxychains

linux命令列代理神器-proxychains

https://zuoer.xin/?post=72

什麼是 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 起作用。