js逆向案例-rus4逻辑学习
Posted 十一姐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js逆向案例-rus4逻辑学习相关的知识,希望对你有一定的参考价值。
目录
一、RS4特点
-
服务器响应状态码202或者412返回第一个cookie_s;然后js混淆生成了第二个cookie_t,只有携带有效的cookie_t才能正确请求页面状态码才是200
-
如何区分是几代版本,看
cookie_t
的第一个数字,绝大多数通过该数字就可以确定是几代
-
cookie_t大致有两种:
FSSBBIl1UgzbN7N80T
,FSSBBIl1UgzbN7N443T
,其区别含义443(https)、80(http)其实是服务器的端口号 -
加载vm的1万多行代码入口特性用正则匹配是:
ret=\\S4\\.call\\(\\S4,(\\S4)\\);
二、网站请求流程特点
-
1、第一次请求:
返回状态码202
,与响应cookie_S
FSSBBIl1UgzbN7N80S
- 响应源码只有光秃秃的内容,大致分为三部分见图说明,目前看到的这些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相关的需要进行顺序判断
)
- ① 取出window.$_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位数组里面有些指纹的逻辑需要细细研究;
以上是关于js逆向案例-rus4逻辑学习的主要内容,如果未能解决你的问题,请参考以下文章
Web Spider案例 网洛克 第三题 AAEncode加密 练习
# yyds干货盘点 # 盘点一份JS逆向代码转换为Python代码的教程
App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原