欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
一、RS4特点
 
服务器响应状态码202或者412返回第一个cookie_s;然后js混淆生成了第二个cookie_t,只有携带有效的cookie_t才能正确请求页面状态码才是200
 
如何区分是几代版本,看cookie_t的第一个数字,绝大多数通过该数字就可以确定是几代
 
cookie_t大致有两种:FSSBBIl1UgzbN7N80T,FSSBBIl1UgzbN7N443T,其区别含义443(https)、80(http)其实是服务器的端口号
 
加载vm的1万多行代码入口特性用正则匹配是:ret=\S{4}\.call\(\S{4},(\S{4})\);
 
二、网站请求流程特点
 
1、第一次请求:
 
返回状态码202,与响应cookie_SFSSBBIl1UgzbN7N80S
 
响应源码只有光秃秃的内容,大致分为三部分见图说明,目前看到的这些js逻辑先了解下,重要的记住是它会生成一个全局变量动态$_ts,在vm代码里面会用到$_ts的变量;而meta里的动态content内容也是在vm代码里面需要使用到的
 
2、第二次请求:只携带cookie_S请求了外链js文件,之后js生成了cookie_T,响应状态码200,也是此次学习需要关注的地方,此处cookie是FSSBBIl1UgzbN7N80T
 
3、第三次请求:携带cookie_S与cookie_T再次请求urlA, 返回状态码200
 
4、之后当你打开谷歌开发者工具,就会自动debugger住,这是遇到该类网站看到的流程差不多就是这样
 
三、网站加载js的顺序
 
1、首先监听script断点,然后并清除浏览器缓存,再然后刷新网页,不停的下一步直到看到图下的js停下,这是第一步加载了外链的js文件代码,并赋给了$_ts对象
 
2、继续往下调试,跳到如图下,这是第二步,执行一段js,我们称之为主逻辑代码;它主要做了两件事,一件是将外链的js代码乱码还原成VM里的一万多行的代码,另一件则是给全局变量window.$_ts赋了很多属性变量;
 
3、搜索call,找到了VM代码的入口,此时外链的js内容被解密成VM的一万多行代码,即这里的_$KF;通过eval加载_$KF,即可进入第三步,则看到了VM的一万多行的代码。VM代码的主要作用就是生成cookie(加载动态的content以及动态的$_ts来生成),差不多就是这么个顺序
 
四、正式逻辑的研究
 
1、cookie如何定位?
 
有3种方法:① cookie当然是hook来得最快 ② watch监听document.cookie逐步调试找cookie生成位置 ③ 找到cookie的伪装数字索引等,全局搜索打断点找,本文采用hook的方式
 
堆栈回溯,找到了生成cookie的位置,这将是我们逆着扣函数的起点位置
 
再堆栈回溯,找到了vm代码的入口位置,这也是很多大佬喜欢hook eval的地方,在这个位置你可以找到window.$_ts所有已生成的的值,常常已此处为节点,获得window.$_ts变量,然后再扣vm代码函数逻辑
 
2、扣函数缺啥补啥注意事项?
 
注意事项1:虽然网页每次都是动态的变化js,但是改变的仅仅是变量混淆的名称,代码函数执行逻辑都是固定不变的,所以只需要先将js用fiddler替换为静态的然后扣逻辑
 
注意事项2:要么保存一份静态的网页进行扣代码(能保证函数的变量一直不变,但是控制流依然很多,慢慢调试大力出奇迹)。或者对保存的静态网页通过ast还原后再加载扣(ast还原后的代码网上找一找,此方法扣代码解决了控制流,减少鼠标的累),在这里强烈推荐Nanda的公众号
 
逆着来缺啥补啥,以此为入口去扣代码就行了,然后记住下面的2个重点关注的注意事项
 
注意事项1:meta content内容又在何处被取出来并使用了,要记住那个函数传参的位置,留一个入口,动态传content内容
 
注意事项2:全局变量$_ts是一个桥梁,在源码第一部分自执行js处生成,在vm代码中被多处使用。需要注意的是在vm代码里有没有被赋给哪个全局变量,比如在一开始var _$W6 = _$gM["$_ts"],$_ts赋给了_$W6,所以后面我们凡是找到与_$W6相关的变量使用,都要记笔记标记下,因为是动态的,所以下次我们需要传的也是这些变量
 
比如此处用到了_$W6._$Cl, _$W6._$Ms, _$W6._$GX, _$W6._$rj这4个变量,那么一定要记笔记此处是用的$_ts的4个变量值,下次我们要换的也是这4个变量的值
 
那确定了$_ts动态变量是哪些,我们留下来的入口就如下了
 
3、如何获取$_ts动态变量值?
 
每次加载网页返回时,首先用正则找到call的点,然后以此处为断点;处理逻辑有两件事需要做:
 
① 取出window.$_ts,通过索引或其它方法按位置去取前面我们需要的动态变量属性
 
② 将VM代码的内容取出来赋给一个临时变量(需要通过正则取一个顺序变量代码,自己摸索下,有4个属性变量与ts相关的需要进行顺序判断)
 
还有些关键点需要自己去探索,锁定ts动态量探索,差不多就是图片中的这个意思
 
4、如何定位MmEwMD后缀?
 
① 可以参考这篇文章讲的签名逻辑,后缀定位其实是改变了xhr.open替换成了VM代码里面的函数,而后缀生成主要是后缀转数组 + 套了一层cookie加密逻辑,抠出cookie逻辑基本后缀也差不多了
 
② 其它:了解下XMLHttpRequest 对象,作用是用于在后台与服务器交换数据,其主要特点如下
 
xhr=new XMLHttpRequest() :创建 XMLHttpRequest 对象
 
xhr.open("GET",url,false):初始化HTTP请求参数,但是并不发送请求。第三个参数为true表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应,false在请求失败时是否执行其余的代码无关紧要时使用
 
xhr.setRequestHeader(name, value):设置请求头
 
xhr.send():发送一个 HTTP 请求,参数可选,如果没有参数则是get请求
 
xhr.onreadystatechange = function(){if (xhr.readyState == 4 && xhr.status == 200) {……}}事件句柄触发后则执行相应函数(仅在状态为 4 时,我们才执行代码)
 
5、5代和4代有何区别?
 
5代和4代的核心加密逻辑差不多,抠出4代,5代也没问题;唯一有问题的在于128位数组里面有些指纹的逻辑需要细细研究;

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64812.shtml