irpas技术客

js逆向——百度翻译_辗转前行_百度翻译逆向

irpas 8370

文章目录 一、分析需要逆向的参数二、模拟sign参数的构建三、编写python代码总结 一、分析需要逆向的参数 1.首先打开百度翻译页面的开发者工具:

?2.确定数据包的位置:

? ? ? ? 大家使用百度翻译的时候都是输入需要翻译的内容就会自动呈现出我们需要的译文,因此在这里我们可以随便输入一个内容:

?

? ? ? ? ?在输入“我完全相信你”之后我们可以看到经过Fetch/XHR筛选之后的数据包又增加了4个,在这4个数据包中可以很容易地找到第三个数据包——v2transapi?from=zh&to=en中就存在我们想要的译文:

?????????好了,现在数据包也找到了,只需要模拟向服务器发送请求,抓取数据就可以了,不过在此之前我们还需要分析请求的参数。

3.确定需要的参数:

? ? ? ? 在负载中我们可以清晰地看到发送请求所需要的参数和表单数据:

? ? ? ? ?这时候我们可以再输入一个翻译内容,然后观察两个数据包中的参数变化:

?????????对比两个数据包中的字符串参数和表单数据可以发现:两个数据包中的字符串参数是一样的,而表单数据中有query和sign两个数据是不同的,而query正是我们需要翻译的内容,sign则是一个不知道从哪里获得的值。(这里不同数据包中相同的参数在同一台电脑上是相同的,但是在不同电脑上是不一样的,例如:token这个参数的值在两个数据包中都没有发生改变,但是如果是在两台电脑上,哪怕输入的内容一样,这个参数都是不一样的,不过这个参数可以通过其他数据包获取,这里就不再赘述了)

? ? ? ? 至此我们已经确定——只有一个sign参数是需要我们去模拟构建的

二、模拟sign参数的构建 1.Ctrl+Shift+F全局搜索sign:,然后可以看到给我们返回了很多数据包:

2.确定构建sign参数的位置:

? ? ? ? 这里就需要我们耐心地去寻找了,不过这里很幸运,第一个数据包中就存在sign的构建方式:


? ? ? ? ?可以看到sign的值其实就是u(i),接着就需要我们打断点分析:

? ? ? ? 我这里的断点是打在了12079行,前边的位置不知道为什么打了断点进入不了debugger(有大佬可以解释一下吗),不过在这个位置也可以,

之后可以将鼠标放在u这个位置,会自动显示出u这个函数的位置,可以点击跳转:

?

? ? ? ? ?

?

????????之后可以在pycharm中创建一个js文件,把这一个函数复制下来,并取个名get_sign:

get_sign = function(t) { var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === i) { var a = t.length; a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10))) } else { for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++) "" !== s[c] && l.push.apply(l, function(t) { if (Array.isArray(t)) return e(t) }(o = s[c].split("")) || function(t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(o) || function(t, n) { if (t) { if ("string" == typeof t) return e(t, n); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0 } }(o) || function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }()), c !== u - 1 && l.push(i[c]); var d = l.length; d > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(d / 2) - 5, Math.floor(d / 2) + 5).join("") + l.slice(-10).join("")) } for (var p = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), f = (null !== r ? r : (r = window[p] || "") || "").split("."), h = Number(f[0]) || 0, m = Number(f[1]) || 0, g = [], v = 0, y = 0; y < t.length; y++) { var w = t.charCodeAt(y); w < 128 ? g[v++] = w : (w < 2048 ? g[v++] = w >> 6 | 192 : (55296 == (64512 & w) && y + 1 < t.length && 56320 == (64512 & t.charCodeAt(y + 1)) ? (w = 65536 + ((1023 & w) << 10) + (1023 & t.charCodeAt(++y)), g[v++] = w >> 18 | 240, g[v++] = w >> 12 & 63 | 128) : g[v++] = w >> 12 | 224, g[v++] = w >> 6 & 63 | 128), g[v++] = 63 & w | 128) } for (var b = h, x = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), _ = 0; _ < g.length; _++) b = n(b += g[_], x); return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)), "".concat((b %= 1e6).toString(), ".").concat(b ^ h) } console.log(get_sign('你可以给我一个机会吗'))

