Coup de Grace

Ss Java源码解读

最近在整理笔记,rebuild一下脑内 indices.

这次从中间网络与协议部分开始整理,免得出现老是abandon的情况

说起来有关这一块,不看这个博客说不过去的.

我个人也是从里面摘抄很多内容.最近几年没有更新真遗憾啊,想必他晋升后比较忙了.

Socks5

建立 Socket 连接前建立的 Auth 连接.

成功握手后就是单纯的转发,相比 http proxy不涉及重写 header,即便是回写过程也能透明的执行.

从 Socks4 开始的演进就不提了,wiki 中详述.

经典的流程及报文如下

# 握手阶段
client -> ss: 0x05 0x01 0x00
ss -> client: 0x05 0x00
# 建立连接
client -> ss: 0x05 0x01 0x00 0x03 0x0a b'google.com'  0x00 0x50
ss -> client: 0x05 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x10 0x10
# 传输阶段
client -> ss -> remote
remote -> ss -> client

简言之就是我们的最简实现要在响应的 REP 上得到 0x00 .

ss protocol

链接

client <---> ss-local <--[encrypted]--> ss-remote <---> target

[target address][payload]

{
  "server": "0.0.0.0",
  "port_password": {
    "443": "889900"
  },
  "method": "aes-256-cfb",
  "obfs": "origin",
  "local_address": "0.0.0.0",
  "local_port":1085
}

不多说了,encryption.

文章本来就没打算写太长…心领神会吧.

按照其他同学做的 py 版本 ss 解析的话,以下的部分应该都要进行必要的支持:

优先级我个人排了序,代码解析的程度也是从上到下. 能写到哪儿是哪儿.

工程结构

在 github 上找了个 star多的实现

工程写的相对简陋一些,突然没了兴致…简单介绍下各部分都在做什么好了.

因为 netty4 本身就提供了 socks 工具包,所以相当一部分可以通过继承来扩展.

- client <---> ss-local 
    - 版本/认证与连接 SocksServerHandler#channelRead0
    - 不喜欢兼容 socks 版本的话可以不兼容,此二者认证直接 0x00 即可
    - type 变为 Connect 后,remove this,换为 SSLocalTcpProxyHandler#channelRead0

- ss-local <--[encrypted]--> ss-remote
    - SSLocalTcpProxyHandler 内首先将 Bootstrap 启动,而后连接 ss-remote
    - 在 eventloop 里不断向List<ByteBuf>写入即可. 
    - 交互间通过 SSCipherCodec extends MessageToMessageCodec<Object, Object> 来完成加密. 

- ss-remote <---> target
    - 回写部分 SSServerTcpProxyHandler#channelRead0
    - 想必 ss-local 部分,去除了加密部分.

done.