目录

文章目录

  • 目录
  • 声明
  • 逆向目标
  • 抓包分析
  • 参数定位
  • 混淆还原
    • 编写还原文件
    • 执行还原命令
    • 查看还原结果
  • 参数分析
  • 最终效果
  • 部分代码
  • 完整代码

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请在公众号联系我立即删除!

逆向目标

网址:aHR0cHM6Ly9zaC5lc2Z4aWFvcXUuemh1Z2UuY29tL3BhZ2UxLw==

目标:找到 Cookie acw_sc__v2 的生成逻辑

抓包分析

经过模拟请求分析后,发现主要核心 Cookie 为 acw_sc__v2,只要携带正确的 acw_sc__v2 ,则就可以正常请求到目标网站的数据。

参数定位

为了找到 acw_sc__v2 在哪里生成,直接使用 无痕模式 提前打开 DevTools(F12),打开网站,发现直接断在了下图位置

这个明显是 无限 debugger,右边有几处调用栈信息,点击查看

Network 中点击访问的页面,发现返回的内容就是以上的 JS 内容

发现最后调用了 reload 方法设置了 acw_sc__v2,其中 x 参数就是要设置的 Cookie 值,只要找到哪里调用了 reload,就水落石出了,直接搜索 reload 字符串,发现在其他地方都没找到,初步猜测是因为 JS 代码混淆的原因,接下来先把 JS 代码利用 AST 做下简单的还原。

混淆还原

看上面的代码,字符串字面量都被转换成了十六进制编码,这里使用 mk-ast-tool ,GitHub地址:https://github.com/Mankvis/mk-ast-tool(欢迎大家点下 Star)进行下简单还原,也就是字符串字面量还原。

1. 打开 mk-ast-tool 项目,在 pro 文件中创建项目文件 zhuge.js,因为这里只进行了简单的字符串字面量还原,所以直接使用公共插件中的 字符串还原 插件即可。2. 把网站中混淆的 JS 代码保存到本地放在根目录下,本文命名为 zhuge.js(命名自己随意)3. 执行命令 node main.js zhuge zhuge.js ,就会在根目录下输出 zhuge_output.js 还原后到代码。

编写还原文件

执行还原命令

node main.js zhuge zhuge.js

具体的使用方法请查看项目 mk-ast-tool ,GitHub地址:https://github.com/Mankvis/mk-ast-tool(欢迎大家点下 Star)。

查看还原结果

参数分析

上面通过 AST 还原了代码, 找到了实际就是要找到 arg2 的生成逻辑,这时候返回浏览器,在刚才的 JS 代码中,找到 arg2 直接下断。

然后回到当前断点,处理下 无限 debugger,处理方法很简单,直接在当前 debugger 行右键,选择 Never pause here即可

然后 F8 执行,直接来到了刚才下断点的地方

把上面的核心代码扣出来如下

var arg1 = '312B5604AF801D581BF9A4FF6F38AB78D8233A02';  // 定义在文件头部
var _0x5e8b26 = _0x55f3('0x3', '\x6a\x53\x31\x59'); // 定义在中间部分
var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')]();
arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26);
setTimeout('\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29', 0x2);

arg1定义在头部,每次刷新都会变动,所以后面要动态的去获取计算,_0x55f3 两个参数是固定的,所以 _0x5e8b26 的值应该可以固定。如果硬扣 _0x55f3 会发现进入死循环,推荐还是写固定值。

还原后的核心代码

var arg1 = '312B5604AF801D581BF9A4FF6F38AB78D8233A02';
var _0x5e8b26 = '300017600085600XXXXXX3003690027800375';
var _0x23a392 = arg1["unsbox"]();
arg2 = _0x23a392["hexXor"](_0x5e8b26);
setTimeout("reload(arg2)", 0x2);

代码网上找,发现了对 String 对象添加方法,正是 unsboxhexXor

这里用 Pythonunsbox 进行还原(代码在后面)

