星月教你做网站回顾文档seo营销是什么
网址(加密后):aHR0cHM6Ly93d3cuaWNpYmEuY29tL3RyYW5zbGF0ZQ==
文章目录
- 抓包
- sign值
- 结果加密
- 逆向sign值
- 第一步
- 第二步
- 1.
- 2.
- 3.
- 解密content
- 第一步
- 1.
- 2.
- 3.
抓包
F12 -> 翻译框输入spider -> 点击Fetch/XHR -> 找到接口 index.php?
开头的接口
得到如下界面:
sign值
结果加密
逆向sign值
经过测试,sign是与单词有关的,现在进入代码进行跟栈
点击 发起程序
经过逐个查看,takeResult
处应该是加解密的地方
点击跳转
跳转到 v
开头的行,在这里下个断点,重新输入spider,浏览器会在这里断住
仔细观察右边的作用域,发现出现了sign的值
由此可知,sign的值是r的值,故在上面的r处打上断点,重新输入spider
第一步
var r = u()("6key_web_new_fanyi".concat(s.LI).concat(t.q.replace(/(^\s*)|(\s*$)/g, ""))).toString().substring(0, 16);
-
(“6key_web_new_fanyi”.concat(s.LI).concat(t.q.replace(/(^\s*)|(\s*$)/g, “”))
经过多次测试,s.LI是 6dVjYLFyzfkFkk
先看这段,别看他又臭又长,其实进行的操作只是将s.Li和t的q值加入到"6key_web_new_fanyi"后,而查看作用域可以发现,
t.q = spider
所以这段的结果就是 6key_web_new_fanyi6dVjYLFyzfkFkkspider,其中spider就是你输入的词
经过多次测试,这个是定值,也就是说,u()函数的参数是一个定值 -
u()
在进入e函数时,得到如下函数:function(e) {return function(t, r) {return new e.init(r).finalize(t)} }
这里面的e.init®并无任何作用,只是起到初始化进行迷惑我们的操作,所以直接不看,现在我们需要进入finalize()函数,因为这个函数才是接收主要参数的函数,此前任何和init有关的函数都不是我们需要的
finalize
函数进入主要函数之后,我们会看到,在init函数之后,会进入reset函数
在reset之后,我们继续下一步,会进入_doReset
函数
这里我们可以清楚的看到,使用的是MD5加密算法,而_hash对于我们来说并没有任何用处,所以我们不需要他,只需要知道这个是MD5加密就行
在知道u()函数具体是做什么的之后,可能会有如下疑惑:
为什么我们在控制台输出u()(定值)后,会需要toString()才能变为密文,我们只需要知道,在js中,实现md5加密后需要加上toString()来完成这一神奇操作,而在python中,只需要简单的进行md5加密后就可以得到与之一样的密文
-
.subString(start: end)
这个就是将字符串进行切片,从start到end,且不包含end,所以我们需要用到的其实只是密文的前16位
进行到这里,我们只是完成了sign加密的第一步,获取到第一次加密的密文,这个密文将会作为第二次加密的明文
第二步
进行完第一步之后,我们需要在他的下一步打上断点:
1.
这里传的参数r就是上一步最后得到的16位的密文
废话不多说,直接进入函数
2.
返回l,继续跟
又回到第一点,由此可知,这个(0, _.$Q) = $Q
且返回函数l,参数为第一步的16位密文
继续跟
3.
到这里,局势已经非常明了,这个第二次加密就是AES加密,前面两步时在对加密的参数进行调整
(1)不管如何变,t一直是最后面那一串字符
(2)将t传入到s()函数,根据多次测试,s函数就是将t进行解编码之后(利用urllib.parse.unquote可以解编码), 再通过字符运算将其转化为16位的字母+数字的字符串,再s()函数的结果擦混入到parse函数,得到加密的key
进入parse函数:
parse的括号里的参数并未起到任何作用,不用管
直接继续跟:
得到这个,经过不同单词测试,这个key也是固定值,一个数组:
[1278502466, 1950627174, 1279473990, 1366766130]
(3)将需要加密的数据和密钥传入AES.encrypt即可得到密文
(4)效果一样,将对象转化为字符串
至此,sign逆向完成,后面我会将js代码和python代码贴出
解密content
观察这段代码,不难发现,这是对翻译接口进行了post请求,后面的&sign就是我们上面得到的sign值,拼接起来进行请求,返回了data值,也就是e
在then中,对e做了处理,所以我们可以判断,content处就是结果的解密处
第一步
给content处打上断点,重新输入spider,发现会在这里断住:
1.
可以看到,和我们预期的一样,e就是返回的加密数据
废话不多说,直接跟
2.
B6返回了f,继续跟
ok,还是回到了第一点,我们继续往下跟
3.
看到这里,解密函数也出来了,又是AES,解密数据是e,也就是返回的密文,密钥key是r,不出意外r是根据t的值进行生成的,跟上面的加密sign值一样,这里的r经过我的测试,生成逻辑和上述一样,只是参数不一样,且为固定值:
[1633773667, 861169273, 1715684717, 1163014963]
在后续,对解密之后的数据进行了解码为utf-8的操作,不仅如此,解密之后还可能出现中文字符序列化的情况,这个时候就需要python的json.loads()
进行转化