星期四, 十二月 12, 2019

133 对安卓雷电模拟器的折腾

今天看到果核剥壳博客发了个优化版雷电模拟器的博文, 作者还给了一个带xposed的雷电备份包ldbk, 有点意思.
安装了原版的4.0.5, 翻了翻软件目录发现依旧是基于virtualbox的, 有个ldnews.exe明显就是广告了. 还有几个vmdk, 分别对应初始系统底包和数据等. dnrepairer.exe其实就是个virtualbox的自动安装包, 静默安装到了系统盘的program files里.

作者提供了一个还原包, 格式是ldbk, 里面带了一些比较好用的工具, 最诱人的是自带xposed, 哈哈哈这样就可以直接拿来用, 我都懒得折腾了. 最开始以为这个能改成vmdk后缀直接运行, 结果特么报错... 把ldbk文件打开发现是7z的文件头↓

好吧, 这是一个7z文件, 用7zip打开, 获得vmdk包↓

原来是这样, 分析到此结束. 发现这个模拟器, 配合果核作者给的包, 能直接做到免安装免配置, 直接用果核的成品. 于是折腾就开始了-_-
先把果核做的免广告补丁打上(博客附件里也会提供), crashreport.dll 和 bugreport.exe 可以删了, 然后把system.vmdk改个名, 运行一次dnplayer.exe(首次运行的时候, 程序会自动运行dnrepairer.exe, 静默安装virtualbox主程序), system.vmdk改名是为了让系统报错↓(因为找不到系统底包), 但是系统会生成所需的数据文件. 
报错了之后, 雷电目录\vms\底下就会多出来几个文件夹, 这就是数据存放之处了↓
要想用果核的系统包, 替换两处地方. 打开config文件夹, 删除leidian0.config, 把ldbk包里的leidian.config解压到这里, 然后改名成leidian0.config↓ 当然这个config文件里面有很多项可以配置, 想折腾可以用记事本打开看看.
 
返回vms打开leidian0文件夹, 删除 data.vmdk 和 sdcard.vmdk, 把ldbk包里的两个相同文件解压过去↓
现在回到雷电主目录, 改回system.vmdk并运行一次雷电模拟器. 这时候我们看到系统已经变为果核的镜像了↓

雷电根目录下有三个vmdk文件, 两个data可以删掉, system.vmdk移动到 \vms\leidian0 下. 前提是你不再需要原版的雷电安卓系统底包. 这样如果需要多开的话, 运行dnmultiplayer.exe然后复制果核的这套配置和镜像即可. 如果你觉得自带系统底包有用, 可以选择不删这三个vmdk文件. 
对了, 如果要卸载, 运行 dnuninst.exe, 然后记得把系统盘Program Files底下的 ldplayerbox 文件夹一并删除. 
博客附件中提供果核剥壳的4.0.x去广告补丁, 以及折腾好的压缩包, 点开即用.

星期二, 十月 08, 2019

132 常用快递公司运费及时效在线查询

网上简单搜了一下, 没有那种聚合型的网站, 所以就把各大公司官网上查询价格时效的网址贴出来, 以便查阅. 这些均为国内至国内、日常生活邮寄普通包裹, 非物流及跨国. 
如果有更新或者没有提到的快递, 欢迎评论或者电邮. 
国通(已停止运营): http://www.gto365.com/#/timeline

星期一, 九月 30, 2019

131 京东金融 银行+ 百度度小满 银行精选 网页版入口

从不喜欢用BAJ的垃圾客户端, 又卡又费电, 最近在看京东金融银行精选(也叫银行+), 但是电脑网页版又没有入口. 后来通过分享的方式获取到了网页版, 可以登录使用. 点"银行精选"↓

点右上角的分享按钮, 然后选一种方式分享出去, 就可以获得链接↓

网址在此: https://m.jr.jd.com/mjractivity/rn/JRBankPlus/index.html
可以点登录进行登录
如果不能登录, 或者以后你看到本文没有登录按钮了, 可以配合京东的plogin(我给京东的plogin,QQ的ptlogin,淘宝的login,谷歌的ServiceLogin这类起了个名字叫联合登录)联合登录链接: https://plogin.m.jd.com/login/login?returnurl=https%3A%2F%2Fm.jr.jd.com%2Fmjractivity%2Frn%2FJRBankPlus%2Findex.html
登录进来以后可以查看资产↓


20200302更新, 通过抓包的方式获取到了百度度小满银行精选的链接:
https://8.baidu.com/fm/webapp/index.html#/bank/product/list
登录百度账号后再访问此链接, 有的不能在网页端购买, 模拟UA貌似没有用.

星期一, 九月 16, 2019

130 迅雷版权屏蔽下的一条野路 - M3U8

