逆向JS分析实战某违规网站5--Python与javaScript

2023-11-12

经过前几章的努力,我们把所有变量的关系都捋清楚了。
在这里插入图片描述
现在要做的就是将它们用于 py 代码中,那摆在面前的大致有两种方式:
1、把 js 代码转换成 py 脚本可以阅读的代码;
2、直接使用现有 JS 代码。

第一种方法,需要有一定代码转换能力,且还需要解决一个问题 “ Malformed UTF-8 data ”。一开始我也是选择第一种方法,还原代码后,发现传参的时候会报“ Malformed UTF-8 data ”,经过一顿网络搜索,发现这方面的资料很少,虽然最后解决了,但是得到的结果不正确。所以后来果断选择了第二种方案。

但是第二种方案也是不建议从 py脚本往 JS脚本直接传参,印象中也是会报 “ Malformed UTF-8 data ” 。所以参数方面,我采用了传统的文本传参方式,简单的来说就是把 py脚本要传给 js 的参数写入到特定文本中,然后 js 运行时再自行读取这个文本里的参数。

javaScript 代码直接附上

function AesDecrypt() {
    var fs = require('fs');
    var player_data = '';
    player_data = fs.readFileSync("E:\\untitled\\data.txt").toString();
    var CryptoJS = require("crypto-js");
    var player_data_Decode_Array = new Array();
    var m3u8_Url = '';
    var aa= encodeURI(player_data).replace(/%/gm, '\x5cx');
    var bb = '\x27' + aa + '\x27';
    player_data = eval(bb);
    player_data = player_data.replace(/%2b/g, '+');
    for (i=0;i<10;i++)      //   把player_data 中 的 ‘\\’彻底删除
        player_data = player_data.replace('\\', '');
    var key = CryptoJS.enc.Latin1.parse('9q4h7kt7skwsc9af1qmwy14jkfq2biab');
    var iv = CryptoJS.enc.Latin1.parse("6b3gslw69k6eazmw");
    var decodeData = CryptoJS.AES.decrypt(player_data, key, {
        'iv': iv,
        'mode': CryptoJS.mode.CBC,
        'padding': CryptoJS.pad.ZeroPadding
    });
    decodeData = decodeData.toString(CryptoJS.enc.Utf8);
    player_data_Decode_Array = decodeURIComponent(decodeData).split(',');
    m3u8_Url = 'https://usersfiles.whatfugui.com:XXXXXX/f' + '/' + player_data_Decode_Array[0x0] + '/' + player_data_Decode_Array[0x1] + '/' + player_data_Decode_Array[0x2] + "/play.m3u8?_KS=" + player_data_Decode_Array[0x3] + "&_KE=" + player_data_Decode_Array[0x4];
    m3u8_Url = m3u8_Url.replace('\r\r\r\r\r\r\r\r\r\r\r\r\r','');
    return m3u8_Url
}

而py脚本是如何调用JS脚本且如何获取JS脚本运行后返回的结果呢?
见下面 py 脚本代码:

def DencodeData(player_data):
    with open('E:\\untitled\\data.txt', "w") as file:  # 这种是以字节流进行写入文件
            file.write(player_data)
            file.flush()
    file.close()
    with open('AES_CBC_JavaScript.js', 'r', encoding='UTF-8') as f:
        AES_CBC_JavaScript = f.read()
    context = execjs.compile(AES_CBC_JavaScript)
    m3u8_Url = context.call("AesDecrypt")
    return m3u8_Url

注意:这里有个坑 with open(‘AES_CBC_JavaScript.js’, ‘r’, encoding=‘UTF-8’) 里的 ‘AES_CBC_JavaScript.js’ 应改为完整的路径,因为直接写 ‘AES_CBC_JavaScript.js’ ,py脚本会偶尔出现找不到 AES_CBC_JavaScript.js 文件的情况。

就这样, py 脚本与 js 脚本之间的桥梁就搭建好了。

总结:
强者改变环境,弱者要善于寻找方法适应环境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逆向JS分析实战某违规网站5--Python与javaScript 的相关文章

