• Google参数解密(11-11)


    Google翻译参数解密(11-11)

    一.请求过程

    文件地址:https://translate.google.com.hk/translate/releases/twsfe_w_20201102_RC00/r/js/translate_m_zh-CN.js:formatted 22573
    在这里插入图片描述

    其中uv函数调用aF函数,结果生成请求链接

    变量说明:

    1. aF 为函数

      aF = function(a, b, c, d, e, f) {
          c = c.toString();
          c += $E(d);
          d = d.toString();
          var g = "POST";
          b += "?" + c;
          2E3 > b.length + d.length && (g = "GET",
          b += "&" + d,
          d = "");
          ++a.j;
          return Tj(b, function(h) {
              --a.j;
              e(h)
          }, g, d, void 0, f)
      }
      
    2. 变量参数

      2.1 a为对象

    在这里插入图片描述

    2.2 b为需要翻译语言标识

    "auto" // 自动识别
    

    2.3 c为翻译目标语言标识

    "zh-CN" // 中文
    

    2.4 d变量与c变量相同

    2.5 e需要翻译的内容

    ซิลิโคนสีเงา
    

    2.6 p为变量数组

    ["at", "bd", "ex", "ld", "md", "qca", "rw", "rm", "sos", "ss", "t"]
    

    2.7 fm为函数

    2.8 h为未定义

    2.9 l为变量数组

    https://i.loli.net/2020/11/11/dmVKDClPOiv9Jgx.png

    2.10 void 0为未定义

    通过代码调试发现aF(a, r, u, B, t(a.m, a, g, p), void 0)返回的内容就是整个请求参数,并且此过程就是tk值生成

    二.过程解析

    1.aF函数处理机制

    /*
    	a:Object  webapp 表明平台
    	b: String  /translate_a/single
    	c:Object   0: "client"  其他请求参数
                    1: "sl"
                    2: "tl"
                    3: "hl"
                    4: "dt"
                    5: "otf"
                    6: "ssel"
                    7: "tsel"
                    8: "kc"
                    
         d:Object 存储查询内容
         e:function
         f:undefined
    
    */
    
    aF = function(a, b, c, d, e, f) {
        // 将请求参数组成请求链接
        // client=webapp&sl=auto&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=sos&dt=ss&dt=t&otf=1&ssel=0&tsel=0&kc=1
        c = c.toString();
        
        // d 查询内容
        c += $E(d);
        d = d.toString();
        var g = "POST";
        b += "?" + c;
        2E3 > b.length + d.length && (g = "GET",
        b += "&" + d,
        d = "");
        ++a.j;
        return Tj(b, function(h) {
            --a.j;
            e(h)
        }, g, d, void 0, f)
    }
    

    2.$E函数处理机制

    将查询内容进行wu调用

    $E = function(a) {
        a = a.Kb("q").join("");
        return wu(a)
    }
    

    3.Kb函数处理机制

    使用a.Kb("q")将查询内容生成查询内容的数组,并使用join函数将查询内容组合赋值a

    4.wu函数处理机制

    // a 为查询内容 'Hello'
    
    vu = null;
    wu = function(a) {
        // 条件为true
        if (null !== vu)
            var b = vu; // 执行这步
        else {
            b = tu(String.fromCharCode(84));
            var c = tu(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (vu = window[b.join(c())] || "") || ""
        }
        
        // 注意函数执行完到这里,会产生 b = 445860.98157186
        // 这是 b 的值是打开翻译网站生成的。详细内容看下面图片
        
        // String.fromCharCode(116) 获取ASCII码 116对应的字符
        
        // 函数 tu 返回一个函数,如果执行返回函数。就会返回第一次传入的内容
        var d = tu(String.fromCharCode(116)); // t
        c = tu(String.fromCharCode(107));  // k 
        d = [d(), d()]; // [t,t]
        d[1] = c(); // [t,k]
        
        // c = "&tk="
        c = "&" + d.join("") + "=";
        
        // b = 445860.98157186 进行切,并生成数组[整数部分字符串,小数部分字符串]
        d = b.split(".");
        
        // 获取整数部分内容,并将内容强制转化成 int
        b = Number(d[0]) || 0;
        
        // 处理查询内容,并生成 e
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var h = a.charCodeAt(g);
            128 > h ? e[f++] = h : (2048 > h ? e[f++] = h >> 6 | 192 : (55296 == (h & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (h = 65536 + ((h & 1023) << 10) + (a.charCodeAt(++g) & 1023),
            e[f++] = h >> 18 | 240,
            e[f++] = h >> 12 & 63 | 128) : e[f++] = h >> 12 | 224,
            e[f++] = h >> 6 & 63 | 128),
            e[f++] = h & 63 | 128)
        }
        a = b;
        
        // 将上一步的e在进行处理生成a
        for (f = 0; f < e.length; f++)
            a += e[f],
            a = uu(a, "+-a^+6");
        a = uu(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        
        // 生成加密结果 &tk=618649.1031485
        return c + (a.toString() + "." + (a ^ b))
    }
    

    5.tu函数处理机制

    var tu = function(a) {
        return function() {
            return a
        }
    }
    

    6.uu函数处理机制

    将参数进行处理,并返回a

    uu = function(a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2);
            d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d);
            d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    }
    

    在这里插入图片描述

    具体步骤如下:

    1. 将请求参数请求函数aF
    2. 函数aF将调用函数$E,并将查询对象传入当作参数
    3. 取出查询内容的值,并将其作为参数传入wu
    4. 函数进行一系列的操作生成加密内容
    5. 将函数加密内容与函数aF中的变量c组成完整的请求链接,完成请求

    三.加密代码实现

    1.python代码

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # Author LQ6H
    
    
    import execjs.runtime_names
    
    def Init_JS():
        
        with open('google.js','r',encoding='utf-8') as f:
            
            js = execjs.compile(f.read())
            
            return js
    
    
    def wu(keyword):
        c = '/translate_a/single?client=webapp&sl=auto&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=sos&dt=ss&dt=t&otf=1&pc=1&ssel=0&tsel=0&kc=2'
        
        js = Init_JS()
    
        # 打开翻译网页内容,第一步获取内容
        ttk = '445860.98157186'
    
        # 将 tk内容与c 拼接生成请求url
        tk = js.call('params',keyword,ttk)
    
        print(tk)
        print(c + tk)
    
    wu('ซิลิโคนสีเงา')
    

    2.js代码

    function uu (a,b) {
    
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2);
            d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d);
            d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    
    }
    
    function params(a,ttk) {
    
        var c = "&tk=";
        
        var d = ttk.split(".");
    
        var b = Number(d[0]) || 0;
    
    
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var h = a.charCodeAt(g);
            128 > h ? e[f++] = h : (2048 > h ? e[f++] = h >> 6 | 192 : (55296 == (h & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (h = 65536 + ((h & 1023) << 10) + (a.charCodeAt(++g) & 1023),
            e[f++] = h >> 18 | 240,
            e[f++] = h >> 12 & 63 | 128) : e[f++] = h >> 12 | 224,
            e[f++] = h >> 6 & 63 | 128),
            e[f++] = h & 63 | 128)
        }
    
        a = b;
    
        for (f = 0; f < e.length; f++)
            a += e[f],
            a = uu(a, "+-a^+6");
        a = uu(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return c + (a.toString() + "." + (a ^ b))
        
    }
    

    3.请求结果

    在这里插入图片描述

  • 相关阅读:
    添加discuz积分规则
    顺序栈 (栈操作)
    数据结构--链栈操作
    数据结构--循环队列
    素数对猜想
    export和export default的区别
    vue-day15----渲染时因异步易报错的点、分类页面数据渲染、CategoryContainer.vue进入Classify.vue-动态路由、tab切换动画-vant
    问题
    css语句解释
    vue-day14----mock数据(模拟数据)、details路由下详情(Detail)和评价(Assess)页面切换到商品(Goods)页面-localStorage、Assess组件(AssessList)数据渲染-父传子、评价和晒图页面切换-toggle传不同的参数重新请求、上拉加载更多-better-scroll
  • 原文地址:https://www.cnblogs.com/LQ6H/p/13961172.html
Copyright © 2020-2023  润新知