本文只提供思路, 不提供任何网站. 
在往下看之前, 建议先看我写过的一篇文章: 119 通过网站的m3u8 下载视频自动合并. 
目前很多国内视频站上能看的电影, 在迅雷里下载都会提示 违规内容/应版权方要求, 网上流传的改HOSTS方法:
127.0.0.1 hub5emu.sandai.net
127.0.0.1  hub5btmain.sandai.net
127.0.0.1  upgrade.xl9.xunlei.com
这三条加上后, 到现在还没见着能下载的, 而且很多老资源, 根本就没速度. 
于是就想到了一个老办法, m3u8. 定义自己可以网上去搜, 简单来讲就是视频站把视频拆分成一块一块来播放. 而m3u8文件, 记录的就是这些分成块的视频文件. 那我们下载电影, 只要去一个在线播放视频的网站, 获取到m3u8地址之后, 用专门的下载软件下载下来自动合并成mp4就可以了. 
资源嗅探工具(chrome扩展): 猫抓
m3u8下载合并工具: M3U8批量下载器
以上两个工具119号文章里都提到过, 也算是比较经典的抓资源工具了.
随便找了个在线播放的网站, 抓到了m3u8, 看起来还是优酷或者56的CDN呢, 速度完全有保障啊~
复制下来链接以后, 放到下载器里下载即可. 
总比找一堆磁力、逛某湾、注册论坛下载附件快得多了吧?

星期日, 七月 21, 2019

129 UNO纸牌 电脑单机版三款 + 安卓单机版一款

早先买过实体版的纸牌, 但是看起来好像很难的样子, 就扔了. 前阵子对UNO纸牌感兴趣, 又捡起来学了学, 发现挺简单的, 顺手就在网上找了几个单机版的游戏玩玩.
其实安卓版有联网的, 但是非Google Play手机更新带数据包的游戏有点麻烦, 而且apkpure也没有GP更新得快. 就放弃了.
1, HTML5版, 这个是我从4399上扒出来的, 打开index.htm就能玩. 支持2, 3 ,4人
2, Flash三人版, 动画很平滑, 但只支持3个人
3, Flash版UNO, 作者是"FlashLoft闪阁制造", 作者最后的发布页[在这里], 在网上实在找不到作者发布的1.6版本, 只找到1.5的. 玩法比较多.
4, 安卓版UNO Classic 2019. 没有GP只能玩单机. 支持2, 3, 4, 5, 6人玩. 缺点是游戏模拟了电脑思考时间, 这就很烦人了.

星期六, 六月 22, 2019

128 通过控制台模拟POST请求 使QQ设置为"不允许任何人"添加

20220406更新: 现在手机QQ已经支持设置禁止加我为好友了. 不用这么折腾了. 
以下是原文.

