某音直播signature参数补环境的那些刺激事
大家好呀,我是你们的好兄弟,星云牛马!这个
记得加入我们的学习群:
点击链接加入群聊:
我有话说:
2.补环境
啰嗦话就不说了,直接把加密的整个文件代码拿到本地,定睛一看,有ob混淆,二话不说,直接先上解混淆工具,解下混淆,一顿操作,代码清晰多了:

再一看,妈的,变量名是在太长了,调试影响观感,再简化变量名,压缩下:

哇哦,看起来舒服多了。调试少了很多眼睛痛苦。
接下来,写上测试代码:

我默认大家都会找到
好,开始操作,补了一些发现,结果如下:

看看源码:

是在这里挂载的,为啥浏览器能挂载到window下,node不行呢?但至少说明上面代码的
byted_acrawler对象,但是node不是,那就追踪这个变量看看呗:
  !function (_0xe67213, _0x19937e) {
    "object" == typeof exports && "undefined" != typeof module ?
      _0x19937e(exports) :
      "function" == typeof define && define.amd ?
        define(["exports"], _0x19937e) :
        _0x19937e((_0xe67213 = "undefined" != typeof globalThis ? globalThis : _0xe67213 || self).byted_acrawler = {});
  }(this, function (_0x1d18f2) {
    //省略代码几千行
    //……
    _0x1d18f2.frontierSign = _0x5c2014;
    _0x1d18f2.getReferer = _0x32e4a6;
    _0x1d18f2.init = _0x498349;
    _0x1d18f2.isWebmssdk = _0x1649bc;
    _0x1d18f2.report = _0x475194;
    _0x1d18f2.setConfig = _0x4a4111;
    _0x1d18f2.setTTWebid = _0x3a4a1a;
    _0x1d18f2.setTTWebidV2 = _0x3f0a66;
    _0x1d18f2.setTTWid = _0x271dea;
    _0x1d18f2.setUserMode = _0x3498af;
    Object.defineProperty(_0x1d18f2, "__esModule", {
      value: !0
    });
    
  })
可以看出,自执行函数传入了this,在浏览器是window,在node是global,然后看传进去干了啥,上面的三目运算中涉及的判断,我们对比下浏览器和node的区别:
| 浏览器 | node | 备注 | |
|---|---|---|---|
| exports | undefined | {} | exports实际就是module.exports | 
| module | undefined | ![]()  | 
|
| define | undefined | undefined | |
| globalThis | window | global | |
| this | window | global | 这里只讨论上述代码里传入的this,因为this很灵活,可以根据场景指向很多东西 | 
| self | window | undefined | |
| top | window | undefined | |
| process | undefined | object | |
有了上图,可以看出:
- 
浏览器是走:
 
故
- 
node走:
 
故最终将
综上分析后,就一目了然了,在
module.exports.frontierSign
exports.frontierSign
这里为了和浏览器尽可能一致,我们就想办法挂载在window.byted_acrawler上。
大道至简,直接将上述代码修改为:
  !function (_0xe67213, _0x19937e) {
        _0x19937e(window.byted_acrawler = {});
  }(this, function (_0x1d18f2) {
    //省略代码几千行
    //……
    _0x1d18f2.frontierSign = _0x5c2014;
    _0x1d18f2.getReferer = _0x32e4a6;
    _0x1d18f2.init = _0x498349;
    _0x1d18f2.isWebmssdk = _0x1649bc;
    _0x1d18f2.report = _0x475194;
    _0x1d18f2.setConfig = _0x4a4111;
    _0x1d18f2.setTTWebid = _0x3a4a1a;
    _0x1d18f2.setTTWebidV2 = _0x3f0a66;
    _0x1d18f2.setTTWid = _0x271dea;
    _0x1d18f2.setUserMode = _0x3498af;
    Object.defineProperty(_0x1d18f2, "__esModule", {
      value: !0
    });
    
  })
接着挂上代理,缺啥补啥:

万万没想到,补上了ua就出值了,出值后,发现过了会又输出了东西。肯定是settimeout的问题,全局搜索直接注释了,看着碍眼:

拿着这个值去请求wss直连,发现不能成功,原因呢就是没有通过dom检测啦,你可以全局搜索

直接在这里魔改envcode为1,59等(尽可能小点)其实都不用补环境了,,,,,,当然,定位到这需要勇气和意识。
所以最终补环境补全也可,魔改这个值也可。
如果魔改,那么就是大道至简:
document = {};
window = {};
navigator = {
  userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
};
3.验证
完整补环境代码在星球,感兴趣的伙伴可以咨询:
记得加入我们的学习群:961566389
点击链接加入群聊:https://h5.qun.qq.com/s/62P0xwrCNO
                    
                


                
            
        
浙公网安备 33010602011771号