? ? ? ? ?紧接着尝试使用get_sign函数并打印结果,其中会报错r没有定义:,

? ? ? ? ?这时候我们就是缺什么补什么,这里r没有定义就去找r的定义,还是相同的方法,在index.593d1b08.js:formatted文件中这个get_sign函数的下方打上断点,并点击一下三角形按钮:

? ? ? ? ?接着把鼠标放置在r的位置上,可以看到r就是一个固定的值:

?

? ? ? ? ?然后可以在js代码中将r设置为固定值320305.131321201:

var r = 320305.131321201 get_sign = function(t) { var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === i) { var a = t.length; a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10))) } else { for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++) "" !== s[c] && l.push.apply(l, function(t) { if (Array.isArray(t)) return e(t) }(o = s[c].split("")) || function(t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(o) || function(t, n) { if (t) { if ("string" == typeof t) return e(t, n); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0 } }(o) || function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }()), c !== u - 1 && l.push(i[c]); var d = l.length; d > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(d / 2) - 5, Math.floor(d / 2) + 5).join("") + l.slice(-10).join("")) } for (var p = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), f = (null !== r ? r : (r = window[p] || "") || "").split("."), h = Number(f[0]) || 0, m = Number(f[1]) || 0, g = [], v = 0, y = 0; y < t.length; y++) { var w = t.charCodeAt(y); w < 128 ? g[v++] = w : (w < 2048 ? g[v++] = w >> 6 | 192 : (55296 == (64512 & w) && y + 1 < t.length && 56320 == (64512 & t.charCodeAt(y + 1)) ? (w = 65536 + ((1023 & w) << 10) + (1023 & t.charCodeAt(++y)), g[v++] = w >> 18 | 240, g[v++] = w >> 12 & 63 | 128) : g[v++] = w >> 12 | 224, g[v++] = w >> 6 & 63 | 128), g[v++] = 63 & w | 128) } for (var b = h, x = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), _ = 0; _ < g.length; _++) b = n(b += g[_], x); return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)), "".concat((b %= 1e6).toString(), ".").concat(b ^ h) } console.log(get_sign('你可以给我一个机会吗'))

? ? ? ? 运行js文件,报错:?(intermediate value)(intermediate value)(intermediate value).split is not a function:

?

? ? ? ? ?可以看到就是f = (null !== r ? r : (r = window[p] || "") || "").split(".")这一段代码发生了错误,在index.593d1b08.js:formatted文件中找到该代码的位置:

?

? ? ? ? ?原代码中显示(null !== r ? r : (r = window[p] || "") || "").split(".")也就是f是一个数组,长度为2,索引为零的位置是320305,索引为1的位置是131321201,这两个值分别是定值r的整数部分和小数部分,我们可以直接将f设置为一个列表:

即f =?["320305","131321201"]:

var r = 320305.131321201 get_sign = function(t) { var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === i) { var a = t.length; a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10))) } else { for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++) "" !== s[c] && l.push.apply(l, function(t) { if (Array.isArray(t)) return e(t) }(o = s[c].split("")) || function(t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(o) || function(t, n) { if (t) { if ("string" == typeof t) return e(t, n); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0 } }(o) || function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }()), c !== u - 1 && l.push(i[c]); var d = l.length; d > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(d / 2) - 5, Math.floor(d / 2) + 5).join("") + l.slice(-10).join("")) } for (var p = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), f = ["320305","131321201"], h = Number(f[0]) || 0, m = Number(f[1]) || 0, g = [], v = 0, y = 0; y < t.length; y++) { var w = t.charCodeAt(y); w < 128 ? g[v++] = w : (w < 2048 ? g[v++] = w >> 6 | 192 : (55296 == (64512 & w) && y + 1 < t.length && 56320 == (64512 & t.charCodeAt(y + 1)) ? (w = 65536 + ((1023 & w) << 10) + (1023 & t.charCodeAt(++y)), g[v++] = w >> 18 | 240, g[v++] = w >> 12 & 63 | 128) : g[v++] = w >> 12 | 224, g[v++] = w >> 6 & 63 | 128), g[v++] = 63 & w | 128) } for (var b = h, x = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), _ = 0; _ < g.length; _++) b = n(b += g[_], x); return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)), "".concat((b %= 1e6).toString(), ".").concat(b ^ h) } console.log(get_sign('你可以给我一个机会吗'))

