声明:
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
1. 瑞舒介绍
瑞数信息是一家专注于提供互联网动态业务应用安全防护解决方案的公司
瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。
瑞数可以理解为是我们进入到JS逆向世界的标志
过瑞数的方法基本上有以下几种
-
补环境
-
纯算
-
自动化工具
2. 瑞数流程
2.1 瑞数之无限debug
// (1)
let _Function = Function;Function = function (s) {if (s === "debugger") {console.log(s);return null;}return _Function(s);
};// (2)
let _constructor = constructor;Function.prototype.constructor = function (s) {if (s === "debugger") {console.log(s);return null;}return _constructor(s);
};// (3)
Function.prototype._constructor = Function.prototype.constructor;
Function.prototype.constructor = function () {if (arguments && typeof arguments[0] === 'string') {if ("debugger" === arguments[0]) {return;}}return Function.prototype._constructor.apply(this, arguments);
};
2.2 流程
1. rs的网站会请求两次page_url(文档请求),第1次page_url(文档请求)会返回一个cookie1,和一个响应体(HTML源码),以及请求响应码是202或者 412
2. 响应体(HTML源码)包括3个部分:
-
一个meta标签,其content内容很长且是
动态
的(每次请求会变化),会在eval执行第二层JS代码时使用到; -
一个ts代码,下面的自执行函数会解密文件内容生成eval执行时需要的JS源码,也就是第二层vm代码;
-
一个大自执行函数(每次请求首页都会
动态
变化),给window添加一些属性如$_ts,会在vm中使用; -
这三个要素用于在本地生成一个cookie2,用于第2次请求
3. 第2次page_url(文档请求)携带cookie1和ncookie2,获取真正的页面内容!
瑞数 3、4 代有以 T 和 S 结尾的两个 Cookie,其中以 S 结尾的 Cookie 是第一次的 那个请求返回的,以 T 结尾的 Cookie 是由 JS 生成的,动态变化的,T 和 S 前面一般会跟 80 或 443 的数字,Cookie 值第一个数字为瑞数的版本。
瑞数 5 、6代也有以 T 和 S 结尾的两个 Cookie,但有些特殊的 5 代瑞数也有以 O 和 P 结尾的,同样的,以 O 结尾的是第一次的 412 那个请求返回的,以 P 结尾的是由 JS 生成的,Cookie 值第一个数字同样为瑞数的版本。
3. 瑞数案例解析
【1】基本结构与流程
【2】VM环境与入口
先定位入口,这里涉及一个VM环境
-
“VM”表示的是Virtual Machine(虚拟机),这些文件通常表示由浏览器生成和执行的虚拟机脚本环境中的临时脚本。这些脚本并不是项目源代码的一部分,也不是实际存在的物理文件。 它们在浏览器的内存中创建并执行。
-
比如说,当你在调试一个网页时,如果在某些动态生成并执行的JS代码上设定了断点,Chrome调试器会在一个以"VM"开头的文件中显示这些代码,例如"VM111.js"。这个"VM"文件的存在只是为了调试目的,它并不存在于服务器端,也不会被存储在本地,而是存在于浏览器内存中。一般情况下,这类文件的出现是因为浏览器对JavaScript代码的处理方式,如动态编译或者JavaScript堆栈跟踪。
-
通过eval函数或者new Function方法,Chrome浏览器会创建一个"VM"文件来展示这段临时执行的代码
通过脚本断点可以断住ts和自执行函数,因为第一次响应的index.html是动态的,所以为了后面调试,我们先试用文件替换本地化。
接下来在index.html中直接使用正则快速定位入口函数:
# 瑞数6:搜索.call
这个位置通常在分析瑞数的时候作为入口,图中 ==$dx== 实际上是 ==eval== 方法,传入的第一个参数 ==$eV== 是 ==Window 对象==,第二个对象 ==$9== 是我们前面看到的 VM 虚拟机中的 IIFE 自执行代码。
最后在入口位置单步调试,即可进入到VM环境!
后面的断点调试就在这个环境中。
【3】补环境
初始化补环境文件
delete __dirname
delete __filenametop = self = window = globaldocument = {}
location = {}
navigator = {}
history = {}
screen = {}function getEnv(proxy_array) {for (var i = 0; i < proxy_array.length; i++) {handler = `{\nget: function(target, property, receiver) {\nconsole.log('方法:get',' 对象:${proxy_array[i]}',' 属性:',property,' 属性类型:',typeof property,' 属性值类型:',typeof target[property]);return target[property];},set: function(target, property, value, receiver){\nconsole.log('方法:set',' 对象:${proxy_array[i]}',' 属性:',property,' 属性类型:',typeof property,' 属性值类型:',typeof target[property]);return Reflect.set(...arguments);}}`eval(`try {${proxy_array[i]};${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});} catch (e) {${proxy_array[i]} = {};${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});}`)}
}proxy_array = ['windo
接下来就是按之前教给大家的监控器补环境,可以看看 这篇我的文章 python爬虫:喜马拉雅登录案例-CSDN博客
注意content的值和auto.js是关联的,必须保持一致!