输出 52AFF7C0B359B1A109F314A48684E803FEB9EA6C

接着把 hexXor 还原(代码在后面)

输出 62afe0a0b3dcd1a70fe615f7b6878103d939e919,这个也就是最终需要的 Cookie 了。

最终效果

部分代码

JS 部分代码

 var _0x5e8b26 = _0x55f3("0x3", "jS1Y");String[_0x55f3("0x5", "n]fR")][_0x55f3("0x6", "Pg54")] = function (_0x4e08d8) {var _0x5a5d3b = "";for (var _0xe89588 = 0x0; _0xe89588 < this[_0x55f3("0x8", ")hRc")] && _0xe89588 < _0x4e08d8[_0x55f3("0xa", "jE&^")]; _0xe89588 += 0x2) {var _0x401af1 = parseInt(this[_0x55f3("0xb", "V2KE")](_0xe89588, _0xe89588 + 0x2), 0x10);var _0x105f59 = parseInt(_0x4e08d8[_0x55f3("0xd", "XMW^")](_0xe89588, _0xe89588 + 0x2), 0x10);var _0x189e2c = (_0x401af1 ^ _0x105f59)[_0x55f3("0xf", "W1FE")](0x10);if (_0x189e2c[_0x55f3("0x11", "MGrv")] == 0x1) {_0x189e2c = "0" + _0x189e2c;}_0x5a5d3b += _0x189e2c;}return _0x5a5d3b;};String["prototype"][_0x55f3("0x14", "Z*DM")] = function () {var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24];var _0x4da0dc = [];var _0x12605e = "";for (var _0x20a7bf = 0x0; _0x20a7bf < this["length"]; _0x20a7bf++) {var _0x385ee3 = this[_0x20a7bf];for (var _0x217721 = 0x0; _0x217721 < _0x4b082b['length']; _0x217721++) {if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) {_0x4da0dc[_0x217721] = _0x385ee3;}}}_0x12605e = _0x4da0dc["join"]("");return _0x12605e;};var _0x23a392 = arg1[_0x55f3("0x19", "Pg54")]();arg2 = _0x23a392[_0x55f3("0x1b", "z5O&")](_0x5e8b26);setTimeout("reload(arg2)", 0x2);

Python 部分代码

def unsbox(arg1):_0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b,0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a,0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]_0x4da0dc = []for i in _0x4b082b:_0x4da0dc.append(arg1[i - 1])_0x12605e = "".join(_0x4da0dc)return _0x12605edef hexxor(s1, _0x4e08d8):_0x5a5d3b = ""for i in range(len(s1)):if i % 2 != 0:continue_0x401af1 = int(s1[i: i + 2], 16)_0x105f59 = int(_0x4e08d8[i: i + 2], 16)_0x189e2c_10 = (_0x401af1 ^ _0x105f59)_0x189e2c = hex(_0x189e2c_10)[2:]if len(_0x189e2c) == 1:_0x189e2c = '0' + _0x189e2c_0x5a5d3b += _0x189e2creturn _0x5a5d3b

完整代码

关注微信公众号【趣码周】回复 zgzf 获取完整代码

关注公众快速了解最新文章。