随机推荐

  • WPF之层级数据模板HierarchicalDataTemplate的使用

    WPF之层级数据模板HierarchicalDataTemplate的使用 1 HierarchicalDataTemplate List 2 HierarchicalDataTemplate XML 3 TreeView Hierarch
  • 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

    从本篇博客正式开始深度学习项目的记录 实例代码只会放通用的代码 数据集和训练数据也是不会全部放出 系列文章 基于Yolov5目标检测的物体分类识别及定位 一 数据集原图获取与标注 基于Yolov5目标检测的物体分类识别及定位 二 yolov
  • 一道简单的PV操作题

    这是川大操作系统的一道期末考试题 There is an cage and only one animal can be put into this cage The hunters can put tiger into the cage
  • Android自定义View的数独游戏

    Android自定义View的数独游戏 先说一下数独游戏的规则 在整个横坐标和纵坐标的9个格子上只能填土1 9的数字且不重复 在当前3 3 的格子上填入1 9数字且不重复 先给大家看效果图 项目思路 1 UI呈现 这个放在 GameView
  • exit函数及与return的区别

    通常情况 exit 0 表示程序正常 exit 1 exit 1 表示程序异常退出 exit 2 表示表示系统找不到指定的文件 用Error lookup可以查看 exit 结束当前进程 当前程序 在整个程序中 只要调用exit就结束 当前
  • [深度学习]Part1 Python高级Ch25 cnocr——【DeepBlue学习笔记】

    本文仅供学习使用 ocr入门包 具体的文字识别需了解其他内容 Python高级 Ch25 cnocr 25 cnocr 25 1 几个 简单 的例子 25 1 1 信用卡识别 25 1 2 文字截图识别 25 2 使用逻辑 25 cnocr
  • 网页打开软件显示无法连接服务器,Safari 浏览器无法打开网页怎么办

    Safari 浏览器打不开网页 因为无法连接到服务器怎么解决 在最近 我们使用苹果手机的 Safari 浏览器时 很多小伙伴都收到了打不开网页因为无法连接到服务器的提示 那怎么解决这种情况呢 下面就和小编一起来看看吧 1 网址已注销 禁用
  • ES6---新增数据类型Symbol

    es6新标 加入了新的数据类型Symbol与新的数据结构set map 他们各有特点 Symbol let a Symbol console log typeof a symbol js语言的数据类型再添一员 Symbol Symbol f
  • 基于注册中心如何实现全链路灰度

    1 为什么需要服务发现 2 微服务注册中心 3 基于注册中心如何实现全链路灰度 4 GRPC 如何结合注册中心 GRPC服务发现与全链路灰度 为什么需要服务发现 服务拆分 配置调用 如果有很多服务怎么办 服务注册 服务发现 注册中心的架构
  • 华为OD机试2022Q4【租车骑绿岛】

    之前想复杂了 其实很简单的一题 题目 租车骑绿岛 100分 部门组织绿岛骑行团建活动 租用公共双人自行车 每辆自行车最多坐两人 做最大载重M 给出部门每个人的体重 请问最多需要租用多少双人自行车 输入描述 第一行两个数字m n 分别代表自行
  • 如何安装PHP框架

    目录 什么是PHP框架 第一步 安装PHP依赖包 第二步 导入PHP相关包 第三步 解包并切换进指定目录 第四步 在PHP目录内编译安装 第五步 编译 第六步 拷贝配置文件进行编辑 第七步 修改时区 第八步 修改文件指定路径 第九步 将命令
  • Vue自定义指令实现element-ui dialog拖拽调整位置和窗口大小

    实现element ui dialog拖拽调整位置和窗口大小 前言 自定义指令 具体应用 注意点 前言 本文主要记录给element ui dialog添加可拖拽位置及可拖拽宽高的功能的整个过程 部分代码来自网络参考 自定义指令 impor
  • 阴阳师2017 7服务器维护,阴阳师4月7日服务器维护更新内容公告

    阴阳师国服服务器在4月7日 周五 上午 6 30 9 00进行停服维护 如未能按时完成 则开服时间将会顺延 下面带来本次的更新内容介绍 重要更新 1 新增亲友系统 和好友达到一定羁绊即可解锁亲友关系 1 羁绊值可以通过组队 赠送福袋 赠送友
  • typora添加音频链接到笔记播放

    typora添加音频链接到笔记播放 OneDrive网盘永久外链地址生成工具 OneDrive直链在线生成 Gimhoy Studio
  • mysql 物理结构_mysql物理结构

    MySQL是通过文件系统对数据和索引进行存储的 MySQL从物理结构上可以分为日志文件和数据索引文件 MySQL在Linux中的数据索引文件和日志文件都在 var lib mysql目录下 日志文件采用顺序IO方式存储 数据文件采用随机IO
  • (5) Human Pose Estimation : 经典模型 :Hourglass

    Stacked Hourglass Networks for Human Pose Estimation ECCV 2016 reading time 2019 09 09 paper address https arxiv org pdf
  • element ui el-dialog子组件放到表格中title一直居中

    1 背景和问题 背景 子组件放在表格column中 子组件有个button和el dialog 问题 el dialog弹窗一直居中 center样式设置为true也不行 2 解决方式 原因 表格列默认居中显示 text align样式被e
  • Postman强化学习

    一 Postman内置的动态参数 企业当中做接口测试的时候经常会出现接口不能把参数写死 时间戳 timestamp 生成0 1000的随机数 randomInt 生成一个GUID的字符串 guid 很长的一个字符串 二 Postman之接口
  • 【人工智能】人脸识别系统【实验报告与全部代码】(QDU)

    人工智能技术 课程设计 基于ResNet dlib opencv人脸识别系统 指导老师 王伟 摘要 自建小型数据集 采用Opencv中的级联分类器进行人脸检测 基于ResNet18残差神经网络进行人脸识别 后续采用dlib库中的人脸检测器
  • 逆向JS分析实战某违规网站5--Python与javaScript

    经过前几章的努力 我们把所有变量的关系都捋清楚了 现在要做的就是将它们用于 py 代码中 那摆在面前的大致有两种方式 1 把 js 代码转换成 py 脚本可以阅读的代码 2 直接使用现有 JS 代码 第一种方法 需要有一定代码转换能力 且还