捣鼓了一天的破玩意, 终于把它给研究出来了.
其实改为拒绝所有人添加, 有一种最原始最简单的方法, 就是用QQ国际版. 目前官网还有QQ国际PC版, 最后的更新日期是: 2014-01-22. 下载地址 这版本已经5年多了, 很担心后期会失效, 截止20190616发文之日依然可用. 但使用老版不是今天发文的目的. 继续往下看.
下面记录的是我今天捣鼓出的方法, 用浏览器+F12控制台, 就可以设置为拒绝所有人添加QQ好友. 电脑小白可以绕过了. 
1, 要求有控制台功能的浏览器, 比如chrome核的任意浏览器, 火狐也行.
2, 先访问这个地址: https://ui.ptlogin2.qq.com/cgi-bin/login?appid=8000212&style=12&s_url=http://vip.qq.com/client/level
访问后显示出了QQ等级的页面
解释一下这是干嘛的, ptlogin是腾讯统一的登录接口. s_url就是目的网址了. 关于这个统一登录接口的应用, 我写过一篇文章, 感兴趣的可以自己去折腾: 55 QQ等级查询页面 / 腾讯电脑管家任务页面 / TGP 和 LOL 首页 / QQ钱包营业厅
用你的QQ号登录之后(有SSO组件的支持点头像登录), 浏览器就已经有session或者临时cookie等东西了. 
3, 然后访问http://ti.qq.com/friendship_auth/index.html#p1它会显示如下界面↓
4, 可以看到√停在了"需要验证信息"这里. 现在按f12, 调出开发者工具. 切换到Network底下↓
可以看到底下是空的, 等待中...
5, 刷新一下界面, 再点上面的"允许任何人", 让QQ加好友设置产生变化. 可以看到一条名为"set"的网络请求出现了, 点击它, 右边就会出现这条请求的Headers, 哈哈, cookie和post参数应有尽有哇. ↓
6, 准备好代码. 在headers里面有两条内容比较重要, 一是Cookie, 二是post参数.
cookie显而易见就是上图中涂掉的那一大串, post参数在最底下, 如果不是下图这样的话↓ 就点view source. 
这段form data就是要post的参数了, 应该是这样的:
req=%7B%22at%22%3A0%2C%22q%22%3A%22%22%2C%22a%22%3A%22%22%2C%22l%22%3A%5B%5D%2C%22viaphone%22%3A1%7D&bkn=********
上面有个0是粗体的, 这个0就是"允许任何人"的意思, 1是"需要验证信息"的意思, 再后面又是参数又是数组的, 我也懒得捣鼓. 总之我们把这个0改成2就好了. 至于为什么是2, 感兴趣的话可以看看页面的html代码. 于是这段请求就变成了
req=%7B%22at%22%3A2%2C%22q%22%3A%22%22%2C%22a%22%3A%22%22%2C%22l%22%3A%5B%5D%2C%22viaphone%22%3A1%7D&bkn=********
7, 好了, 等会提交要用到控制台的fetch, 所以我们把代码拼接起来:
fetch('http://ti.qq.com/cgi-node/friend-auth/set', { method: 'POST', headers: { 'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '114', 'Cookie': '把你刚才在Headers里看到的Cookie复制过来', 'Host': 'ti.qq.com', 'Origin': 'http://ti.qq.com', 'Referer': 'http://ti.qq.com/friendship_auth/index.html', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', }, body:"req=%7B%22at%22%3A2记得这里要改成2啊%2C%22q%22%3A%22%22%2C%22a%22%3A%22%22%2C%22l%22%3A%5B%5D%2C%22viaphone%22%3A1%7D&bkn=*******这个bkn可能每个QQ都不一样照着你浏览器里的粘贴就行了", }).then(res => res.json()).then(console.log)
8, 打开console栏, 把准备好的代码粘贴进去, 然后回车↓
9, 提示修改成功, 刷新一下网页↓ 可以看到"不允许任何人"出现了, 而且√也在上面. 
10, 再去QQ电脑端或者手机端确认一下. 我用的是电脑TIM:
搞定!
*在研究这个方法之前搜索了一遍网络, 得到的结果无非三种, 用老版QQ, 设置成答对问题, 用专门的软件(可能有潜在的盗号风险). 我这个方法公开透明, 自己动手多安全咯~
*可能有人会问, 为什么不用f12把表单的代码改成可见, 答案是否定的. 就算把不允许任何人的元素显示出来了, 点击之后是不会有post请求的, 所以才用到模拟post.

星期六, 六月 01, 2019

127 发一个安卓淘宝客户端的UA

Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; MI MAX Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 UWS/3.19.0.12 Mobile Safari/537.36 AliApp(TB/8.8.0) UCBS/2.11.1.1 TTID/10003959@taobao_android_8.8.0 WindVane/8.5.0 1080X1920 UT4Aplus/0.2.16
淘宝客户端的不像QQ钉钉微信那么好抓, 它屏蔽了所有外部链接, 不能用内置浏览器打开, 这时候就要用到抓包工具了.
我在安卓端用的是 无root抓包, 导入了CA, 虽然不知道有没有用, 但是感觉类似中间人攻击什么的, 总之UA是抓到了.
不要尝试在浏览器上模拟UA访问淘宝, 会弹出对话框要求传参的.

星期日, 五月 26, 2019

126 通过路由侠 + USB Redirector实现 USB设备互联网共享

本文中提到的 USB Redirector Technician Edition(以下简称USBR)和 路由侠, 在博客附件链接中会提供. 由于我这条件有限, 在家写文章的时候, 就把一台办公室的电脑当服务端来使了, 服务端可以把这边共享出去的设备当做本地设备来用, 包括设备信息都可以看到. 看一看效果图:

↑服务端(可以理解为维修师傅)

↑客户端(相当于小白)
1, 服务端的准备工作: 
-路由侠, 用于内网穿透, 简单讲就是用来让客户端连服务端的. 
-服务端(32/64位), 这个自己判断, 服务端是需要安装的, 安装完后要用注册码注册成完整版(附件里有). 
-路由侠里新建一条映射, 端口号填USBR中默认的端口号32038↓
2, 客户端不需要准备工作, 直接打开对应的客户端版本(安全软件可能会拦截驱动安装, 记得选允许), 填入服务端路由侠增加好的线路↓
等连接成功后, 服务端USBR里面右键那个设备点连接就可以了(博文第一张效果图右边MI MAX处)
*路由侠可以用花生壳/ngrok等工具替代, 但是感觉路由侠好操作一些. 
*不适合传文件, 如果要传文件最好用QQ、网盘或者Firefox Send之类的服务. 
*淘宝上的远程刷机, 基本都是这个原理

125 乐播投屏电脑版 最后一个免费版本 + 安卓DLNA投屏工具BubbleUPnP

乐播投屏现在做成会员收费的了, 这DLNA的东西尼玛也能收费真是... 不过它在国内电视上占的份额很高. 因为用习惯了, 找国外的工具嫌麻烦. 这个免费版目前还能用, 就是第一次配置的时候有点麻烦. 
去C:\Windows\System32\drivers\etc\ 底下, 打开hosts文件, 写一行这个, 来屏蔽升级服务器:
127.0.0.1 cdn.hpplay.com.cn
然后从博客附件链接里下载压缩包(此包内有安卓手机端和安卓电视端), 解压后运行 安装.bat 进行安装, 原版安装包只能安装在 C:\lebo 下, 十分脑残, 于是就自己做了个批处理来取代安装. 由于从hosts屏蔽了升级服务器, 所以不会提示升级. 这也是乐播最后一个免费版本了. 
下面说说安卓. 安卓手机上, 有两种投屏方式. 
1, Miracast, 镜像屏幕, 就是说, 把你手机上的内容投屏到其它设备(比如安卓电视机)上, 可以用作会议演示. 
2, DLNA, 是把视频传给投屏器(比如安卓电视机), 让投屏器自己解码播放, 可以用来播放手机里的视频图片等. 
以上理论知识来源于xulihang的博客, 第一种现在直板手机好像都自带, 在此引用必捷互联网站部分品牌miracast无线投屏功能打开的方法↓
  • HTC: 设置 - 媒体输出
  • ASUS华硕: 设置 - 更多 - Play To
  • Samsung三星: 快速连接 - Screen Mirroring
  • SONY索尼: 设置 - Xperia联机 - 屏幕同步显示
  • 小米: 设置 - 无线和网络 - 其它无线连接 - 无线显示
  • LG: 设置 - 共享&连接 - Miracast
  • Google谷歌: 设置 - 显示 - Miracast
  • InFocus富可视: 设置 - 投放屏幕 - 启用无线屏幕分享
  • OPPO: 设置 - 无线和网络 - 更多 - WLAN Display
  • Huawei华为: 快捷方式 - 多屏幕
  • Acer(宏碁hóng qí): 设定 - 显示 - 无线屏幕分享

苹果就一种, AirPlay, 没啥好说的, 操作简单. 
安卓手机上, 第二种, 也就是DLNA协议的投屏软件有很多, 之前用的乐播投屏, 但是极其反感里面的各种辣鸡推荐, 几次更新之后, 镜像投屏的功能反而不好使了, 于是就找了找, 找到了BubbleUPNP, 博客附件链接中我记得应该是个高级解锁版, 至于高级版有什么神秘功能也已经忘记了... 软件全英文, 对于接收端(比如安卓电视)不支持的格式, 比如mkv, 可以配合手机上的MX Player等国外主流播放器进行解码. 正常使用的时候, 记得把Renderer选成你的电视(带IP地址的)↓
Bubble支持一些云端网盘, Qobuz, Tidal, Google Drive/Music/Photos, Dropbox, Box, OneDrive, Amazon Cloud Drive. 也支持书签和播放列表功能. 

124 淘宝手机网页版 用改UA的方式禁止启动淘宝安卓客户端

众所周知, 安卓版的淘宝客户端是又卡体积又大. 所以我一般都用网页版. 先分享两个地址:
我的淘宝: https://h5.m.taobao.com/mlapp/mytaobao.html
搜索框(搜东西直接从这进入): https://s.m.taobao.com/h5
但是网页版总是他么的调起手机上的东西, 因为我手机是没装淘宝客户端, 它会调起一个选择窗, 是两个应用商店, 让你选用哪个打开. 如果手机上装了淘宝客户端, 那就直接会调起来了. 每访问一个网页都会这样, 其实就是为了逼着你使用客户端. 
如标题所示, 最简单的方法就是改UA, 改成苹果UA, 下面分享一个iPhone 6的.
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
很多浏览器都支持自定义UA, 如果你用的UCQQ之流, 那么你肯定不适合折腾, 还是放弃了吧. 
我用的是Yandex安卓浏览器, 配合Google的User-Agent Switcher for Chrome扩展使用, 这个扩展有域名名单(Permanent Spoof List)的功能, 凡是在名单里的, 都必须走指定UA. 于是我就把(前四个为阿里系域名)
tmall.com
taobao.com
alicdn.com
mmstat.com
jd.com
mail.163.com
zhihu.com
tieba.baidu.com
我平时常用的几个天天叫着安装APP的沙比域名, 都加入到名单里了↓ 横屏方便截完整图
20191004更新: 上面这个扩展有一个bug就是打开主程序或者设置界面的时候巨慢, 要卡个十几秒才可以, 此类扩展我还推荐一个(开源): 简易扩展, 因为名字和功能完全不相关所以在网上搜UA之类的关键词基本搜不到, 是逛帖子的时候才看到的. 同样也可以在安卓yandex上使用. 亮点是可以给同一个网站设置多个cookie来回切换, Swap My Cookies要依赖EditThisCookie, 之前还见过一个收费的, 这个简易扩展又可以改UA又可以切换cookies, 何乐而不为呢.


这样一来, 每次访问这些网站, 就不会弹到app里去了 :-P

星期二, 五月 07, 2019

123 [转载] ShadowsocksR 协议插件文档

概要

用于方便地产生各种协议接口。实现为在原来的协议外套一层编码和解码接口,不但可以伪装成其它协议流量,还可以把原协议转换为其它协议进行兼容或完善(但目前接口功能还没有写完,目前还在测试完善中),需要服务端与客户端配置相同的协议插件。插件共分为两类,包括混淆插件和协议定义插件。

现有插件介绍

1.混淆插件

此类型的插件用于定义加密后的通信协议,通常用于协议伪装,部分插件能兼容原协议。
plain:表示不混淆,直接使用协议加密后的结果发送数据包
http_simple:并非完全按照http1.1标准实现,仅仅做了一个头部的GET请求和一个简单的回应,之后依然为原协议流。使用这个混淆后,已在部分地区观察到似乎欺骗了QoS的结果。对于这种混淆,它并非为了减少特征,相反的是提供一种强特征,试图欺骗GFW的协议检测。要注意的是应用范围变大以后因特征明显有可能会被封锁。此插件可以兼容原协议(需要在服务端配置为http_simple_compatible),延迟与原协议几乎无异(在存在QoS的地区甚至可能更快),除了头部数据包外没有冗余数据包,客户端支持自定义参数,参数为http请求的host,例如设置为cloudfront.com伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。服务端也支持自定义参数,意义为客户端仅能填写的参数列表,以逗号分割。
本插件的高级设置(C#版、python版及ssr-libev版均支持):本插件可以自定义几乎完整的http header,其中前两行的GET和host不能修改,可自定义从第三行开始的内容。例子:
baidu.com#User-Agent: abc\nAccept: text/html\nConnection: keep-alive
这是填于混淆参数的内容,在#号前面的是上文所说的host,后面即为自定义header,所有的换行使用\n表示(写于配置文件时也可直接使用\n而不必写成\n,换行符亦会转换),如遇到需要使用单独的\号,可写为\\,最末尾不需要写\n,程序会自动加入连续的两个换行。
http_post:与http_simple绝大部分相同,区别是使用POST方式发送数据,符合http规范,欺骗性更好,但只有POST请求这种行为容易被统计分析出异常。此插件可以兼容http_simple,同时也可兼容原协议(需要在服务端配置为http_post_compatible),参数设置等内容参见http_simple,密切注意如果使用自定义http header,请务必填写boundary。
random_head(不建议使用):开始通讯前发送一个几乎为随机的数据包(目前末尾4字节为CRC32,会成为特征,以后会有改进版本),之后为原协议流。目标是让首个数据包根本不存在任何有效信息,让统计学习机制见鬼去吧。此插件可以兼容原协议(需要在服务端配置为random_head_compatible),比原协议多一次握手导致连接时间会长一些,除了握手过程之后没有冗余数据包,不支持自定义参数。
tls1.2_ticket_auth(强烈推荐):模拟TLS1.2在客户端有session ticket的情况下的握手连接。目前为完整模拟实现,经抓包软件测试完美伪装为TLS1.2。因为有ticket所以没有发送证书等复杂步骤,因而防火墙无法根据证书做判断。同时自带一定的抗重放攻击的能力,以及包长度混淆能力。如遇到重放攻击则会在服务端log里搜索到,可以通过grep "replay attack"搜索,可以用此插件发现你所在地区线路有没有针对TLS的干扰。防火墙对TLS比较无能为力,抗封锁能力应该会较其它插件强,但遇到的干扰也可能不少,不过协议本身会检查出任何干扰,遇到干扰便断开连接,避免长时间等待,让客户端或浏览器自行重连。此插件可以兼容原协议(需要在服务端配置为tls1.2_ticket_auth_compatible),比原协议多一次握手导致连接时间会长一些,使用C#客户端开启自动重连时比其它插件表现更好。客户端支持自定义参数,参数为SNI,即发送host名称的字段,此功能与TOR的meek插件十分相似,例如设置为cloudfront.net伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。推荐自定义参数设置为cloudflare.comcloudfront.net。服务端暂不支持自定义参数。

2.协议定义插件

此类型的插件用于定义加密前的协议,通常用于长度混淆及增强安全性和隐蔽性,部分插件能兼容原协议。
origin:表示使用原始SS协议,此配置速度最快效率最高,适用于限制少或审查宽松的环境。否则不建议使用。
verify_deflate(不建议):对每一个包都进行deflate压缩,数据格式为:包长度(2字节)|压缩数据流|原数据流Adler-32,此格式省略了0x78,0x9C两字节的头部。另外,对于已经压缩过或加密过的数据将难以压缩(可能增加1~20字节),而对于未加密的html文本会有不错的压缩效果。因为压缩及解压缩较占CPU,不建议较多用户同时使用此混淆插件。此插件不能兼容原协议,千万不要添加_compatible的后缀。
verify_sha1(即原版OTA协议,已废弃):对每一个包都进行SHA-1校验,具体协议描述参阅One Time Auth,握手数据包增加10字节,其它数据包增加12字节。此插件能兼容原协议(需要在服务端配置为verify_sha1_compatible)。
auth_sha1(已废弃):对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码。此插件提供了能抵抗一般的重放攻击的认证,默认同一端口最多支持64个客户端同时使用,可通过修改此值限制客户端数量,使用此插件的服务器与客户机的UTC时间差不能超过1小时,通常只需要客户机校对本地时间并正确设置时区就可以了。此插件与原协议握手延迟相同,能兼容原协议(需要在服务端配置为auth_sha1_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。
auth_sha1_v2(已废弃):与auth_sha1相似,去除时间验证,以避免部分设备由于时间导致无法连接的问题,增长客户端ID为8字节,使用较大的长度混淆。能兼容原协议(需要在服务端配置为auth_sha1_v2_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。
auth_sha1_v4(不建议):与auth_sha1对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码,对包长度单独校验,以抵抗抓包重放检测,使用较大的长度混淆,使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可。能兼容原协议(需要在服务端配置为auth_sha1_v4_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。
auth_aes128_md5auth_aes128_sha1(均推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,同时此协议支持单端口多用户,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有做简单的校验。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。
auth_chain_a(强烈推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,数据流自带RC4加密,同时此协议支持单端口多用户,不同用户之间无法解密数据,每次加密密钥均不相同,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有加密及长度混淆。使用此插件建议加密使用none。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数,最小值支持直接设置为1,此插件能实时响应实际的客户端数量(你的客户端至少有一个连接没有断开才能保证你占用了一个客户端数,否则设置为1时其它客户端一连接别的就一定连不上)。
auth_chain_b(强烈推荐):与auth_chain_a几乎一样,但TCP部分采用特定模式的数据包分布(模式由密码决定),使得看起来像一个实实在在的协议,使数据包分布分析和熵分析难以发挥作用。如果你感觉当前的模式可能被识别,那么你只要简单的更换密码就解决问题了。此协议为测试版本协议,不能兼容原协议
推荐使用auth_chain_*系列插件,在以上插件里混淆能力较高,而抗检测能力最高,即使多人使用也难以识别封锁。同时如果要发布公开代理,以上auth插件均可严格限制使用客户端数(要注意的是若为auth_sha1_v4_compatible,那么用户只要使用原协议就没有限制效果),而auth_chain_*协议的限制最为精确。

混淆特性

nameRTTencode speedbandwidthanti replay attackcheat QoSanti analysis
plain0100%100%No0/
http_simple020%/100%20%/100%No9070
http_post020%/100%20%/100%No10070
random_head (X)1100%85%/100%No010
tls1.2_ticket_auth198%75%/ 95%Yes10090
说明:
  • 20%/100%表示首包为20%,其余为100%速度(或带宽),其它的 RTT 大于0的混淆,前面的表示在浏览普通网页的情况下平均有效利用带宽的估计值,后一个表示去除握手响应以后的值,适用于大文件下载时。
  • RTT 表示此混淆是否会产生附加的延迟,1个RTT表示通讯数据一次来回所需要的时间。
  • RTT 不为0且没有 anti replay attack 能力的混淆,不论协议是什么,都存在被主动探测的风险,即不建议使用random_head。 RTT 为0的,只要协议不是 origin,就没有被主动探测的风险。当然由于原协议本身也存在被主动探测的风险,在目前没有观察到主动探测行为的情况下,暂时不需要太担心。
  • cheat QoS 表示欺骗路由器 QoS 的能力,100表示能完美欺骗,0表示没有任何作用,50分左右表示较为严格的路由能识别出来。
  • anti analysis 表示抗协议分析能力,plain 的时候依赖于协议,其它的基于网友反馈而给出的分值。值为100表示完美伪装。

协议特性

假设 method = "aes-256-cfb"
以下所有协议与均 anti CPA
nameRTTencode speedbandwidthanti CCAanti replay attackanti MITM detectanti packet length analysis
origin0100%99%NoNoNo0
verify_deflate030%97%~110%NoNoNo6
verify_sha1 (X)085%98%/99%NoNoNo0
auth_sha1 (X)095%97%NoYesNo4
auth_sha1_v2 (X)094%80%/97%NoYesNo10
auth_sha1_v4090%85%/98%NoYesNo10
auth_aes128_md5080%70%/98%YesYesYes10
auth_aes128_sha1070%70%/98%YesYesYes10
auth_chain_a070%75%/98%YesYesYes15
auth_chain_b070%70%/98%YesYesYes20
说明:
  • 以上为浏览普通网页(非下载非看视频)的平均测试结果,浏览不同的网页会有不同的偏差
  • encode speed仅用于提供相对速度的参考,不同环境下代码执行速度不同
  • verify_deflate的bandwidth(有效带宽)上限110%仅为估值,若数据经过压缩或加密,那么压缩效果会很差
  • verify_sha1的bandwidth意为上传平均有效带宽98%,下载99%
  • auth_aes128_md5的bandwidth在浏览普通网页时较低(为了较强的长度混淆,但单个数据包尺寸会保持在 TCP MSS 以内,所以其实对网速影响很小),而看视频或下载时有效数据比率比auth_sha1要高,可达97%,所以不用担心下载时的速度。auth_chain_a及auth_aes128_md5类似
  • 如果同时使用了其它的混淆插件,会令bandwidth的值降低,具体由所使用的混淆插件及所浏览的网页共同决定
  • 对于抗包长度分析一列,满分为100,即0为完全无效果,5以下为效果轻微,具体分析方法可参阅方校长等人论文
  • 对于抗包时序分析一列,方校长的论文表示虽然可利用,但利用难度大(也即他们还没能达到实用级),目前对此也不做处理

混淆与协议配置建议

  • 协议推荐:协议用auth_chain_*最佳,此时推荐不使用加密(设置为none),混淆随意
  • 加密选择:若协议用auth_chain_*,那加密用none(但不代表密码可以不写或两边不匹配),若协议不是auth_aes128_md5auth_aes128_sha1,那么不能使用rc4加密(可用rc4-md5)。这时加密可以在rc4-md5、salsa20、chacha20-ietf三个里面选择(rc4-md5可换为aes系列,salsa20可换为chacha20或bf-cfb),如果使用SSR还可特别选择rc4-md5-6。
  • 混淆推荐:如果QoS在你的地区明显,混淆建议在http_simpletls1.2_ticket_auth中选择,具体选择可以通过自己的试验得出。如果选择混淆后反而变慢,那么混淆请选择plain。如果你不在乎QoS,但担心你的个人vps能不能持久使用,那么混淆选择plaintls1.2_ticket_auth,协议选择auth_chain_*auth_aes128_*
  • 如果你用于玩游戏,或对连接延迟有要求的情况下,建议不要使用tls1.2_ticket_auth混淆,用其它混淆或plain
  • 服务端里,http_simplehttp_post是相互兼容的,没有使用上的区别
  • 如果你在公司,或学校,或某些环境下,发现原版SS协议不可用,建议你启用http_simplehttp_posttls1.2_ticket_auth混淆,同时端口相应使用80或443,通常能解决问题。同时能躲避你所在环境下的网络封锁(如禁止访问网盘禁止上传等等)
  • 如果使用tls1.2_ticket_auth混淆或不开启混淆,那么协议最好不要使用originverify_sha1
  • 如果使用二重代理,一般你只需要考虑越过防火墙的那一段使用混淆或加强协议,除非为了匿名
  • 如果你发现你的代理突然不能用了,但换一个端口又能用了,或者等15分钟到半小时后又能用了,这种情况下请联系我

配置方法

服务端配置:使用最新SSR的manyuser分支
user-config.json或config.json里有一个protocol的字段,目前的可能取值为:
origin
verify_deflate (不建议)
verify_sha1 (已过时)
verify_sha1_compatible (已过时)
auth_sha1 (已过时)
auth_sha1_compatible (已过时)
auth_sha1_v2 (已过时)
auth_sha1_v2_compatible (已过时)
auth_sha1_v4 (不建议)
auth_sha1_v4_compatible (不建议)
auth_aes128_md5
auth_aes128_sha1
auth_chain_a
auth_chain_b
user-config.json或config.json里有一个obfs的字段,目前的可能取值为:
plain
http_simple
http_simple_compatible
http_post
http_post_compatible
random_head (已过时)
random_head_compatible (已过时)
tls1.2_ticket_auth
tls1.2_ticket_auth_compatible
默认为
"protocol":"auth_aes128_md5",
"obfs":"tls1.2_ticket_auth_compatible",
相应的
协议插件参数默认为"protocol_param":""
混淆插件参数默认为"obfs_param":""
对于protocol,必须服务端与客户端严格匹配
服务端配置为xxabc_compatible时(以compatible为后缀的),即服务端支持使用原版客户端,或使用配置插件为xxabcplain的ssr客户端。
客户端配置:使用本ssr版本,在编辑服务器配置里找到相应节点,最后在protocol选项和obfs选项的列表里选择需要使用的插件,然后填写相应的参数即可

兼容性

目前ssr-libev客户端、ssr-python及ssr-csharp支持全部没有标注为过时或不推荐的协议和混淆。

实现接口

以下以C#语言为例做说明
interface IObfs
成员函数
InitData()
参数:无
返回:一个自定义类型变量,通常用于保存此接口的全局信息,不应返回null,c语言中返回void*
说明:第一次创建实例前调用,同一服务端配置不会重复调用,服务端在建立监听时调用,客户端在第一次连接时调用。
SetServerInfo(ServerInfo serverInfo)
参数:ServerInfo结构,包含成员变量:
  • host: 字符串类型,服务端ip,客户端需要把域名转换为ip,如有前置代理,则直接使用配置时所用的域名也可,服务端需要获取监听ip
  • port: 整数类型,服务端监听端口
  • param: 用户设置的参数,字符串类型
  • data: 由InitData返回的结果,为object类型(c语言中使用void*)
  • iv: 客户端或服务端加密时使用的iv数组(c语言中需要添加额外字段以记录其长度,下同)
  • recv_iv: 客户端或服务端接收到的iv数组
  • key: 加密时使用的key(不是原key,是通过BytesToKey生成的指定长度数组)
  • tcp_mss: 整数类型,TCP分包大小,设置为1460
  • overhead: 整数类型,协议头部大小,需要由调用方设置
返回:无
说明:实例构造的时候(每个连接建立时)调用,调用前iv和key必须已经初始化;而接收到数据后先初始化recv_iv再调用插件。
int GetOverhead() 参数:无
返回:此插件在通信时的附加头部大小
Dispose()
参数:无
返回:无
说明:实例析构时(每个连接关闭时)调用
byte[] ClientPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端发送到服务端数据加密前调用此接口
byte[] ClientEncode(byte[] encryptdata, int datalength, out int outlength)
参数:需要编码的字节数组及其长度
返回:编码后的字节数组及其长度
说明:客户端发送到服务端数据加密后调用此接口
byte[] ClientDecode(byte[] encryptdata, int datalength, out int outlength, out bool needsendback)
参数:需要解码的字节数组及其长度
返回:解码后的字节数组及其长度,以及needsendback标记是否立即回发服务端数据。如needsendback为true,则会立即调用ClientEncode,调用时参数是一个长度为0的字节数组
说明:客户端收到服务端数据在解密前调用此接口
byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端收到服务端数据在解密后调用此接口
byte[] ServerPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端发送到客户端数据加密前调用此接口
byte[] ServerEncode(byte[] encryptdata, int datalength, out int outlength)
参数:需要编码的字节数组及其长度
返回:编码后的字节数组及其长度
说明:服务端发送到客户端数据加密后调用此接口
byte[] ServerDecode(byte[] encryptdata, int datalength, out int outlength, out bool needdecrypt, out bool needsendback)
参数:需要解码的字节数组及其长度
返回:解码后的字节数组及其长度,以及needdecrypt标记数据是否需要解密(一般都应该为true),以及needsendback标记是否立即回发客户端数据。如needsendback为true,则会立即调用ServerEncode并发送其返回结果,调用时参数是一个长度为0的字节数组
说明:服务端收到客户端数据在解密前调用此接口
byte[] ServerPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端收到客户端数据在解密后调用此接口
byte[] ClientUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端发送到服务端UDP数据加密前调用此接口
byte[] ClientUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端收到服务端UDP数据在解密后调用此接口
byte[] ServerUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端发送到客户端UDP数据加密前调用此接口
byte[] ServerUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端收到客户端UDP数据在解密后调用此接口

插件编写

有两类插件,一类是协议插件,一类是混淆插件
其中接口InitData, SetServerInfo, Dispose接口必须实现,其它的接口为通讯接口
编写协议插件的话,需要重写ClientPreEncrypt, ClientPostDecrypt, ServerPreEncrypt, ServerPostDecrypt,其它的按原样返回,needdecrypt必须为true,needsendback必须为false
编写混淆插件的话,需要重写ClientEncode, ClientDecode, ServerEncode, ServerDecode,其它的按原样返回。
如果编写的部分仅含客户端部分,那么只需要编写Client为前缀的两个接口,服务端同理。