设为首页 加入收藏

TOP

【JS 逆向百例】猿人学系列 web 比赛第二题:js 混淆 - 动态 cookie,详细剖析(一)
2023-07-25 21:24:25 】 浏览:90
Tags:向百例 web 混淆 动态 cookie

1

逆向目标

逆向过程

抓包分析

进入网页,点击右键查看页面源代码,搜索不到直播间相关数据信息,证明是通过 ajax 加载的数据,ajax 加载有特殊的请求类型 XHR,打开开发者人员工具,刷新网页进行抓包,会跳转到虚拟机中,进入无限 debugger,过无限 debugger 的方式在往期文章中有详细介绍,感兴趣的可以去阅读学习一下,这里直接在 debugger 行右键选择 never pause here,然后下一步断点即可过掉:

2

在 Network 的筛选栏中选择 XHR,数据接口为 2,在响应预览中可以看到当前页各手机发布日的热度:

3

这时候点击第二页,会弹出提示框:cookie 失效,正在重置页面,证明 cookie 是有时效性的,并且会进行校验:

4

cookie 中有个关键加密参数 m,其内容如下:

5

逆向分析

通过 hook cookie 中 m 参数的方式对其进行定位,hook 的方式有很多种,可以阅读 K 哥往期文章,对其有详细介绍,这里使用编程猫 Fiddler 插件进行 hook,相关插件在 K哥爬虫公众号发送【Fiddler插件】即可获取,Hook 代码如下:

(function () {
  'use strict';
  var cookieTemp = '';
  Object.defineProperty(document, 'cookie', {
    set: function (val) {
      if (val.indexOf('m') != -1) {
        debugger;
      }
      console.log('Hook捕获到cookie设置->', val);
      cookieTemp = val;
      return val;
    },
    get: function () {
      return cookieTemp;
    },
  });
})();

勾选开启框,启动 Fiddler 进行 hook 注入:

6

刷新网页,如果进入无限 debugger,则按上述方式解决,不过直接通过 m 参数定位并不是最好的方案,因为该 cookie 中还有其他参数包含 m 字母,位置不对则刷新网页,这里成功断在 m 参数的值生成的位置:

7

向上跟栈到 _0xdad69f (2:18) 处,然后点击左下角 { } 格式化代码,会跳转到 2:formatted 文件的第 4943 行,该行内容如下:

document[$dbsm_0x42c3(qqLQOq, iOiqII) + $dbsm_0x42c3(q1IoqQ, QQlLlq)] = _0x5500bb['\x4e\x74\x44' + '\x72\x43'](_0x5500bb[$dbsm_0x42c3(qqqQoq, oqQiiO) + '\x6d\x65'](_0x5500bb[$dbsm_0x42c3(Ioo0ql, olq0Oq) + '\x6d\x65'](_0x5500bb[$dbsm_0x42c3(qOIqQi, OOqIQi) + '\x72\x44'](_0x5500bb[$dbsm_0x42c3(Q1qoqQ, lILOOq) + '\x72\x44'](_0x5500bb[$dbsm_0x42c3(qOO1Q0, oiqlQQ) + '\x72\x44'](Ql1OO0, _0x5500bb['\x7a\x76\x67' + '\x6c\x77'](_0x3c9ca8)), Qoqq0I), _0x5500bb[$dbsm_0x42c3(iqOiQ0, QOiq0Q) + '\x47\x6b'](_0x313b78, _0x160e3a)), lOo0QQ), _0x160e3a), _0x5500bb[$dbsm_0x42c3(qiOOiO, liQIoQ) + '\x4e\x5a']),

控制台打印后可知这里就是 cookie 中 m 参数值生成的位置:

8

在控制台中进一步打印分析下其他部分含义:

9

m 参数值的格式如下:

0ef478cf61e0749d7444c7997c917679|1663213224000

可以依此将代码进行简化:

_0x5500bb[$dbsm_0x42c3(iqOiQ0, QOiq0Q) + '\x47\x6b'](_0x313b78,_0x160e3a) + lOo0QQ + _0x160e3a

控制台打印验证,结果匹配:

10

接下来先跟进到 _0x5500bb[$dbsm_0x42c3(iqOiQ0, QOiq0Q) + '\x47\x6b'] 中,鼠标选中后点击进入:

11

在该文件的第 3911 行,内容如下:

_0x434ddb[$dbsm_0x42c3(Iooo0l, Qq1oqI) + '\x47\x6b'] = function(_0x105ffe, _0x733be0) {
            return _0x105ffe(_0x733be0);
        }

返回值为 _0x105ffe(_0x733be0),该函数传入的参数为 _0x313b78_0x160e3a,所以可以进一步改写:

_0x313b78(_0x160e3a) + lOo0QQ + _0x160e3a

_0x160e3a 为时间戳,因此 m 参数的值是将时间戳作为参数传入 _0x313b78 函数后加密得到的,所以需要进一步跟进到 _0x313b78 函数定义的位置,同样鼠标选中,点击即可跳转到第 4933 行,到 node 环境中调试,初步代码为:

function _0x313b78(_0x575158, _0x1fa91a, _0x1cf5de) {
    // 以下部分内容过长,此处省略
    // 完整代码关注 GitHub:https://github.com/kgepachong/crawler
}

var _0x160e3a = Date.parse(new Date());
var m = _0x313b78(_0x160e3a) + lOo0QQ + _0x160e3a;

console.log(m);

运行后会提示 _0x5500bb 未定义,到原文件中 ctrl + f 局部搜索这个函数,在第 3940 行:

_0x5500bb = _0x434ddb

补上运行后会提示 _0x434ddb 未定义,搜索后发现 _0x434ddb 在第 2817 行定义为一个空对象,后面向其中传入了很多值,类似于一个大数组,不能只补 _0x434ddb = {};,需要把传值部分补进去,不然后面运行时会出现些报错,经测试有的部分不要也可以,但是细扣就很麻烦了,直接全补即可,这就很多了,从第 2817 行一直扣到第 3939 行,补完后接着运行程序,这次又提示 $dbsm_0x42c3 未定义,接着搜找其定义位置,在第 94 行,补了后提示 OooIi1 未定义,在第 209 行,需要从第 209 行到第 2816 行全部补上,不然会提示其中某一个未定义,同样的,虽然经调试有的不需要也行,但是一个个调麻烦且没有必要,补完后接着运行又会提示 $dbsm_0x123c 未定义:

12

其在第 22 行,是个大数组,补了之后运行程序后发现卡住了,一段时间后程度报错:

13

这个报错可能是内存资源耗尽导致程序崩溃了,将这部分代码复制到浏览器中进行调试,开启

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇重温Python基础——用户输入和whi.. 下一篇Python中__new__方法的详细教程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目