? ? ? ? 再运行该js代码,有报错n没有定义:

? ? ? ? ?在原文中找到b = n(b += g[_], x);的位置,将鼠标放在n上可以看到n是一个函数

? ? ? ? 跳转之后将n函数复制并放在pycharm中的js文件中?

?

function n(t, e) { for (var n = 0; n < e.length - 2; n += 3) { var r = e.charAt(n + 2); r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r), r = "+" === e.charAt(n + 1) ? t >>> r : t << r, t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r } return t } var r = 320305.131321201 get_sign = function(t) { var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === i) { var a = t.length; a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10))) } else { for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++) "" !== s[c] && l.push.apply(l, function(t) { if (Array.isArray(t)) return e(t) }(o = s[c].split("")) || function(t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(o) || function(t, n) { if (t) { if ("string" == typeof t) return e(t, n); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0 } }(o) || function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }()), c !== u - 1 && l.push(i[c]); var d = l.length; d > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(d / 2) - 5, Math.floor(d / 2) + 5).join("") + l.slice(-10).join("")) } for (var p = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), f = ["320305","131321201"], h = Number(f[0]) || 0, m = Number(f[1]) || 0, g = [], v = 0, y = 0; y < t.length; y++) { var w = t.charCodeAt(y); w < 128 ? g[v++] = w : (w < 2048 ? g[v++] = w >> 6 | 192 : (55296 == (64512 & w) && y + 1 < t.length && 56320 == (64512 & t.charCodeAt(y + 1)) ? (w = 65536 + ((1023 & w) << 10) + (1023 & t.charCodeAt(++y)), g[v++] = w >> 18 | 240, g[v++] = w >> 12 & 63 | 128) : g[v++] = w >> 12 | 224, g[v++] = w >> 6 & 63 | 128), g[v++] = 63 & w | 128) } for (var b = h, x = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), _ = 0; _ < g.length; _++) b = n(b += g[_], x); return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)), "".concat((b %= 1e6).toString(), ".").concat(b ^ h) } console.log(get_sign('你可以给我一个机会吗'))

????????运行js文件可以看到已经成功地获取到了一个值:

? ? ? ? ?对比数据包中的sign参数,可以看到这两个值是相同的:

?????????好了,sign参数也已经获取到了,剩下的就简单了,写python代码向服务器发送请求,然后抓取数据即可。

