有道翻译js逆向+GUI

学完js逆向之后,

重新修改了原有的py文件,

发表记录一下  <( ̄︶ ̄)↗[GO!]

第一步,

设置GUI界面 

import requests
import execjs
import time
import random
from tkinter import Tk, Button, Label, Text, END


class App(object):
    def __init__(self):
        self.root = Tk()
        # 此处保留 u 转义
        # 相信挺多人都忘了这玩意吧
        self.root.title(u'有道翻译')
        self.win()
        self.Button_func()
        self.root.mainloop()

    def win(self):
        # 设置居中窗口
        self.screen_width = self.root.winfo_screenwidth()
        self.screen_height = self.root.winfo_screenheight()
        x = (self.screen_width - 310) / 2
        y = (self.screen_height - 400) / 2
        self.root.geometry("310x400+%d+%d" % (x, y))
        # 禁止修改窗体
        self.root.resizable(width=False,height=False)

    # 设置主要的框架
    def Button_func(self):
        # 设置翻译输入框
        self.input_text = Text(self.root, background='light blue')
        self.input_text.place(x=10, y=5, width=285, height=140)
        self.input_text.bind("<Key-Return>", self.submit)
        # 设置按钮功能
        self.submit_btn = Button(self.root, text=u'翻译', command=lambda: self.submit(self))
        self.submit_btn.place(x=205, y=155, width=35, height=25)
        self.clear_btn = Button(self.root, text=u'清空', command=self.clean)
        self.clear_btn.place(x=250, y=155, width=35, height=25)
        # 设置结果输出框
        self.result_label = Label(self.root, text=u'翻译结果:')
        self.result_label.place(x=10, y=155)
        self.out_text = Text(self.root, background='light blue')
        self.out_text.place(x=10, y=190, width=285, height=200)

    
    # 提交事件
    def submit(self, event):
        # 获取输入框的文本
        e = self.input_text.get(0.0, END).strip().replace("\n", " ")
        # 调用爬虫函数
        self.translate(e)
        self.out_text.delete(0.0, END)
        self.out_text.insert(END, self.tgt)
        self.out_text.insert(END, "\n"*2)
        self.out_text.insert(END, self.result)
    # 清空事件
    def clean(self):
        self.input_text.delete(0.0, END)
        self.out_text.delete(0.0, END)


if __name__ == "__main__":
    App()

 
第二部,

使用经js加密后的参数来进行请求,

从返回的结果中提取想要的数据

注:安装能够调用js的库

pip install pyexecjs

而调用是:import execjs

