
瑞数目前有3代、4代、5代、5代半、6代(最新)对于绝大多数使用了瑞数的网站来说,有以下几点特征:
- 打开开发者工具(F12)会依次出现两个典型的无限 debugger:
- 三次请求,首次请求响应码是202(瑞数3、4代)或者412(瑞数4代、5代)并且返回cookie_s,接着请求一个js混淆文件生成cookie_t,携带cookie_t才能去成功请求页面:
- 瑞数4代cookie_s和cookie_t大致有两种表现形式:
端口号 | cookie_s | cookie_t |
---|---|---|
80(http) | FSSBBIl1UgzbN7N80S | FSSBBIl1UgzbN7N80T |
443(https) | FSSBBIl1UgzbN7N443S | FSSBBIl1UgzbN7N443T |
- 瑞数的版本号我们可以通过Cookies中
cookie_t
的第一个数字来确定,如果是4开头就是4代,如果是5开头就是5代:
FSSBBIl1UgzbN7N80T=37Na97B.nWX3....
:数字80是http协议的默认端口号,对应http请求,其值第一位为3,表示3代瑞数;FSSBBIl1UgzbN7N443T=4a.tr1kEXk.....
:数字443是https协议的默认端口号,对应https请求,其值第一位为4,表示4代瑞数。
瑞数5代则有以T和S结尾或以O和P结尾的两个 Cookie,和3、4代不同的是,5 代没有加端口号了:
WvY7XhIMu0fGT=53.9fybty......
:以T结尾,其值第一位为5,表示5代瑞数。
vsKWUwn3HsfIO=57C6DwDUXS.....
:以O结尾,其值第一位为5,表示5代瑞数;
- 瑞数的 JS 混淆代码中,变量、方法名大多类似于
_$xx
,有众多的if-else
控制流,新版瑞数还可能会有 jsvmp 以及众多三目表达式的情况:
- 看入口,瑞数有个流程是在虚拟机 VM 中加载 1w+ 行的代码,加载此代码的入口,不同版本也不一样,示例如下:
- 4 代:
ret = _$DG.call(_$6a, _$YK);
,_$DG
实际上是eval
,有关键字ret
,call
是明文;
- 5 代:5 代种类比较多了,最初和 4 代的类似,比如
ret = _$Yg.call(_$kc, _$mH);
,有关键字 ret,call 是明文,也有没有 ret 关键字的版本,比如_$ap = _$j5.call(_$_T, _$gp);
,也有像 3 代那样全部混淆了的,比如:_$x8 = _$mP[_$nU[15]](_$z3, _$Ec);
,_$mP
实际上是eval
,_$nU[15]
实际上是call
,混淆的call
与 3 代的区别就是 5 代是在一个数组里取值得到的;