
https://zhuanlan.zhihu.com/p/40797421
我是参考这个文章,对有道翻译的后台做了一个 js 的破解。 破解的原理大概是这样的, post 的 form 里面有几个值, f, d, ....之类的:

但是应该是有有道的后台做了更新,这个破解失效了, 返回错误码。 {"errorCode":50}
现在这种情况,我应该从哪种思路往下继续进行? 我的理解是这个 post 请求已经完全还原了真实的浏览器的请求不知道还有那些可以尝试的点?
# -*- coding: utf-8 -*- # from lizhelib.scrapy_lizhe import * import requests import time def str_MD5(origin_string): import hashlib m = hashlib.md5() m.update(origin_string.encode('utf-8')) return m.hexdigest() keyword = "apple" headers = { 'Accept': 'application/json, text/Javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7', 'Connection': 'keep-alive', 'Content-Length': '237', 'Content-Type': 'application/x-www-form-urlencoded; charset=', 'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1539804542.6380599; _ntes_nnid=063365ee317cb05d955f6037c9b7f99b,1562145610441; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIOnID=abcKgh9yV1U-IdF1piKVw; ___rl__test__cookies={}'.format(int(round(time.time() * 1000, 0))), 'Host': 'fanyi.youdao.com', 'Origin': 'http://fanyi.youdao.com', 'Referer': 'http://fanyi.youdao.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } salt_value = str(int(round(time.time() * 1000, 0))) + '1' form_data = { 'i': 'live', 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt_value, 'sign': str_MD5("fanyideskweb" + keyword + salt_value + "97_3(jkMYg@T[KZQmqjTK"), 'ts': str(int(round(time.time() * 1000, 0))), 'bv': str_MD5(headers["User-Agent"]), 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME' } url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" respOnse= requests.post(url, headers=headers, data=form_data) print(response.content) 1 throns 2019-07-12 18:39:22 +08:00 via Android 这里不是不允许讨论破解相关的问题吗? |
2 locoz 2019-07-13 10:07:25 +08:00 via Android 这个不叫“后台破解”…看标题还以为你在搞渗透,叫“请求加密参数破解”还差不多。 网上的文章与实际情况有出入是很正常的事情,照抄之后发现没有效果你可以自己逆向一下看看到底长啥样,不知道入口在哪可以参考原文章(只要变动不太大)。 然后你现在这情况,你确定已经完全还原了么?抓个包对比一下看看? |
3 wc110302 2019-07-13 18:14:56 +08:00 这个应该叫 js 加密破解吧 |
4 caneman 2019-07-15 10:11:43 +08:00 随手看了一下,这是 POST 需要的 data, i: hello from: AUTO to: AUTO smartresult: dict client: fanyideskweb salt: 15631545265703 sign: 12f5d8eb3bdf901b889fc20ae5b9f64c ts: 1563154526570 bv: 3a019e7d0dda4bcd253903675f2209a5 doctype: json version: 2.1 keyfrom: fanyi.web action: FY_BY_REALTlME 关键的加密函数如下: var r = function(e) { var t = n.md5(navigator.appVersion) , r = "" + (new Date).getTime() , i = r + parseInt(10 * Math.random(), 10); return { ts: r, bv: t, salt: i, sign: n.md5("fanyideskweb" + e + i + "97_3(jkMYg@T[KZQmqjTK") } 其中参数 e 是需要翻译的字符串 |
5 woshichuanqilz OP @caneman 对, 我看教程的分析也是这样的, 关键的点就是时间戳和 md5, 但是这样用 python 写下来得到的返回值是 error 50, 我自己写的和之前教程上的代码都是这样。 ``` # -*- coding: utf-8 -*- # from lizhelib.scrapy_lizhe import * import requests import time def str_MD5(origin_string): import hashlib m = hashlib.md5() m.update(origin_string.encode('utf-8')) return m.hexdigest() keyword = "apple" headers = { 'Accept': 'application/json, text/Javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7', 'Connection': 'keep-alive', 'Content-Length': '237', 'Content-Type': 'application/x-www-form-urlencoded; charset=', 'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1539804542.6380599; _ntes_nnid=063365ee317cb05d955f6037c9b7f99b,1562145610441; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIOnID=abcKgh9yV1U-IdF1piKVw; ___rl__test__cookies={}'.format(int(round(time.time() * 1000, 0))), 'Host': 'fanyi.youdao.com', 'Origin': 'http://fanyi.youdao.com', 'Referer': 'http://fanyi.youdao.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } salt_value = str(int(round(time.time() * 1000, 0))) + '1' form_data = { 'i': 'live', 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt_value, 'sign': str_MD5("fanyideskweb" + keyword + salt_value + "97_3(jkMYg@T[KZQmqjTK"), 'ts': str(int(round(time.time() * 1000, 0))), 'bv': str_MD5(headers["User-Agent"]), 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME' } url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" respOnse= requests.post(url, headers=headers, data=form_data) print(response.content) ``` |
6 woshichuanqilz OP @caneman 代码我 append 到楼顶了, 回复里面贴代码缩进有问题 |
7 caneman 2019-07-15 13:49:25 +08:00 @woshichuanqilz 猜测,你写的 ts/salt 的部分可能有问题(我没细看),还有就是 bv 部分,appVersion 和 User-Agent 的输出格式不一样的 我下面的这个版本是能正常返回结果的,随便写的有点糙,凑合着看吧 import requests import time import random import hashlib def md5(k): m = hashlib.md5() m.update(k.encode('UTF-8')) return m.hexdigest() url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' appversion = '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' keyword = 'youdao' ts = int(time.time() * 1000) salt = ts * 10 + int(random.uniform(0, 1) * 10) bv = md5(appversion) sign = md5('fanyideskweb' + keyword + str(salt) + '97_3(jkMYg@T[KZQmqjTK') 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', } headers = { 'Cookie':'YOUDAO_MOBILE_ACCESS_TYPE=1; [email protected]; JSESSIOnID=aaadmmGUl_OHN4PD2j0Vw; ___rl__test__cookies={}; OUTFOX_SEARCH_USER_ID_NCOO=298433689.2039179'.format(ts), 'Accept': 'application/json, text/Javascript, */*; q=0.01', 'Content-Type': 'application/x-www-form-urlencoded; charset=', '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/75.0.3770.100 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'} res = requests.post(url, data=data, headers=headers) print(res.text) |