解析Outline链接的加密链接变成明文密码

字号+ 编辑: 国内TP粉 修订: IT男在阿里 来源: Fenghe's Blog 2023-09-12 我要说两句(3)

在学习通信隧道加解密过程中可能会遇到这个问题: 从Outline这个软件里得到的ss开头的链接是可以导入专有的客户端的, 但是你会发现梅林无法直接导入链接,原因是链接是加密的,只要把链接转一下就OK

总的来说要做的就是从https://github.com/Bill0412/ss-link-decoder上面把那个.py文件下载下来,然后运行那个文件来解析链接。

以下面这个ss链接为例,

ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpyVkJ6WVJIZ3ZRTzc=@某ip地址:33333/?outline=1

先把后面那个后缀/?outline=1去掉(/?后面部分其实是无用的注释),变成

ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpyVkJ6WVJIZ3ZRTzc=@某ip地址:33333

然后运行

$ git clone https://github.com/Bill0412/ss-link-decoder.git
$ cd ss-link-decoder
$ python ssdecode.py ss://Y2hhY2iiyjAtaWV56AF203s984TpyVkJ6Wa5TZ3z8Tzc=@某ip地址:12320

运行结果如下:

上面花括号里面的东西分别是你需要的服务器IP地址、端口号、密码和加密方式从加密链接中解密出来的明文。可以尝试一下,解析出来的信息跟直接导入信息得到的结果是一样的。

听说你上不了github啦?

特释放py文件源码如下, 请保存:

# -*- coding: utf-8 -*-
 
import base64
import json
import sys
 
 
def base64decode(s):
    # transtab = str.maketrans('-_', '+/')
    # s = s.translate(transtab)
    if len(s) % 4 != 0:
        s = s + (4 - len(s) % 4)*'='
    return base64.urlsafe_b64decode(s.encode())
 
 
def decode_ss(ss):
    code_base64 = ss[5:ss.find('@')]
    method_pwd = base64decode(code_base64)
    method_b, pwd_b = method_pwd.split(b':', 1)
    server = ss[ss.find('@')+1:ss.rfind(':')]
    if ss.find('#') == -1:
        port = ss[ss.rfind(':')+1:]
    else:
        port = ss[ss.rfind(':')+1:ss.find('#')]
    ss_conf = {'server': server, 'server_port': int(port),
               'password': pwd_b.decode(), 'method': method_b.decode()}
    print(json.dumps(ss_conf, indent=4))
 
    pwd_base64 = base64.urlsafe_b64encode(pwd_b)
 
    ssr = [server, port, 'origin', method_b.decode(), 'plain',
           pwd_base64.decode()]
    ssrlink = ':'.join(ssr) + '/?obfsparam=&protoparam=&remarks='
    ssrlink_base64 = base64.urlsafe_b64encode(ssrlink.encode())
    ssrlink_output = 'ssr://' + ssrlink_base64.decode()
    print(ssrlink_output)
 
 
def decode_ssr(ssr):
    first_b = base64decode(ssr[6:])
    ssr_conf = {'server': '', 'server_port': ''}
    print(first_b.decode())
 
 
def main(s):
    is_ss = s.find('ss://')
    is_ssr = s.find('ssr://')
    if is_ss != -1:
        ss = s[is_ss:].strip()
        decode_ss(ss)
    elif is_ssr != -1:
        ssr = s[is_ssr:].strip()
        decode_ssr(ssr)
    else:
        print('链接格式不正确!')
 
 
if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('参数不正确!')
    else:
        main(sys.argv[1])


阅完此文,您的感想如何?
  • 有用

    4

  • 没用

    0

  • 开心

    1

  • 愤怒

    1

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • Linux系统下word文档转成pdf的办法

  • ubuntu和debian安装nginx或者tengine报错, 找不到pcre依赖库的解决办法

  • linux终端下借助awk命令查询筛出网站access.log日志里的统计信息

  • 常见的web中间件请求返回状态码

我要说说
网上宾友点评
1 楼 IP 112.14.121.244 的嘉宾 说道 : 1650924582
自行车

2 楼 IP 114.254.3.129 的嘉宾 说道 : 1681117802
谢谢大哥

3 楼 IP 222.128.122.254 的嘉宾 说道 : 1696921596
请受小弟1拜