[007]爬虫系列 | 猿人学爬虫攻防大赛 | 第五题: js混淆 乱码增强(中)

"本文深入探讨了一段JavaScript混淆代码,旨在找出Cookie属性RM4hZBv0dDon443M的生成过程。通过分析和调试,作者揭示了该属性与'世上无难事,只要肯放弃'字符串的关联,发现其涉及到AES加密和Base64解码。虽然具体加密的原始数据未完全解析,但已找到关键步骤,包括从_$8K['_$ss']到_$8K["_$pr"],并计划在后续文章中进一步解析。"
摘要由CSDN通过智能技术生成

一、备注

在阅读此文章前,请先阅读前一篇《[007]爬虫系列 | 猿人学爬虫攻防大赛 | 第五题: js混淆 乱码增强(上)》

 

二、找参数来源(二) 

在前一篇文章中,我们找出了Cookie里面m生成函数,并且封装出来了一个脚本!!!本篇文章我们就来找cookie另外一个属性:

RM4hZBv0dDon443M

不知道大家还记不记得,我们前一篇中有找到一段代码:

由这一段代码生成的:

$_ow = "";
  
        for (var h = 0; h < window["$$$"]["length"]; h++) {
          $_ow += String["fromCharCode"](window["$$$"][h]["charCodeAt"]() - 78 - parseInt(h["toString"]()["slice"](0, 1)) * 2);
        }
  
        eval($_ow);

 我们直接在里面查找RM4hZBv0dDon443M看看,有没有我们所需要的东西!!!

果真存在!!!但是怎样子才能调试呢?除了看到上面之外,应该大家在分析上面那段代码的时候,肯定也会注意到这个!

 世上无难事,只要肯放弃!!!

这个很明显就是出题者给我们的一个提示啊!!!

既然 RM4hZBv0dDon443M和“世上无难事,只要肯放弃”在同一段代码里面,那么就可以找到其位置在哪!!!也就是可以对其进行调试了!

 直接搜索:RM4hZBv0dDon443M

果真在这里面!!!但是又存在一个问题了,生成其的_$8K['_$ss']到底是个啥?通过控制台打印显示undefined!!!直接搜索,并没找到!!!很明显此处做了处理!!!

那我们直接加断点进行调试!!!看看什么时候设置_$8K['_$ss']什么时候会变化!!!

通过F11找了很久没有,啥也没找到!!!所以我决定从_$8K开始找(总共66个):

通过一段时间的查找,找到了一个比较像_$8K["_$ss"]的东西:

控制台直接打印:_$UH[0x348][0x1] + _$UH[0x353][0x1]看看!!!

就是它!!! 

 但是_$8K["_$ss"]是前面加密的结果,但是他原数据是什么?

通过控制台打印发现:其实这里就是一个AES加密!!! _$8K[_$pe('0x6', 'OCbs')]就是其密钥!!!

这串字符有啥意义???看着挺像十六进制(因为最大不超过f)!!!那我们转为ASCII看看??!!!

// 网上找到十六进制转ASCII代码(https://www.cnblogs.com/toggle/p/10100682.html)
var hexCharCodeToStr = function(hexCharCodeStr) {
    var trimedStr = hexCharCodeStr.trim();
    var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
    var len = rawStr.length;
    if (len % 2 !== 0) {
        alert("存在非法字符!");
        return "";
    }
    var curCharCode;
    var resultStr = [];
    for (var i = 0; i < len; i = i + 2) {
        curCharCode = parseInt(rawStr.substr(i, 2), 16);
        resultStr.push(String.fromCharCode(curCharCode));
    }
    return resultStr.join("");
}

 到这里就有那味道了!!!很明显这就是一个base64加密的结果啊!!!

解密后发现,其实key就是一个有点像时间戳的东西!!!到底是啥,后面总结篇再谈谈!!!

找到了这里,我们就可以通过key来看看加密前的内容是什么了!

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
_ss = '6Zubkzk5CF/uHGWBvH5E1SHHvOshHHVM0al9jRR18SOQqyULsAV/3VNCqwRotWhTOTqizBqgRn8lVgbyxrpFF8lOWa+gxws5CPBaEs1sgWt1rYPLCpTmTZCDEKKmOXEurI4Iz9VflYFBQFPHUHQGNyPd5Wrl4O7IyO7G6RgwVeQ9cXpOt3YihrR+KODeWd6fm8GWMP8NoeGQznDwiLxU5iHHtq8f1I+wlYby08vKMts='.encode('utf-8')
_key = 'MTYwNDAyMzgyOTE4'.encode('utf-8')
cryptor = AES.new(_key, AES.MODE_ECB)
print(unpad(cryptor.decrypt(base64.b64decode(_ss)), AES.block_size).decode())

 我们发现加密前的数据就是一个由多个点构成的字符串!!!和上面一样,我们直接分割出来,然后通过十六进制转ASCII看看!!!

然而并没有发现什么,那我我们还是回到原本脚本看看!!!

 我们发现,_$8K["_$ss"]是由_$Ww生成的!!!那我们直接调试_$Ww看看!!!

我们发现了 _$8K["_$pr"], 居然和解密出来的结果一样!!!

备注&注意:

由于博主在写这篇文章的时候忘记备份了(写这篇文章时候分两个时间段写的)!!!导致写的东西全没了!!新开的一个网页重新写的,所以你们看到这_$8K["_$pr"]和上面解密出来的结果不一样!!!其实是一样的,只不过我这里重开了一个网页,里面的key这些全都变了引起的!!!原理一样!!!

那么_$8K["_$pr"] 到底是怎样形成的???我们直接搜索看看!!

我们一共找到了7个!!!断点调试看看!!!

我们调试发现,在这里每次执行完_$Wa函数之后,就会_$8K["_$pr"]就会多一个!!! 至于说五个数到底表示的是啥?我们下一篇汇总篇再解析!!!

此时此刻,似乎cookie里面的RM4hZBv0dDon443M也水落石出了!!!

我们下篇在汇总在一起!!!

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值