> 文档中心 > 有道翻译js逆向+GUI

有道翻译js逆向+GUI

学完js逆向之后,

重新修改了原有的py文件

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

第一步,

设置GUI界面 

import requestsimport execjsimport timeimport randomfrom tkinter import Tk, Button, Label, Text, ENDclass 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("", 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 <>> 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 <>> 29,o},p = function(e) {var t, n = "",r = "";for (t = 0; t >> 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  127 && r > 6 | 192),    t += String.fromCharCode(63 & r | 128);    else if (r >= 55296 && r <= 56319) { if (n + 1 = 56320 && i > 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}

恭喜你看完了,

学废了吗  (~ ̄▽ ̄)~ 

有道翻译js逆向+GUI 与50位技术专家面对面 有道翻译js逆向+GUI 20年技术见证,附赠技术全景图