解決しました。
自分の理解で合っていると思われます(多分)。
(書く需要があるかどうかわかりませんが一応書いておきます。)
proxychains-ngというソケットのコネクションをsocks/httpプロキシにリダイレクトしてくれるツールのソースを読んでみました。
connect()をモックしている部分に
lang
1
2/* HTTPプロキシ*/
3
4len = snprintf((char *)buff, sizeof(buff),
5 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n%s%s%s\n",
6 dns_name, hs_port,
7 dns_name, hs_port,
8 ulen ? "Proxy-Authorization: Basic " : dst,
9 dst, ulen ? "\r\n" : data);
10
というコードがありdns_nameには次のプロキシのドメイン名が入るようになっています。
socksプロキシについても同様に次のプロキシに対して接続するようになっていました。
configファイルでsocks/httpプロキシを複数指定できるようになっており、それらの情報を収めた構造体の配列を作っているようです。
そして、
lang
1
2proxy_data *p1, *p2, *p3;
3
4/* 一番最初のプロキシの構造体をとる */
5if (!(p1 = select_proxy(FIFOLY, pd, proxy_count, &offset))) {
6 PDEBUG("select_proxy failed\n");
7 goto error_strict;
8}
9
10/* それに接続 */
11if(SUCCESS != start_chain(&ns, p1, ST)) {
12 PDEBUG("start_chain failed\n");
13 goto error_strict;
14}
15
16/* 2つ目以降のプロキシ... */
17while(offset < proxy_count) {
18 /* 構造体をとる */
19 if(!(p2 = select_proxy(FIFOLY, pd, proxy_count, &offset)))
20 break;
21 /* 接続... */
22 if(SUCCESS != chain_step(ns, p1, p2)) {
23 PDEBUG("chain_step failed\n");
24 goto error_strict;
25 }
26 p1 = p2;
27}
28
29/* 最後に関数の引数(ここには書いてませんが)として渡された本来のサーバーに接続 */
30p3->ip = target_ip;
31p3->port = target_port;
32if(SUCCESS != chain_step(ns, p1, p3))
33 goto error;
34
35
このようにしてチェインを実現してるようです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。