js逆向那些年一起秒过的瑞树之RS6

提示: 该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~


前言

瑞数,是逆向领域中的巍峨高山,挡在许多JS逆向者前进之路上的一道坚实围墙。然而,它也成为跳槽简历上的一抹亮点,我们必须在下一次职业转型前克服这个难关!好在现如今网络上有众多文章详细介绍瑞树相关内容,耐心地一步一步教导我们如何分析瑞树流程、剖析瑞树逻辑,试图将这些知识传授给我们(手动摸头)。然而,鲜有文字深入探讨如何通过纯补环境方式应对瑞树。今天,我们迎来了这样一篇文章!


一、瑞树是什么?

瑞树动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。瑞树 Botgate 多用于政企、金融、运营商行业,一度被视为反爬天花板.目前版本4.0,5.0,6.0,但本质是一样的,目标网站的结构:

1. 一个meta标签,其content内容很长且是动态的(每次请求会变化),会在eval执行第二层JS代码时使用到;

2. 一个script标签(与4代不同的是这里不是一个自执行函数,外链js文件里才有.call方法,4代的是.call在自执行函数里),里面的属性需要提供给外链js文件来生成加密参数(每次请求首页都会动态变化)

3. 一个外链js文件(自执行函数,与4代完全不同,像是两个调换了一下顺序,4代的自执行函数在html中,属性在外链js中,5代巧好相反,补环境需要注意,扣代码的话不用管,直接扣VM里面的再替换),一般同一页面中其内容是固定的,.call方法在里面,会也生成第二层VM代码

 提问环节?
一) 、如何区分网站反爬是否 RS:
三个特征:
1 、看页码返回的状态码是否202 或者412
2 、会有2层或者3层debugger
3、 会返回一个js文件,开头是固定的格式。

$_ts=window['$_ts'];if(!$_ts)$_ts={};$_ts.nsd=18308;$_ts.cd="qxxq

二)、如何区分RS树的版本:
查看生成COOKIE第一个数字
4代RS通常T、S结尾,第一个字母4开头
5代RS通常T、O结尾,第一个字母5开头
6代RS通常T、O结尾,第一个字母6开头
三)、搞定瑞数方案

  1. rpc 2、扣JS代码 3、补环境过 4、绕过检测HOOK

篇幅较长,坐稳发车咯

Part  One:RS的流程逻辑

 在做逆向之前明确逆向的目标,首先我们得分析出接口加密参数哪些是需要逆向得,然后在考虑如何去搞定这些加密参数。

  • 特征:通过Charles抓包,发现目标网站会有两次请求,第一次请求url 返回状态码412,第二次请求返回状态码200,表示请求成功,拿到数据。
  • 分析:现第二次请求url时带上了cookie_P和cookie_O 而cookies_O是来自第一次请求url时其响应头set的; 
  • 结论:那么逆向的目标就确定了 -- 破解cookie_P的生成逻辑;
瑞数网站请求流程分析:

第一次请求:  请求url,响应状态码位412,响应头中set了cookie_O;并生成了一个js

if($_ts.cd){(function(_$is,_$ai){var _$_g=0;function _$kz(){var _$jy=[69];Arr

第二次请求:请求url ,响应在状态码200,携带cookie_P,以及第一次请求set-cookie;

那么当我们在浏览器中访问该网站时到底发生了什么?其中有什么值得我们关注的?
我们先人工模拟一下浏览器加载url源码会发生什么:

  1. 浏览器加载meta ;
  2. 浏览器请求外链js并执行js内容;
  3. 执行page_url源码自执行函数,它内部会将外链js解密成eval需要的万行js字符串,并给window.$_ts添加了很多属性,然后调用eval函数进入VM执行解密后的js,生成cookie,eval执行完毕,继续执行自执行函数;
  4. 执行末尾script标签中的代码,这些代码会更新cookie_p(可以不用管
  5. 执行setTimeout、eventlistener回调函数(可以不用管

如何快速找到入口位置,当然是HOOK啦

(function() {
    // 严谨模式 检查所有错误
    'use strict';
    // document 为要hook的对象 这里是hook的cookie
    var cookieTemp = "";
    Object.defineProperty(document, 'cookie', {
        // hook set方法也就是赋值的方法 
        set: function(val) {
                // 这样就可以快速给下面这个代码行下断点
                // 从而快速定位设置cookie的代码
                console.log('Hook捕获到cookie设置->', val);
                debugger;
                cookieTemp = val;
                return val;
        },
        // hook get 方法也就是取值的方法 
        get: function()
        {
            return cookieTemp;
        }
    });
})();

当你调试时,发现了可恶的debugger ,不要慌张,我们还是可以HOOK过掉。

var _constructor = constructor;
Function.prototype.constructor = function(x) {
    if (x == "debugger") {
        console.log(x);
        return null;
    }
    return _constructor(x);
}

Part  Two 补环境大法:

// 补的环境头
window = this;
... 省略大量环境头
// 模拟meta标签及其content
document.createElement('meta');
Meta$content="l4xVDZ5NgK1Qc1faNF9EIHPFgoi.X.TfD2UziHm10EW";
// 固定的外链js
 $_ts = window['$_ts'];
            if (!$_ts)
                $_ts = {};
            $_ts.nsd = 49925;...省略';
// url动态自执行函数
if($_ts.cd){(function(_$is,_$ai){var _$_g=0;function _$kz(){var _$jy=[69];Array.prototype.push.apply(_$jy,argume; 很长...省略}}}}}}}})();;


// 获取cookie
function get_cookie(){
    return document.cookie;
}
// 获取MmEwMD参数
function get_mme(){{
    XMLHttpRequest.prototype.open("GET","http://脱敏/",true);
    return XMLHttpRequest.prototype.uri;
}}

Part  Three 弯道超车环节: 

过RS几乎是每个新手逆向者的小目标,也是面试官常见的提问点。通过本篇文章,我们已经了解了 RS的流程及破解思路,接下来我们可以尝试自己从头实现一个完善的补环境框架,去纯环境黑盒过RS,但是这会花费很长一段时间来进行开发,而且其中有很多重复性工作比较无聊(复制粘贴对比等)。

结果

总结

  1. 出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来.
  2. 本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步.
  3.  该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值