免责声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!
前言
此次将对某歌翻译进行逆向处理,其中报错网页右键翻译。在网页中的翻译将会对其进行逆向处理,并且会将其js算法改写为python算法,实现从python中直接调用,不需要使用execjs
来进行调用。这其中的两个版本源代码都会进行开源处理。
某歌翻译的难点在于tkk
的加密处理。
声明:!!!所有代码测试,需要蹄子
测试!!!
逆向目标-某歌翻译
逆向首页:aHR0cDovL3RyYW5zbGF0ZS5nb29nbGUuY29tLw==
参数逆向
-
在chrome浏览器中网页中,选择右击翻译为中文,同时开启浏览器抓包 -
通过发起程序, ws.translate
定位到加密参数点 -
断下断点,提取加密函数 Xp、zo等相关函数
-
提取出来的结果全部函数:(函数名可能不一样)
tkk加密参数获取
tkk
加密参数是每天发生变化的,但是以往的tkk
都是可以使用的。
js调用测试
相关代码:
# **************************************
# --*-- coding: utf-8 --*--
# @Time : 2023-07-05
# @Author : white
# @FileName: google_translate.py
# @Software: PyCharm
# **************************************
import execjs
import requests
from urllib.parse import quote
url = "https:/脱敏处理/translate_a/t"
headers = {
"Content-Type": "脱敏处理",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
params = {脱敏处理}
data = {
"q": ["你应该是一场梦,我应该是一阵风。"]
}
tk = execjs.compile(open("google.js", encoding="utf-8").read()).call("white", "".join(data["q"]))
params["tk"] = tk
data = "q=" + "&q=".join(data["q"])
data = quote(data).replace("%3D", "=").replace("%26", "&")
res = requests.post(url=url, headers=headers, data=data, params=params)
print(res.text)
成功示例图
js算法改写为python代码
基于js改写的算法,可以适用于任何一个tkk
加密参数
class GoogleEncryption:
def __init__(self, Vp="469040.3323378158"):
self.Vp = Vp
def _c_int(self, x, nbits=32):
return (x & ((1 << (nbits - 1)) - 1)) - (x & (1 << (nbits - 1)))
def _c_uint(self, x, nbits=32):
return x & ((1 << nbits) - 1)
def _zo(self, data):
b = list()
for d in range(len(data)):
e = ord(data[d])
if 128 > e:
b.append(e)
else:
if 2048 > e:
b.append(e >> 6 | 192)
else:
if 55296 == (e & 64512) and d + 1 < len(data) and 56320 == (len(data) + 1) & 64512:
d += 1
e = 65536 + ((e & 1023) << 10) + (ord(data[d]) & 1023)
b.append(e >> 18 | 240)
b.append(e >> 12 & 63 | 128)
else:
b.append(e >> 12 | 224)
b.append(e >> 6 & 63 | 128)
b.append(e & 63 | 128)
return b
def _Up(self, a, b):
for c in range(0, len(b) - 2, 3):
d = b[c + 2]
d = (ord(d[0]) - 87) if "a" <= d else int(d)
wa = self._c_uint(a)
d = wa >> d if "+" == b[c + 1] else wa << d
a = (a + d & 4294967295) if "+" == b[c] else a ^ d
return self._c_int(a)
def Wp(self, data: str):
b = self.Vp.split(".")
c = int(b[0])
a = self._zo(data)
d = c
for e in range(len(a)):
d += a[e]
d = self._Up(d, "+-a^+6")
d = self._Up(d, "+-3^+b+-f")
d ^= self._c_int(int(b[1]))
if 0 > d:
d = (d & 2147483647) + 2147483648
b = int(d % 1E6)
return f"{b}.{b ^ c}"
成功示例图
相关代码已开源:
https://github.com/puboop/reverse/
原文始发于微信公众号(律图拟项):【逆向系列】25-某歌翻译-算法改写
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论