美文网首页
JS解密:断点调试分析 JS 代码破解有道词典加密参数

JS解密:断点调试分析 JS 代码破解有道词典加密参数

作者: dex0423 | 来源:发表于2020-06-24 11:59 被阅读0次

1. 前言

  • 本篇文章,旨在破解有道翻译 http://fanyi.youdao.com/ 部分请求参数的 JS 加密方法,从而构造请求访问站点;

2. 分析

  • 输入字符 “苹果”,得到翻译的结果;
  • 右键查看网页源码,ctrl + F 弹出搜索框,在网页源码中搜索 苹果,发现网页源码中并没有 苹果
  • 搜索 apple 同样也不能找到;
  • 这说明 苹果apple 这些输入输出的字符串,并不是在网页上的静态内容,而是动态加载的;
image.png

3. 抓包

  • 右键检查网页,点击 Network,调出网页抓包工具;
  • 在网页上重新点击 翻译 按钮,在抓到的数据包中找到含有输出信息的包;
image.png
  • 在网页输入框重新输入 西瓜 并再次抓包,分析数据包的参数,发现参数有如下规律:
    -- i ------------------------------------------------------------------------ 输入的字符串,例如:西瓜、苹果;
    -- from: AUTO---------------------------------------------------------- 不变参数;
    -- to: AUTO------------------------------------------------------------- 不变参数;
    -- smartresult: dict --------------------------------------------------- 不变参数;
    -- client: fanyideskweb --------------------------------------------- 不变参数;
    -- salt: 15929685900475 ------------------------------------------ 未知参数
    -- sign: e8aeb3b7429d2198356378746cf291d1 ------------ 未知参数
    -- ts: 1592968590047 ---------------------------------------------- 未知参数
    -- bv: 02a6ad4308a3443b3732d855273259bf -------------- 未知参数,多次抓包发现此参数值固定,换浏览器后变化;
    -- doctype: json ------------------------------------------------------ 不变参数;
    -- version: 2.1 -------------------------------------------------------- 不变参数;
    -- keyfrom: fanyi.web ---------------------------------------------- 不变参数;
    -- action: FY_BY_CLICKBUTTION ---------------------------- 不变参数;
image.png

4. 搜索参数,寻找代码

  • ctrl + shift + F 打开全局搜索,输入 sign 搜索,按下图所示步骤寻找代码;
image.png
  • 说明:
    -- 在 4、5 两步搜索的过程中,需要结合上下文仔细分析代码内容;
    -- 很多情况下,目标代码是以 代码块 的形式,集中在一起 出现的;
    -- 一个文件中会有多处代码有相同关键字,对于这类相同的关键字,可以多次搜索不同的关键字,对比分析不同的代码块中,关键字的区别,推测可能性最大的代码块;

5. 下断调试

  • 在目标代码位置下断点;
  • 在网页重新点击 翻译 按钮;
    -- 注意:此处动作不可以用 刷新 替代,很多时候 刷新 并不能完成请求的再次发送;
  • 参考下图,在断点分析代码,
image.png
  • 通过分析,得到下面的结果:
    -- i,即代码中的 e,表示输入的字符串;
    -- bv,即代码中的 t,是对浏览器版本字符串(注意:需要剔除 Mozilla/ 字符串!!!)的 md5 处理;
    -- ts,即代码中的 r,是 13 位时间戳;
    -- salt,即代码中的 i,是 r 值尾部加上一个 0~9 随机整数;
    -- sign,是对 "fanyideskweb" + e + i + "mmbP%A-r6U3Nw(n]BjuEU" 字符串的 md5 处理;

6. 代码实现

import requests
import hashlib
import time
import random


def youdao(keyword):
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Content-Length": "251",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": "OUTFOX_SEARCH_USER_ID=794950846@10.169.0.82; JSESSIONID=aaatjBaH10pyw8bRkOHlx; OUTFOX_SEARCH_USER_ID_NCOO=947970453.2625253; ___rl__test__cookies=1592932488300",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }

    bv = hashlib.md5('5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode("utf-8")).hexdigest()
    print(bv)
    ts = str(int(round(time.time() * 1000)))
    salt = ts + str(random.randint(0, 9))
    sign = hashlib.md5("fanyideskweb{}{}mmbP%A-r6U3Nw(n]BjuEU".format(keyword, salt).encode("utf-8")).hexdigest()

    form_data = {
        "i": keyword,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": salt,
        "sign": sign,
        "ts": ts,
        "bv": bv,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME"
    }
    print(form_data)
    response = requests.post(url=url, headers=headers, data=form_data).text

    return response


def main():
    keyword = '西瓜'
    response = youdao(keyword=keyword)
    print(response)


if __name__ == '__main__':
    main()

相关文章

网友评论

      本文标题:JS解密:断点调试分析 JS 代码破解有道词典加密参数

      本文链接:https://www.haomeiwen.com/subject/uhhlfktx.html