[JS逆向案例]诸葛找房Cookie之acw_sc__v2分析相关推荐

  1. JS逆向案例文章推荐

    1.JS逆向语法学习分享 2.JS逆向案例 阿J的CSDN 成功你要成仁啊的CSDN mkdir700的CSDN 渔滒的CSDN 咸鱼学python 白白嫩嫩的简书 考古学家的CSDN 太阳花田向日葵 ...

  2. Python爬虫之Js逆向案例(2)-某乎搜索

    Python爬虫之Js逆向案例(2)-知乎搜索 声明:某乎加密逆向分析仅用于研究和学习 大家好,今天继续分享关于某乎关键词搜索接口为案例的Js逆向实战.如果你是一名新手,而且还没有来得及看上一篇< ...

  3. Python爬虫之Js逆向案例(6)-某道翻译

    Python爬虫之Js逆向案例(6)-有道翻译 声明:某道翻译加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,距离上次分享js逆向案例已经有一个月了,在这期间每次在快要揭秘出来时.整理文章 ...

  4. Python爬虫之Js逆向案例(8)-某乎x-zst-81之webpack

    声明:某乎加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,相信各位童鞋通过上期<Python爬虫之Js逆向案例(7)-知hu最新x-zse-96之rpc方案>这篇文章了解了什么 ...

  5. js逆向案例-猿人学比赛题(中等及以下难度的)

    目录 1.注意 1.js混淆-源码乱码尝试hook window属性 2.js混淆-动态cookie 3.请求头顺序与请求规律检测 4.css样式style偏移干扰 5.js混淆-用hook定位与埋坑 ...

  6. js逆向案例-rus5逻辑学习

    目录 一.rs5特点 二.cookie正式逻辑分析 三.后缀生成分析 一.rs5特点 关于4代的介绍可以看这篇文章,有些流程和4代是差不多的本文章就省略介绍了 服务器响应状态码202或者412返回第一 ...

  7. 【JS 逆向百例】房天下登录接口参数逆向

    文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 fang_encrypt.js fang_login.py 声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产 ...

  8. js逆向案例-某数美

    目录 一.案例分析 二.fveify校验分析-滑块/点选 1.滑块 2.点选 三.动态的js参数名以及密钥获得方式 四.DES/滑块缺口/轨迹xyt代码 一.案例分析 点击查看案例网址 如图regis ...

  9. JS逆向案例2:咪咕视频——学会模块改写

    案例网址:https://www.migu.cn/video.html 我们省略js逆向时定位的过程,直接看RSA加密部分的代码: define("lib/rsa/rsa", [] ...

最新文章

  1. shell脚本 8种字符串截取的方法
  2. Access 数据库连接字符串 (有密码)
  3. 数据结构第八篇——链栈
  4. 151. Leetcode 剑指 Offer 14- I. 剪绳子 (贪心算法-基础题目)
  5. 北京加强数据中心节能审查,2030年100%利用可再生能源
  6. 自己动手调试Android源码(超简单)
  7. Android中menu详解(转)
  8. TVP5150真正的驱动起来了
  9. corssover linux运行无效,使用 CrossOver 在 Linux运行 Windows 软件(金测OK)
  10. OSPF——多区域概念及配置、ABR简介、ASBR简介、路由重分发
  11. 感恩工作平台心得体会_珍惜工作,感恩企业,从而追求更美好的人生
  12. oracle恢复drop建的表首次,Oracle中Drop,Delete,Truancate表恢复
  13. mybatis的trim标签
  14. c语言char aa 1000,char ** 与char * a[ ] 区别
  15. 启用zhparser插件时一直报Permission denied
  16. 付呗聚合支付快速教程 基础篇②——FubeiUtils付呗工具类(封装参数和签名规则)
  17. Python:Flask简单实现统计网站访问量
  18. 【python】pycharts画关联图
  19. 《动手深度学习》4.5 权重衰减Weight Decay
  20. 如何用列表解析式生成 2个小数位 的 python 列表

热门文章

  1. JUC多线程及高并发
  2. js自定义随机密码生成器
  3. 操作系统和网络(七):linux硬件基础知识
  4. 用友U8视频教程全集(采购管理)-金速鹏-专题视频课程
  5. http://www.skycn.com/soft/20700.html#download
  6. linux的下载利器——aira2 可以下载磁力链接
  7. 常微分实验(1.1) 变量分离方程与变量变换
  8. 漫谈国际EPC项目的设备监造、工厂检验与采购合同质量管控
  9. AG9321电路设计原理图|USB-C转HDMI双口正反插带PD3.0充电电路设计资料
  10. icon图标素材网址