荐 JS逆向 百度翻译
JS逆向 百度翻译
后面可能要进行JS逆向的学习记录,有空发发怎么实现一些加密网站的JS逆向,和我一起进步吧!
怕有的人不知道JS逆向是个什么东西,这里大概解释一下。第一次听到这个词可能觉得好高大上,会不会很难,我的回答是当你掌握了技巧以后其实也不难了。在爬虫分析网站过程中可能会碰到一些数据没法直接通过网站的response得到,而要构造参数访问网站,就是向对方服务器发送请求,然后模拟网站获取数据,而其中的构造参数这一步骤就是JS逆向,有好些参数是通过网站后台的JavaScript生成的,我们要做的就是找出后台参数生成的原理。
不管听懂与否,还是看接下来的分析吧,在实战中学习知识效率是最高的。
一、分析环节
1、进入百度翻译网站,一波常规操作。按F12,选中"XHR",向翻译框输入任意文字,观察抓包到的链接。
可以看到红色方框就是这次分析的最终目的,构造出这个参数列表,然后post访问对应的链接。
现在需要解密的参数看上去有sign和token 2个,实际上只有sign一个而已。
我们再在翻译框输入任意文本,发现token值是不变的,后面的JS脚本分析也会证实这一点,token是个常量。
2、直接搜索含有"sign"这个参数的链接的片段,寻找生成机理的代码。这里为什么是网站片段呢,一般脚本的构造都会是网站名先于函数名和变量名嘛,sign就是变量,检索网站片段会更容易定位到sign位置。
查找后发现只有一个备选项,直接点进去这个脚本,然后把不容易观看的代码格式化一下,按下“{}”。
然后可以看到我们需要的参数都在这里被定义了,而且右边还直接给我打好了断点。不过保险起见,还要在黄色行也打上断点。
接下来,我们刷新界面,网站会停在我们打了断点的地方,而且一些数据会被加载进来,后面将鼠标悬浮在sign旁边的y上,就会看到这样的图:
接下来点进去弹窗的"e"的js链接,跳转到另外一js脚本。
这个function e函数就是生成sign参数的js代码,将红色方框里的代码复制到一个js文件里,这里命名为code.js。后面的工作就是写代码和调试了。
二、代码环节
import requests
import execjs
class BaiduTranslater:
def __init__(self, sources):
self.sources = sources #输入翻译的内容
self.url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en' #访问网站
self.headers = { #请求头
'origin': 'https: // fanyi.baidu.com',
'referer': 'https: // fanyi.baidu.com /?aldtype = 16047',
'user - agent': #自行添加,
'cookie': #自行添加
}
def data_creater(self): #生成data参数表
with open("code.js", 'r')as f: #调用从网站上复制下来的js脚本
content = execjs.compile(f.read()) #编译脚本
sign = content.call("e", self.sources) #得到sign值
self.data = {
'from': 'zh',
'to': 'en',
'query': self.sources,
'transtype': 'translang',
'simple_means_flag': 3,
'sign': sign,
'token': '1c65e5489209deafd9e0302de91a0010', #系统常量
'domain': 'common'
}
def crawler(self):
self.data_creater() #先生成data
res = requests.post(self.url, data=self.data, headers=self.headers)
res.encoding = 'utf-8'
print("翻译结果为:", res.json()['trans_result']['data'][0]['dst']) #对应翻译结果
if __name__ == '__main__':
while True:
str_input = input("请输入要翻译的内容:")
if str_input == 'q':
break
baidu = BaiduTranslater(str_input) #实例化百度翻译类
baidu.crawler() #调用函数进行翻译
其中有必要一提的就是execjs需要额外安装,可以在cmd中输入“pip install PyExecJS”进行安装。
JS脚本初步为下图所示,而翻译的结果可以根据得到的json自行提取想要的数据,这里只写简单的翻译结果的提取。
代码有些长我就收起了一些代码,这里千万注意js代码的结构不要出错,认清大括号的匹配是否正确。
可是这样运行代码会发现是会报错的!!
报错了没事,不要慌,只是code.js里的 i 没有被定义,编译的时候找不到 i 值而已。只要回到之前的网站界面继续分析就好了。
三、调试环节
我们在function e函数这里下断点,把BreakPoint其他的断点卸掉,然后刷新。后面按下图所示的“下一步”(↓)执行就会一步步的显示出执行结果。
可以很清楚看到 i 的值就是这个常量,为什么我就能肯定它是一个常数呢,可以悬浮在window[l] 上观察,或者是红色框语句,i 是一个已经计算好的常量。
鼠标悬浮于i 变量上,复制弹出窗口中的内容,将 i 这个常量添加到我们的code.js 脚本中
然而又报出了新错误,没事我们继续分析。这里毕竟是用人家的js代码,而不是看懂js代码实现sign的原理自己写python代码,所以要屈从于网站脚本,如果你有JS基础可以选择自己用python写原理,不过这种方法较为耗时就是了。
我们还是按部就班,一直下一步↓ 往下运行
显然这就是我们需要的n ,而n是一个函数,我们将红框中的代码复制进code.js中,然后运行程序
终于啊,成功了!!!
四、总结
从中你也可能窥探到了JS逆向真正麻烦的地方就是在网站上调试,寻找想要的代码和参数的构成,需要打断点,下一步执行,查询变量等操作。这是个需要耐心和时间的过程,说实话是真的需要毅力的,学习初期不知从何入手,就找现成的视频教学,最好是近期的而且讲解步骤详细的那种,这样在学习中才不会因为不知道下一步该怎么做而放弃。最重要的还是学习方法,这样我们就能已不变应万变,将知识转化成自己内在的东西,也就是技能和技术的提升,技能和技术没法一日而成,只有日积月累。
本文参考讲解:【Python爬虫】百度翻译JS逆向
本文地址:https://blog.csdn.net/weixin_43594279/article/details/107216474