js逆向案例-rus4逻辑学习

Posted 十一姐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js逆向案例-rus4逻辑学习相关的知识,希望对你有一定的参考价值。

一、RS4特点

  • 服务器响应状态码202或者412返回第一个cookie_s;然后js混淆生成了第二个cookie_t,只有携带有效的cookie_t才能正确请求页面状态码才是200

  • 如何区分是几代版本,看cookie_t的第一个数字,绝大多数通过该数字就可以确定是几代

  • cookie_t大致有两种:FSSBBIl1UgzbN7N80TFSSBBIl1UgzbN7N443T,其区别含义443(https)、80(http)其实是服务器的端口号

  • 加载vm的1万多行代码入口特性用正则匹配是:ret=\\S4\\.call\\(\\S4,(\\S4)\\);

二、网站请求流程特点

  • 1、第一次请求:

    • 返回状态码202,与响应cookie_SFSSBBIl1UgzbN7N80S
    • 响应源码只有光秃秃的内容,大致分为三部分见图说明,目前看到的这些js逻辑先了解下,重要的记住是它会生成一个全局变量动态$_ts,在vm代码里面会用到$_ts的变量;而meta里的动态content内容也是在vm代码里面需要使用到的
  • 2、第二次请求:只携带cookie_S请求了外链js文件,之后js生成了cookie_T,响应状态码200,也是此次学习需要关注的地方,此处cookie是FSSBBIl1UgzbN7N80T

  • 3、第三次请求:携带cookie_Scookie_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个重点关注的注意事项

  • 注意事项1meta 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位数组里面有些指纹的逻辑需要细细研究;

以上是关于js逆向案例-rus4逻辑学习的主要内容,如果未能解决你的问题,请参考以下文章

Web Spider案例 网洛克 第三题 AAEncode加密 练习

# yyds干货盘点 # 盘点一份JS逆向代码转换为Python代码的教程

App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原

201555332盛照宗—网络对抗实验1—逆向与bof基础

JavaScript(JS)逆向工具Tampermonkey用法 (JS Hook代码逆向破解)

爬虫案例之网易有道翻译JS代码复杂版