1.问题分析过程
本文以百度翻译为例介绍js逆向过程
1.1 通过抓包找出返回数据的api,因刷新时页面不变,所以数据是通过ajax异步获取,所以可在xhr中抓包
1.2 分析请求头得到formdata的信息,只有sign是可变的,token是固定的,query为输入的信息
1.3 再全局搜索数据包的接口v2transapi?,找出js代码文件,从中寻找生成sign的函数
1.4 断点debug鼠标移到y上可定位到生成函数,y(n)=e®
1.5 对于较长的参数生成js代码,可直接在Python中利用PyExecJs模块调用执行,发现js代码中还存在局部参数未传值
1.6 找出i的生成式,但是不知道l的值,将l在控制台中执行,得到gtk,所以i=window[“gtk”],接下来在源码中对gtk进行搜索得到需要的结果
1.7 将window.gtk的值赋给i后再对js代码进行调试得到sign值
python在pycharm中用PyExecJs调用执行js代码时需配置相应的环境,windows自带JScript引擎会报错,所以需要安装nodejs,然后添加到本机的环境变量后配置到pycharm中
2.代码示例
2.1 获取js函数参数
import requests
import re
def get_params():
headers={'user-agent':''}
url="https://fanyi.baidu.com/"
html=requests.get(url,headers=headers).text
token=re.findall(r"window.*token: '(.*?)'",html,re.S)[0]
gtk=re.findall(r"window.gtk = '(.*?)';",html,re.S)[0]
return gtk,token
2.2 执行js代码获取formdata
import execjs
import os
def get_FormData(word):
gtk,token=get_params()
# 修改当前执行环境
os.environ["EXECJS_RUNTIME"] = "Node"
# 获取环境引擎
name=execjs.get().name
with open('code.js','r') as f:
js_text=f.read()
# 编译js代码
ctx=execjs.compile(js_text)
js='e("{}","{}")'.format(word,gtk)
#eval可模拟执行js代码
sign=ctx.eval(js)
return token,sign
2.3 携带formdata对翻译接口发起post请求
def get_res():
token,sign=get_FormData()
choice=input("请选择:zh or en 汉译英>zh,英译汉>en :")
if choice=='zh':
f,t='zh','en'
if choice=='en':
f,t='en','zh'
word=input("请输入:")
data={
'from': f,
'to': t,
'query': word,
'transtype': 'translang',
'simple_means_flag': '3',
'sign': sign,
'token': token,
'domain': 'common'
}
res=requests.post(trs_url,headers=headers,data=data).json()
print(res)