js逆向——破解百度翻译

2023-11-05

针对进行了ajax加载的网页,有两种方法去爬取它当中的内容:

1.使用selenium进行模拟浏览器进行选择元素,然后进行爬取,这种方法最简单,但是牺牲了速度,爬虫关键就在速度,因此针对大量的数据的话,就远远不能满足了
2.使用js逆向破解,这个方法的要求高,需要你懂得chrome的调试工具和JavaScricp的语法,至少得看东js代码,但是这个方法对于爬去大量数据速度回比第一种方法快的很多

今天我就来讲讲我使用第二种方法的js逆向的思想破解百度翻译,我经过了以下步骤从而达到了目的:

1.首先f12打开开发者工具,进入到network中的xhr中,然后在翻译框中输入要翻译的内容,点击翻译,找到post请求的包v2transapi

在这里插入图片描述

2.找到post的表单

在这里插入图片描述

3.然后按照前两个步骤再翻译一个其他的词语,同样找到它的post表单

在这里插入图片描述

4.对比可以发现Post的参数只有query,sign发生了变化,query就是我们需要查的词语,因此我们经过分析可以最终知道我们只需要找到sign是如何加密的,然后反向解密就能把我们需要的内容爬取到了

5.打开

在这里插入图片描述

选择

在这里插入图片描述

查找我们需要的sign

在这里插入图片描述

结果找到了存在sign的js文件,然后在每个文件中查找有sign加密方法的内容

在这里插入图片描述

6.设置断点然后在网页中翻译一个词语

在这里插入图片描述

点击红色区域进入到加密的函数中

在这里插入图片描述

7.经过以上步骤我们已经分析得到了我们现在就需要使用js代码对m(a)这个函数进行输出,扣出js代码

function e(r) {
        var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
        if (null === o) {
            var t = r.length;
            t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
        } else {
            for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
                "" !== e[C] && f.push.apply(f, a(e[C].split(""))),
                C !== h - 1 && f.push(o[C]);
            var g = f.length;
            g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
        }
        var u = void 0
          , l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
        u = null !== i ? i : (i = window[l] || "") || "";
        for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
            var A = r.charCodeAt(v);
            128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
            S[c++] = A >> 18 | 240,
            S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
            S[c++] = A >> 6 & 63 | 128),
            S[c++] = 63 & A | 128)
        }
        for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
            p += S[b],
            p = n(p, F);
        return p = n(p, D),
        p ^= s,
        0 > p && (p = (2147483647 & p) + 2147483648),
        p %= 1e6,
        p.toString() + "." + (p ^ m)
    }

8.使用python自带的pyexecjs库进行对js代码的运行,然后会发现两个错误,一个是i没有定义,一个是n函数没有定义,因此我们按照同样的方法找到i的值和n函数,最后得到的js代码是这样的:

var i="320305.131321201"
function n(r, o) {
        for (var t = 0; t < o.length - 2; t += 3) {
            var a = o.charAt(t + 2);
            a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
            a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
            r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
        }
        return r
    }
function e(r) {
        var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
        if (null === o) {
            var t = r.length;
            t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
        } else {
            for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
                "" !== e[C] && f.push.apply(f, a(e[C].split(""))),
                C !== h - 1 && f.push(o[C]);
            var g = f.length;
            g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
        }
        var u = void 0
          , l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
        u = null !== i ? i : (i = window[l] || "") || "";
        for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
            var A = r.charCodeAt(v);
            128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
            S[c++] = A >> 18 | 240,
            S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
            S[c++] = A >> 6 & 63 | 128),
            S[c++] = 63 & A | 128)
        }
        for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
            p += S[b],
            p = n(p, F);
        return p = n(p, D),
        p ^= s,
        0 > p && (p = (2147483647 & p) + 2147483648),
        p %= 1e6,
        p.toString() + "." + (p ^ m)
    }

9.然后使用python运行这段js代码会得到要得到的sign值

import execjs
query = 'hello' #是要翻译的内容
with open('baidu_translate_js.js', 'r', encoding='utf-8') as f:
    ctx = execjs.compile(f.read())
sign = ctx.call('e', query)
print(sign)

结果

在这里插入图片描述
10.得到了sign值,基本上已经把这个js搞定了,然后就是编写代码进行抓取所翻译的内容了,代码如下:

import execjs
import requests
headers={'accept': '*/*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'content-length': '106', 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'cookie': 'BIDUPSID=EF5D2DCB95CD02713C504B965E680572; PSTM=1508391259; BAIDUID=FE94A1C6870007735C0EA30CA092352A:FG=1; BDUSS=HhpVTc3VjZrQ2ppRX5RcVFoQW9-WExTQ29zYWR-TUluOUQxRGVaWHZrWGlOWmRkRVFBQUFBJCQAAAAAAAAAAAEAAAAUxiG2ZnJlZc31vNG~pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOKob13iqG9dW; locale=zh; __guid=37525047.783289347368707300.1568961749022.282; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D; from_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; yjs_js_security_passport=67080cbdf7d8d4ad0eb8f1513b5feb52c128c29b_1569324592_js; monitor_count=3; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1568961749,1569324577,1569324592,1569324674; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1569324674; __yjsv5_shitong=1.0_7_9055159b9a5e975fcd2c2c48931b3bc7b406_300_1569324677995_117.32.216.70_70981334', 'origin': 'https://fanyi.baidu.com', 'referer': 'https://fanyi.baidu.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'x-requested-with': 'XMLHttpRequest'}
def signs(n):
    query = n
    with open('baidu_translate_js.js', 'r', encoding='utf-8') as f:
        ctx = execjs.compile(f.read())
    sign = ctx.call('e', query)
    return sign
def datas(sign,n,zh,en):
    data={
    'from':zh,
    'to': en,
    'query': n,
    'simple_means_flag':' 3',
    'sign': sign,
    'token':'8d588b57816e1213f2bcfaf52bddbbe2',
    }
    return data
def xinxi(url,data):
    r=requests .post(url=url,headers=headers,data=data).json()
    return r
if __name__=='__main__':
    url='https://fanyi.baidu.com/v2transapi'
    print("请输入需要的要求(1或者2):")
    print("1.英译中      2.中译英")
    q=input()
    if q=='2':
        print("输入翻译内容:")
        n=input()
        zh='zh'
        en='en'
        sign=signs(n)
        data=datas(sign,n,zh,en)
        r=xinxi(url,data)
        print("翻译结果:"+'\n'+r['trans_result']['data'][0]['dst'])
    else:
        print("输入翻译内容:")
        n = input()
        zh='en'
        en='zh'
        sign = signs(n)
        data = datas(sign, n,zh,en)
        r = xinxi(url, data)
        print("翻译结果:" + '\n' + r['trans_result']['data'][0]['dst'])

11.运行效果展示

在这里插入图片描述

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

js逆向——破解百度翻译 的相关文章

  • linux 如何支持2T以上的硬盘

    一 MBR 和 GPT 区别 1 1 MBR MBR分区表 即主引导记录 大家都很熟悉 是过去我们使用windows时常用的 所支持的最大卷 2T 而且对分区有限制 最多4个主分区或3个主分区加一个扩展分区 1 2 GPT GPT 即GUI
  • 数据结构之顺序串的基本操作——C语言

    include
  • STM32 ADC没有输入电压时,采集结果不为0

    目录 1 问题概述 2 问题分析 2 1 钳位二极管 2 2 反向漏电流 3 复用功能 4 总结 1 问题概述 硬件焊接完成后测试程序ADC采集功能 先通过接入3 3V来看下 结果发现三个通道可以采集到0V 3 3V 而另外三个通道在没有接
  • Gitee仓库 项目、本地项目、本地仓库的创建与关联

    Gitee仓库 项目 本地项目 本地仓库的创建与关联 1 登录Gitee仓库 没有可自行注册 2 创建git项目 填写信息 点击创建之后将会生成git项目路径 可先行复制 3 操作idea 创建本地仓库 我默认使用当前项目为仓库路径 点击O
  • 微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力

    作者 草谷 前言 微服务引擎 MSE 全新发布 新版本带来了一系列令人振奋的特性和改进 让您更轻松 高效地构建和管理微服务应用程序 从快速入门到迁移优化 MSE 为开发人员提供了全方位的支持和解决方案 无论您是刚刚接触微服务还是已经深耕其中
  • 解决OpenSSL SSL_read: Connection was reset, errno 10054问题

    1 复现问题 drawio是免费的画图神器 因而 今天尝试从github上下载drawio 如下图所示 复制下载地址到git bash中 却报出如下错误 即fatal unable to access https github com jg
  • axios+vue 网页请求

    div div
  • 【肥海豹】-网络安全等级保护(等保)-2020体系会-物联网学习笔记

    讲解专家 信息产业信息安全测评中心 张益老师 一 物联网安全概述 物联网 将感知节点设备通过互联网等网络连接起来构成的系统 物联网三个逻辑层 感知层 扩展指标来源于感知层特性 网络传输层和处理应用层 物联网定级要三层结合起来一起进行定级 感
  • C++错误之路:conversion from ...const_iterator ... to non-scalar type ... requested

    目录Contents 出错代码 bug原因分析 修改方法1 修改方法2 版权声明 出错代码 include
  • 基于dataX的数据同步平台搭建

    前言 基于Java和DataX工具实现数据同步的后台管理 包括数据同步任务的生成 任务的管理 查看任务的执行日志 解析任务的执行结果等功能 内含一些技术实现方案 心得体会和填坑经验等干货 阅读本文之前 需要提前了解一下DataX的含义 使用
  • 【华为OD统一考试A卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • M.2 SSD将走向数据中心,现有服务器将无法搭配

    51CTO com原创稿件 据国外媒体报道 英特尔针对数据中心的存储应用 计划推出新的M 2接口的全新闪存 名称为P3100 MVMe 据了解 新推出的产品容量有128GB 256GB 512GB和1TB四种 英特尔表示 P3100系列SS
  • git 提交检查空格

    正则表达式匹配 vim 查找 和 行首空格 s 行尾空格 s 替换 s 进入vim命令模式 usage B 全局 替换 A s A B g s s g s s g 在vim命令行下 查看 set list tab键就会显示为 I 显示在行尾
  • 学习TensorFlow,打印输出tensor的值

    在学习TensorFlow的过程中 我们需要知道某个tensor的值是什么 这个很重要 尤其是在debug的时候 也许你会说 这个很容易啊 直接print就可以了 其实不然 print只能打印输出shape的信息 而要打印输出tensor的
  • el-table自定义不生效

    想手写非常麻烦 按照官方给的方法 row那一行 还必须放在非scoped里菜生效 而且害得加 el table success row 然后 stripe好像还会覆盖某个自定义样式 以下为转载 在后台管理系统项目中 经常会使用element
  • shallowRef和shallowReactive的使用?

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 shallowRef 二 shallowReactive 在什么时候使用 三 案例 1 shallowRef 2 shallowReactive 提示 以下是本
  • Databend 开源周报第 107 期

    Databend 是一款现代云数仓 专为弹性和高效设计 为您的大规模分析需求保驾护航 自由且开源 即刻体验云服务 https app databend cn What s On In Databend 探索 Databend 本周新进展 遇
  • IAM风险CTF挑战赛

    wiz启动了一个名为 The Big IAM Challenge 云安全CTF挑战赛 旨在让白帽子识别和利用 IAM错误配置 并从现实场景中学习 从而更好的认识和了解IAM相关的风险 比赛包括6个场景 每个场景都专注于各种AWS服务中常见的
  • java提示信息弹出框

    java提示信息弹出框 一 效果展示 A 带 图标 B 带 图标 C 带 图标 D 无图标 E 带 图标 二 java代码 java提示信息弹出框 public static void main String args A 带 图标
  • chatgpt赋能python:在Python中如何打印空格?

    在Python中如何打印空格 如果你是一个Python编程初学者 你可能会想知道如何在Python中打印出空白字符 空格字符是一个非常基本的概念 它是一种用于在字符串中分隔字符和单词的非打印字符 但是 如果你不知道如何在Python中打印空

随机推荐

  • 韩式多用动态图(浪漫情侣)

  • Java集合例题

    输入五位学生的成绩 从小到大排序 求出最高分 最低分 平均分 总分 使用集合 package Example import java util ArrayList import java util Collections import ja
  • 【wazuh】wazuh学习笔记

    1 主动响应 主动响应 执行各种对策来解决威胁 下面是一些执行对策的脚本 var ossec active response bin目录下 1 1 执行策略 1 1 1 禁用用户disable account disable account
  • Log日志级别在SpringBoot中的配置

    在使用Spring Boot进行项目开发的过程中 为了对日志进行更友好的处理 所以需要默认的日志进行自定义的配置工作 关于日志的打印情况 还是先了解一下日志的级别吧 在网上索罗了一下 介绍多种多样 在这儿进行了整理了一下 总的来说日志的打印
  • Shell脚本学习——基本语法阶段一

    Shell脚本学习 基本语法阶段一 一 输入read 1 demo1 2 demo2 二 在 bash 和 sh 中不换行的区别 三 基本运算方法 和C语言基本差不多 四 test语句 1 测试操作符如 2 测试字符串 3 测试整数 五 与
  • 院士、专家倾囊相授!26个免费5G课程发布,点击就可观看!

    冲哇 没有任何力量能阻挡我们学习的脚步 CIC科教网重磅推出的5G科普行免费课程来了 本篇文章 先让我们从CIC科教网说起 中国通信学会科普教育培训平台 即CIC科教网 是中国通信学会致力打造的信息通信领域科普教育服务平台 旨在忠实履行学会
  • opencv人脸识别

    XML文件 opencv自带xml文件位置 Python根目录 Lib site packages cv2 data 各xml文件解释 人脸检测器 默认 haarcascade frontalface default xml Stump b
  • 提升用户体验:Vue与compressor.js实现高效文件压缩

    前言 上传文件是一个常见的需求 并且文件大小往往成为限制因素之一 为了提升用户体验和节省带宽消耗 上传时的文件压缩便显得格外重要 本文将介绍基于 Vue 框架和 compressor js 的上传时文件压缩实现方法 通过在上传过程中对文件进
  • Apollo代码学习(六)—模型预测控制(MPC)

    Apollo代码学习 模型预测控制 前言 模型预测控制 预测模型 线性化 单车模型 滚动优化 反馈矫正 总结 前言 非专业选手 此篇博文内容基于书本和网络资源整理 可能理解的较为狭隘 起点较低 就事论事 如发现有纰漏 请指正 非常感谢 查看
  • 前端路上的旅行

    http www w3cplus com front end trip on road html 什么是前端 什么是前端 大部分指的是Web前端开发 这个词是从网页制作演变过来的 名称上有着很明显的时代特征 在互联网的演化过程中 网页制作是
  • 着色器glsl

    着色器使用glsl的类C语言写成的 着色器开头声明版本 接着是输入和输出变量 uniform和main函数 每个着色器入口点是main函数 在该函数中处理输入变量 将结果存放到输出变量中 着色器结构如下 version version nu
  • 走进开源:认识开源许可

    想要查看前面的笔记请翻阅我的CSDN博客 作者码字不易 喜欢的话点赞 加个关注吧 后期还有很多干货等着你 最近一直在研究开源项目 发现对开源项目的开源许可有一些模糊 现在记录下来算是一个巩固 1 走进开源 开源 一词对应英文 Open So
  • Unity project 发布成Standalone EXE版本后,它的Debug infomation在什么位置

    一 Unity工程发布成Standalone Exe后 它的Debug 信息保存位置如下 二 示例 三 log文件
  • Openwrt开发笔记(3)—— 修改路由的网关地址和无线SSID 密码

    修改网关地址 一般来说默认的网关地址是192 168 1 1 如果我们想要定制自己的网关地址的话 可以选择在刷机后使用web配置页进行修改 或者通过指令进行修改 对于项目开发者而言 在源码中修改更加符合要求 轩面介绍指令修改和源码修改的2中
  • MQTT协议-使用CONNECT报文连接阿里云

    使用网络调试助手发送CONNECT报文连接阿里云 参考 https blog csdn net daniaoxp article details 103039296 在前面文章介绍了如何组装CONNECT报文 以及如何计算剩余长度 CONN
  • anaconda换源和pip换源

    在开发中我们经常会用到第三方的包 但是由于墙的限制导致了下载国外的包 普遍偏慢 这里我们可以修改为国内的镜像源 下载速度自然就会快起来 一 pip换源 国内的镜像源有很多 但是好用的就是阿里和清华的 这里我们选择清华的镜像源 别问为什么 问
  • 全网最强,Python接口自动化测试实战-接口参数关联(购物实例)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • element ui的upload 手动上传头像(复制就能用)

    之前在网上看了好多 结果给的代码都不全 整了快一天 才整好 心态都崩了 想砸电脑 这里贴出来愿后来人省力 下面的代码除了最下面的axios请求需要和自己的匹配之外 其他的可以直接复制使用了 服务器接口处理函数 这里只是处理函数 其余的部分没
  • 2020软件测试最新视频教程大合集汇总

    软件测试入门教程分享给你 软件测试工程师需要适当掌握一些技能 如操作系统 WIN UNIX这个你可以有针对性的去找着学数据库 常见的有SQLSERVER ORACLE 熟悉常用的编程语言 C C JAVA测试工具 这个就比较多一些 建议循序
  • js逆向——破解百度翻译

    针对进行了ajax加载的网页 有两种方法去爬取它当中的内容 1 使用selenium进行模拟浏览器进行选择元素 然后进行爬取 这种方法最简单 但是牺牲了速度 爬虫关键就在速度 因此针对大量的数据的话 就远远不能满足了 2 使用js逆向破解