def translate(self, e):
    # 实例化对象
    node = execjs.get()
    # 读取js文件
    js = node.compile(open(r"C:\Users\Administrator\Desktop\name\youdao.js", encoding="utf-8").read())
    # 设置其他参数
    r = str(int(time.time() * 1000))
    i = r + str(int(random.random() * 10))
    # 设置js调用方法
    func_name = f"getSign('{e}','{i}')"
    # 调用js文件
    sign = js.eval(func_name)
    # 开始请求
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36",
        "Referer": "http://nmt.youdao.com/",
        "cookie": "OUTFOX_SEARCH_USER_ID=1287319030@10.169.0.83; OUTFOX_SEARCH_USER_ID_NCOO=2092607892.1324136; JSESSIONID=aaa2DvJCf-1A_7eOhENWx; ___rl__test__cookies=1632757888248",
    }
    data = {'i': e,
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'salt': i,
            'sign': sign,
            'lts': r,
            'bv': '679a714475741baa9769e4725c532bb7',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTlME'}
    res = requests.post(
        "http://nmt.youdao.com/translate_o?smartresult=dict&smartresult=rule",
        headers=headers,
        data=data).json()

    # 输出框的翻译
    self.tgt = res['translateResult'][0][0]['tgt']
    self.result = "" 
 
    # 单词翻译详解,句子没有这个部分    
    try:
        for word in res['smartResult']['entries']:  
        self.result += word
    except:
        self.result = ""  

看完点个赞呗 !!!

js教学

通过多次翻译单词可以发现,有以下几个参数是变量:

猜测:i 为翻译的内容,salt应该为时间戳,sign的加密类型可能是md5

通过ctrl+shift+F 搜索,sign为加密的主体,通过搜索会得到以下内容

 结果只有一条min.js,点击方框里的大括号,就能清晰的看到里面的源码。

通过ctrl+F再次搜索sign,有15个结果,对你怀疑的对象打上断点(通过点击下图里8391位置打上断点),之后重新翻译一下单词,就可以把进程停止在该断点的位置。

 选中变量后的整个代码块就会显示该值,该值和header里找到sign值的类型类似,

即该变量就是你要找的数据

选中n.md5 会显示一个函数,点击就能进入到该函数,对数据进行拷贝

依次对salt进行搜索,可以知道salt的值为:r (当前时间戳)+i ( [0,10)区间的一位数)

 对所需的js数据拷贝、处理,写入 .js的文件里

大致的思路和流程就是这样!

对于md5加密(常见加密的类型还有好几种)可以自己编写也可以直接拷贝

下面是逆向后的js文件 

var n = function(e, t) {
return e << t | e >>> 32 - t
},
r = function(e, t) {
var n, r, i, o, a;
return i = 2147483648 & e,
o = 2147483648 & t,
n = 1073741824 & e,
r = 1073741824 & t,
a = (1073741823 & e) + (1073741823 & t),
n & r ? 2147483648 ^ a ^ i ^ o: n | r ? 1073741824 & a ? 3221225472 ^ a ^ i ^ o: 1073741824 ^ a ^ i ^ o: a ^ i ^ o
},
i = function(e, t, n) {
return e & t | ~e & n
},
o = function(e, t, n) {
return e & n | t & ~n
},
a = function(e, t, n) {
return e ^ t ^ n
},
s = function(e, t, n) {
return t ^ (e | ~n)
},
l = function(e, t, o, a, s, l, c) {
return e = r(e, r(r(i(t, o, a), s), c)),
r(n(e, l), t)
},
c = function(e, t, i, a, s, l, c) {
return e = r(e, r(r(o(t, i, a), s), c)),
r(n(e, l), t)
},
u = function(e, t, i, o, s, l, c) {
return e = r(e, r(r(a(t, i, o), s), c)),
r(n(e, l), t)
},
d = function(e, t, i, o, a, l, c) {
return e = r(e, r(r(s(t, i, o), a), c)),
r(n(e, l), t)
},
f = function(e) {
for (var t, n = e.length,
r = n + 8,
i = 16 * ((r - r % 64) / 64 + 1), o = Array(i - 1), a = 0, s = 0; s < n;) a = s % 4 * 8,
o[t = (s - s % 4) / 4] = o[t] | e.charCodeAt(s) << a,
s++;
return t = (s - s % 4) / 4,
a = s % 4 * 8,
o[t] = o[t] | 128 << a,
o[i - 2] = n << 3,
o[i - 1] = n >>> 29,
o
},
p = function(e) {
var t, n = "",
r = "";
for (t = 0; t <= 3; t++) n += (r = "0" + (e >>> 8 * t & 255).toString(16)).substr(r.length - 2, 2);
return n
},
h = function(e) {
e = e.replace(/\x0d\x0a/g, "\n");
for (var t = "",
n = 0; n < e.length; n++) {
    var r = e.charCodeAt(n);
    if (r < 128) t += String.fromCharCode(r);
    else if (r > 127 && r < 2048) t += String.fromCharCode(r >> 6 | 192),
    t += String.fromCharCode(63 & r | 128);
    else if (r >= 55296 && r <= 56319) {
        if (n + 1 < e.length) {
            var i = e.charCodeAt(n + 1);
            if (i >= 56320 && i <= 57343) {
                var o = 1024 * (r - 55296) + (i - 56320) + 65536;
                t += String.fromCharCode(240 | o >> 18 & 7),
                t += String.fromCharCode(128 | o >> 12 & 63),
                t += String.fromCharCode(128 | o >> 6 & 63),
                t += String.fromCharCode(128 | 63 & o),
                n++
            }
        }
    } else t += String.fromCharCode(r >> 12 | 224),
    t += String.fromCharCode(r >> 6 & 63 | 128),
    t += String.fromCharCode(63 & r | 128)
}
return t
};

function md5(e) {
var t, n, i, o, a, s, m, g, v, y = Array();
for (e = h(e), y = f(e), s = 1732584193, m = 4023233417, g = 2562383102, v = 271733878, t = 0; t < y.length; t += 16) n = s,
i = m,
o = g,
a = v,
s = l(s, m, g, v, y[t + 0], 7, 3614090360),
v = l(v, s, m, g, y[t + 1], 12, 3905402710),
g = l(g, v, s, m, y[t + 2], 17, 606105819),
m = l(m, g, v, s, y[t + 3], 22, 3250441966),
s = l(s, m, g, v, y[t + 4], 7, 4118548399),
v = l(v, s, m, g, y[t + 5], 12, 1200080426),
g = l(g, v, s, m, y[t + 6], 17, 2821735955),
m = l(m, g, v, s, y[t + 7], 22, 4249261313),
s = l(s, m, g, v, y[t + 8], 7, 1770035416),
v = l(v, s, m, g, y[t + 9], 12, 2336552879),
g = l(g, v, s, m, y[t + 10], 17, 4294925233),
m = l(m, g, v, s, y[t + 11], 22, 2304563134),
s = l(s, m, g, v, y[t + 12], 7, 1804603682),
v = l(v, s, m, g, y[t + 13], 12, 4254626195),
g = l(g, v, s, m, y[t + 14], 17, 2792965006),
m = l(m, g, v, s, y[t + 15], 22, 1236535329),
s = c(s, m, g, v, y[t + 1], 5, 4129170786),
v = c(v, s, m, g, y[t + 6], 9, 3225465664),
g = c(g, v, s, m, y[t + 11], 14, 643717713),
m = c(m, g, v, s, y[t + 0], 20, 3921069994),
s = c(s, m, g, v, y[t + 5], 5, 3593408605),
v = c(v, s, m, g, y[t + 10], 9, 38016083),
g = c(g, v, s, m, y[t + 15], 14, 3634488961),
m = c(m, g, v, s, y[t + 4], 20, 3889429448),
s = c(s, m, g, v, y[t + 9], 5, 568446438),
v = c(v, s, m, g, y[t + 14], 9, 3275163606),
g = c(g, v, s, m, y[t + 3], 14, 4107603335),
m = c(m, g, v, s, y[t + 8], 20, 1163531501),
s = c(s, m, g, v, y[t + 13], 5, 2850285829),
v = c(v, s, m, g, y[t + 2], 9, 4243563512),
g = c(g, v, s, m, y[t + 7], 14, 1735328473),
m = c(m, g, v, s, y[t + 12], 20, 2368359562),
s = u(s, m, g, v, y[t + 5], 4, 4294588738),
v = u(v, s, m, g, y[t + 8], 11, 2272392833),
g = u(g, v, s, m, y[t + 11], 16, 1839030562),
m = u(m, g, v, s, y[t + 14], 23, 4259657740),
s = u(s, m, g, v, y[t + 1], 4, 2763975236),
v = u(v, s, m, g, y[t + 4], 11, 1272893353),
g = u(g, v, s, m, y[t + 7], 16, 4139469664),
m = u(m, g, v, s, y[t + 10], 23, 3200236656),
s = u(s, m, g, v, y[t + 13], 4, 681279174),
v = u(v, s, m, g, y[t + 0], 11, 3936430074),
g = u(g, v, s, m, y[t + 3], 16, 3572445317),
m = u(m, g, v, s, y[t + 6], 23, 76029189),
s = u(s, m, g, v, y[t + 9], 4, 3654602809),
v = u(v, s, m, g, y[t + 12], 11, 3873151461),
g = u(g, v, s, m, y[t + 15], 16, 530742520),
m = u(m, g, v, s, y[t + 2], 23, 3299628645),
s = d(s, m, g, v, y[t + 0], 6, 4096336452),
v = d(v, s, m, g, y[t + 7], 10, 1126891415),
g = d(g, v, s, m, y[t + 14], 15, 2878612391),
m = d(m, g, v, s, y[t + 5], 21, 4237533241),
s = d(s, m, g, v, y[t + 12], 6, 1700485571),
v = d(v, s, m, g, y[t + 3], 10, 2399980690),
g = d(g, v, s, m, y[t + 10], 15, 4293915773),
m = d(m, g, v, s, y[t + 1], 21, 2240044497),
s = d(s, m, g, v, y[t + 8], 6, 1873313359),
v = d(v, s, m, g, y[t + 15], 10, 4264355552),
g = d(g, v, s, m, y[t + 6], 15, 2734768916),
m = d(m, g, v, s, y[t + 13], 21, 1309151649),
s = d(s, m, g, v, y[t + 4], 6, 4149444226),
v = d(v, s, m, g, y[t + 11], 10, 3174756917),
g = d(g, v, s, m, y[t + 2], 15, 718787259),
m = d(m, g, v, s, y[t + 9], 21, 3951481745),
s = r(s, n),
m = r(m, i),
g = r(g, o),
v = r(v, a);
return (p(s) + p(m) + p(g) + p(v)).toLowerCase()
}

function getSign(e, i) {
sign = md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT");
return sign
}

恭喜你看完了,

学废了吗  (~ ̄▽ ̄)~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值