三、编写pthon代码 1、python代码 import requests import execjs word = input('请输入需要翻译的内容:') url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en' with open('百度翻译.js',encoding = 'utf-8') as js: js_content = js.read() compile = execjs.compile(js_content) sign = compile.call('get_sign',word) headers = { 'Cookie':'BIDUPSID=BF2952511AB131D87E7EA811CF5260DA; PSTM=1633084486; BAIDUID=BF2952511AB131D8D37F364B598F9AD6:FG=1; __yjs_duid=1_1f0dd032e5bf61cd631d35ee70473bd51633440098189; REALTIME_TRANS_SWITCH=1; HISTORY_SWITCH=1; FANYI_WORD_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; APPGUIDE_10_0_2=1; BDUSS=UotZ3BMTWpZfnVPWTFYcEJaVmNjRkNqLVU0TlV-cjBlaTloYkUtOW9YREpTdHBpSVFBQUFBJCQAAAAAAAAAAAEAAADldbyp1-3Su7OhuuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMm9smLJvbJiS; BDUSS_BFESS=UotZ3BMTWpZfnVPWTFYcEJaVmNjRkNqLVU0TlV-cjBlaTloYkUtOW9YREpTdHBpSVFBQUFBJCQAAAAAAAAAAAEAAADldbyp1-3Su7OhuuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMm9smLJvbJiS; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BA_HECTOR=2k8504058ga0212g250mhfr41he2j3e16; ZFY=UWveQ7VGifDzM5vepT3IKHebIMVDMaIaj:BvMbG:AGgXo:C; BDRCVFR[-BxzrOzUsTb]=mk3SLVN4HKm; delPer=0; PSINO=2; BDRCVFR[OEHfjv-pq1f]=K7PavkeTFPTUAN8ULuEQhPEUi4WU6; H_PS_PSSID=; BAIDUID_BFESS=91196E260897CFFF3B77A7C493A319C5:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1658828569,1658841313,1658883727,1658968990; ab_sr=1.0.1_NWQ3YTNlZDg5ZDBhNDYzZDY4NjM0ZDAyNjRlOGQ5MzNlYmY4NTAxZDY5YTg5NDU2NTFjMWM4NTMyMjgzNjVlYmZkMzQyMGEzOGVmNmM0YWNhM2IxYmVlMWFlMGI1ODkyY2Y5NGE0Mzg0MGEyNDk3NDk2Yjg0MzA0YzNlOTkwMzA4OTFhNDUxODM4MjRmNmFmMTdjMTY5ZmI1NjhmY2JhYjM3YTA0ODBjNTQ4N2I2MDFjZDZmMjU3ZGU3MmU0M2Vk; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1658976903', 'Referer':'https://fanyi.baidu.com/?aldtype=16047', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71', } data = { 'from':'zh', 'to':'en', 'query':word, 'simple_means_flag':'3', 'sign':sign, 'token':'f84f349ac4e1f7d82418c6922ccf5b1e', 'domain':'common', } response = requests.post(url,headers=headers, data=data) dst = response.json()['trans_result']['data'][0]['dst'] print(dst) 另外该pthon代码中token、cookie参数需要大家根据自身情况略作修改 2、javascript代码 function n(t, e) { for (var n = 0; n < e.length - 2; n += 3) { var r = e.charAt(n + 2); r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r), r = "+" === e.charAt(n + 1) ? t >>> r : t << r, t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r } return t } var r = 320305.131321201 get_sign = function(t) { var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === i) { var a = t.length; a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10))) } else { for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++) "" !== s[c] && l.push.apply(l, function(t) { if (Array.isArray(t)) return e(t) }(o = s[c].split("")) || function(t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(o) || function(t, n) { if (t) { if ("string" == typeof t) return e(t, n); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0 } }(o) || function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }()), c !== u - 1 && l.push(i[c]); var d = l.length; d > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(d / 2) - 5, Math.floor(d / 2) + 5).join("") + l.slice(-10).join("")) } for (var p = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), f = ["320305","131321201"], h = Number(f[0]) || 0, m = Number(f[1]) || 0, g = [], v = 0, y = 0; y < t.length; y++) { var w = t.charCodeAt(y); w < 128 ? g[v++] = w : (w < 2048 ? g[v++] = w >> 6 | 192 : (55296 == (64512 & w) && y + 1 < t.length && 56320 == (64512 & t.charCodeAt(y + 1)) ? (w = 65536 + ((1023 & w) << 10) + (1023 & t.charCodeAt(++y)), g[v++] = w >> 18 | 240, g[v++] = w >> 12 & 63 | 128) : g[v++] = w >> 12 | 224, g[v++] = w >> 6 & 63 | 128), g[v++] = 63 & w | 128) } for (var b = h, x = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), _ = 0; _ < g.length; _++) b = n(b += g[_], x); return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)), "".concat((b %= 1e6).toString(), ".").concat(b ^ h) } console.log(get_sign('你可以给我一个机会吗')) 总结:

????????百度翻译的逆向是比较简单的js逆向,里边没有什么弯弯绕绕,希望可以帮助到大家。

????????同样的本人水平有限,如果有什么问题,请大家指正。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #百度翻译逆向 #js逆向百度翻译 #详细步骤希望能够帮助到大家