看回之前的文章:
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文档里面的函数名我们会得到这种返回错误
那么怎么样才会导致呢?
这样不声明就会导致了