php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 618|回复: 0

js逆向案例-rus4逻辑学习

[复制链接]

2667

主题

2674

帖子

9484

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
6695
贡献
0
注册时间
2021-4-14
最后登录
2024-5-14
在线时间
673 小时
QQ
发表于 2022-1-19 12:54:32 | 显示全部楼层 |阅读模式
目录
一、RS4特点
二、网站请求流程特点
三、网站加载js的顺序
四、正式逻辑的研究
1、cookie如何定位?
2、扣函数缺啥补啥注意事项?
3、如何获取`$_ts动态变量`值?
4、如何定位`MmEwMD后缀`?
5、5代和4代有何区别?

一、RS4特点
服务器响应状态码202或者412返回第一个cookie_s;然后js混淆生成了第二个cookie_t,只有携带有效的cookie_t才能正确请求页面状态码才是200
image.png
如何区分是几代版本,看cookie_t的第一个数字,绝大多数通过该数字就可以确定是几代
image.png
cookie_t大致有两种:FSSBBIl1UgzbN7N80T,FSSBBIl1UgzbN7N443T,其区别含义443(https)、80(http)其实是服务器的端口号

加载vm的1万多行代码入口特性用正则匹配是:ret=\S{4}\.call\(\S{4},(\S{4})\);
image.png
二、网站请求流程特点
1、第一次请求:

返回状态码202,与响应cookie_SFSSBBIl1UgzbN7N80S
image.png
响应源码只有光秃秃的内容,大致分为三部分见图说明,目前看到的这些js逻辑先了解下,重要的记住是它会生成一个全局变量动态$_ts,在vm代码里面会用到$_ts的变量;而meta里的动态content内容也是在vm代码里面需要使用到的
image.png
2、第二次请求:只携带cookie_S请求了外链js文件,之后js生成了cookie_T,响应状态码200,也是此次学习需要关注的地方,此处cookie是FSSBBIl1UgzbN7N80T
image.png
3、第三次请求:携带cookie_S与cookie_T再次请求urlA, 返回状态码200
image.png
4、之后当你打开谷歌开发者工具,就会自动debugger住,这是遇到该类网站看到的流程差不多就是这样
image.png
三、网站加载js的顺序
1、首先监听script断点,然后并清除浏览器缓存,再然后刷新网页,不停的下一步直到看到图下的js停下,这是第一步加载了外链的js文件代码,并赋给了$_ts对象
image.png
2、继续往下调试,跳到如图下,这是第二步,执行一段js,我们称之为主逻辑代码;它主要做了两件事,一件是将外链的js代码乱码还原成VM里的一万多行的代码,另一件则是给全局变量window.$_ts赋了很多属性变量;

image.png
3、搜索call,找到了VM代码的入口,此时外链的js内容被解密成VM的一万多行代码,即这里的_$KF;通过eval加载_$KF,即可进入第三步,则看到了VM的一万多行的代码。VM代码的主要作用就是生成cookie(加载动态的content以及动态的$_ts来生成),差不多就是这么个顺序
image.png
image.png
四、正式逻辑的研究
1、cookie如何定位?
有3种方法:① cookie当然是hook来得最快 ② watch监听document.cookie逐步调试找cookie生成位置 ③ 找到cookie的伪装数字索引等,全局搜索打断点找,本文采用hook的方式
image.png
堆栈回溯,找到了生成cookie的位置,这将是我们逆着扣函数的起点位置
image.png
再堆栈回溯,找到了vm代码的入口位置,这也是很多大佬喜欢hook eval的地方,在这个位置你可以找到window.$_ts所有已生成的的值,常常已此处为节点,获得window.$_ts变量,然后再扣vm代码函数逻辑
image.png
2、扣函数缺啥补啥注意事项?
注意事项1:虽然网页每次都是动态的变化js,但是改变的仅仅是变量混淆的名称,代码函数执行逻辑都是固定不变的,所以只需要先将js用fiddler替换为静态的然后扣逻辑

注意事项2:要么保存一份静态的网页进行扣代码(能保证函数的变量一直不变,但是控制流依然很多,慢慢调试大力出奇迹)。或者对保存的静态网页通过ast还原后再加载扣(ast还原后的代码网上找一找,此方法扣代码解决了控制流,减少鼠标的累),在这里强烈推荐Nanda的公众号

逆着来缺啥补啥,以此为入口去扣代码就行了,然后记住下面的2个重点关注的注意事项
image.png
注意事项1:meta content内容又在何处被取出来并使用了,要记住那个函数传参的位置,留一个入口,动态传content内容
image.png
注意事项2:全局变量$_ts是一个桥梁,在源码第一部分自执行js处生成,在vm代码中被多处使用。需要注意的是在vm代码里有没有被赋给哪个全局变量,比如在一开始var _$W6 = _$gM["$_ts"],$_ts赋给了_$W6,所以后面我们凡是找到与_$W6相关的变量使用,都要记笔记标记下,因为是动态的,所以下次我们需要传的也是这些变量
image.png
比如此处用到了_$W6._$Cl, _$W6._$Ms, _$W6._$GX, _$W6._$rj这4个变量,那么一定要记笔记此处是用的$_ts的4个变量值,下次我们要换的也是这4个变量的值
image.png
那确定了$_ts动态变量是哪些,我们留下来的入口就如下了
image.png
3、如何获取$_ts动态变量值?
每次加载网页返回时,首先用正则找到call的点,然后以此处为断点;处理逻辑有两件事需要做:

① 取出window.$_ts,通过索引或其它方法按位置去取前面我们需要的动态变量属性
② 将VM代码的内容取出来赋给一个临时变量(需要通过正则取一个顺序变量代码,自己摸索下,有4个属性变量与ts相关的需要进行顺序判断)
还有些关键点需要自己去探索,锁定ts动态量探索,差不多就是图片中的这个意思
image.png
4、如何定位MmEwMD后缀?
① 可以参考这篇文章讲的签名逻辑,后缀定位其实是改变了xhr.open替换成了VM代码里面的函数,而后缀生成主要是后缀转数组 + 套了一层cookie加密逻辑,抠出cookie逻辑基本后缀也差不多了

② 其它:了解下XMLHttpRequest 对象,作用是用于在后台与服务器交换数据,其主要特点如下
image.png
xhr=new XMLHttpRequest() :创建 XMLHttpRequest 对象
image.png
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 时,我们才执行代码)
image.png





上一篇:html+css+php+mysql实现注册+登录+修改密码(附完整代码)
下一篇:【Python Tkinter组件】——做一个简单常规的登录页面
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-5-15 02:43 , Processed in 0.155128 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表