python利用js2py库来解决某道翻译的js逆向

看回之前的文章:
https://blog.csdn.net/chaopicrawl/article/details/103560135

在此,我们知道了Form Data数据里面的意思。

我们只需利用js文档为我们创造出Form Data数据里面的salt, sign ,ts , bv即可进行requests库的post访问得到想要的翻译内容。

既然我们要利用js文档做文章,那么js的调试工具和js的基本知识是必然不可少的。

关于js代码的调试 我们需要用到一些工具 。
可以利用在线的js调试工具:https://www.sojson.com/runjs.html
也可以利用其他程序。我在这里利用了乐易助手程序进行js的调试。

关于js的基本知识,我们首先要知道
this : 放在哪里 就代表作为哪个环境的指针
navigator.appVersion : 浏览器的产品号
全局变量 : window.变量名
数据类型: Undefined , Null , Boolen , Number , String , Object

布尔操作符: 非(NOT):! , 与(AND): && ,或(OR): ||

var 是声明对象 变量 函数等的意思 (创建的意思)
function() {} 一个函数包含什么内容
如何访问一个函数 : 对象名.函数名()

var Obj = {} 创建一个空对象
如何访问对象 : Obj.name / Obj[“变量名”]
var Array = [] 创建一个空数组
如何访问数组 : Array[0] 访问数组的第一个位置的元素,Array.length 返回数组的长度

一些基本操作数组队列的函数:
push() : 最后一项加一个元素 返回元素
pop() : 最后一项删除一个元素 返回长度
shift() : 最前一项删除一个元素 返回元素
unshift() : 最前一项增加一个元素 返回长度
reverse() : 返回反转后的数组
sort() : 里面放置函数,作用也是排序
concat() : 在一个数组后添加一个元素 (多数情况下用 ‘+’)
splice() : 数组的增删替换操作 里面放三个参数 具体怎么用请自行上网搜

位置方法:
indexOf() : 返回查询元素的位置
lastIndexOf(): 从后往前的数,返回查询元素的位置

迭代方法:
every() : 对数组每一项运行给定函数, 全部符合返回True
filter() ; 对数组每一项运行给定函数, 返回函数选出的数组
forEach() :对数组每一项运行给定函数, 没有返回值,对每一项进行函数操作
**map()😗*对数组每一项运行给定函数, 返回函数运行结果后的数组
some() :对数组每一项运行给定函数, 任意一项符合则返回True

Date 类型
**var Date = new Date()**创建一个 从1970年1月1日开始计算的日期(就是我们经常看到的 1589460642.787326 )

字符串的操作:
slice() substring() substr() indexof() lastIndexOf() 这些都是查找的方法
trim() :去除空格
tirmLeft() : 去除左边空格
trimRight() : 去除右边空格
toUpperCase() :大写
toLowerCase() :小写
search() match() 配合正则的使用
replace() : 第一参数放正则,第二个参数放替换的内容
fromcharCode() : 将as编码编程字符串
charcodeAt() : 将字符串编程as编码

介绍得差不多了 我们进入今天的主题
利用之前的文章 , 我们在js文档中找到了我们需要的数据的地方
在这里插入图片描述
(我尝试过在这里断点测试 ,可能电脑太差或者是自己太菜,刷新后无法格式化回到这里,所以断点那种办法在这里我就没用到了,不过也不影响)

首先,从前面的js知识中,我们知道了 n.md5 其实就是在引用函数,但现在这个n被混淆了我们并不需要管他 md5就是我们知道的md5加密了

然后, (new Date).getTime() 返回标识日期的毫秒数
Math.random() 就是 从大于等于0 小于1的数中任意挑选一个,这里代表的就是0-9任意一个数

剩下的e 其实就是我们传进去要翻译的单词了
在这里插入图片描述
在这里插入图片描述
这里介绍一个小技巧 对于利用 ajax加载 post 请求的网站 我们可以大胆地在js文档里找到类似这两张图的地方 得到我们想要的数据。(我仍未用得很熟练 很多地方会在以后的文章中介绍)

我们已经知道了返回数据的大致格式了 然后我们现在利用复制js文档的办法去创造出 sign salt ,ts ,bv

乐易助手下载地址:https://www.leybc.com/
乐易助手操作方法:
首先我们将返回的内容复制到里面:
在这里插入图片描述
点击加载代码 并运行 发现缺少参数 n未定义
在这里插入图片描述
就是之前说的 n是被混淆的 这行代码只是为了调用md5 所以我们大可以删掉前面的n
在这里插入图片描述
同时我们要加入md5函数还有浏览器的产品号 点击加载代码 选到md5和window即可
在这里插入图片描述
在这里插入图片描述

接下来就像之前说的 我们要调用函数 这里给出的函数名叫hex_md5(s)
在这里插入图片描述
我们要在下面改一下
在这里插入图片描述
最后我们点击一下加载代码 然后运行后 就得出了我们想要的结果了
在这里插入图片描述
既然得出了 return后的数据 那么我们将这里整个文档内容复制到一个txt文档中 并把后缀改为js

接下来我们要认识怎么用js2py这个库
他有两种方法
第一种:

import js2py
js = js2py.EvalJs()
js.execute()#里面放置js代码
#也可以读取文档的方式放置js代码
with open('XXXX.js','r',encoding="utf-8") as f:
	js.execute(f.read())
#上面这种方法是适合代码量比较多的时候


第二种:

#下面这种方法是适合代码比较少的时候,自己写js代码的时候可以用
js='''
function a(){};
'''
result = js2py.eval_js(js)

好了我们接下来就能正式操作js2py库破解某道的js逆向了
因为我们是在ajax抓到包 返回的From Data数据 所以我们的url也应该是抓包的那个url

import  js2py
js = js2py.EvalJs()
with open('youdao.js', 'r', encoding='utf-8') as f:
    js.execute(f.read())

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
key = input('请输入待查询字符:')
need = js.r(key) #r代表的是js文档里的函数名
print(need)

运行代码后 我们如愿的得到了我们想要的数据
在这里插入图片描述
假设我们没有声明js文档里面的函数名我们会得到这种返回错误
在这里插入图片描述

那么怎么样才会导致呢?
在这里插入图片描述
这样不声明就会导致了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值