搜狗翻译加密原理分析

写在开头,不差钱的建议直接去调用搜狗官方的api,稳定、不会被封、且高并发,也算对官方的支持>

  • 建议先了解下chrome的调试方法:https://www.jianshu.com/p/b25c5b88baf5
  • 工具:chrome
  • 首页https://fanyi.sogou.com/,先看看调用一次翻译需要哪些数据:

第一步:抓包

在这里插入图片描述
在这里插入图片描述

从抓包数据中不难看出,需要一些headers和form data,headers这里不细说,和它没关系,我们主要看加密方式;

实验步骤:
  1. 用python创建一个脚本,把参数什么的copy到脚本里,重放这次请求,没问题,直接返回正确结果;(大家用postman回放也可以,都一样)
  2. form data中要注意的只有s和uuid,其他的不用说,很明显就能看出参数啥意思;
  3. uuid;
  4. 修改s,重放请求,返回错误,说明s值是服务器端要校验的!

步骤二:调式

实验步骤:
  1. 打开开发者工具—>source,可以看到网页加载的资源,那么加密算法一定就在某个js脚本里;

  2. 在上面抓包我们看到了,和s一起发送的数据还有client和uuid等信息,s这个字符搜起来一大堆,所以我们选择在js里搜client效率会高点;

  3. 在source的所有js脚本里挨个搜索client和uuid,依次排查,最终在一个脚本里找到对应的数据:
    在这里插入图片描述
    在这里我们看到,s的值来自J,而J的值来自公式s("" + P + O + M + V),那么POMV这些变量又是咋来的呢?s这个函数又是啥?

  4. 在289行打上断点,重新在搜狗的输入框输入一段话,网页会在断点处停下并显示相关变量的值:
    在这里插入图片描述
    很明显,M是待翻译文本,O是目的语言,P是原始语言,V是一串数值;

  5. 现在的问题重新变为,s()这个函数是什么?V这个数值是什么?

  6. 我们先看V值:
    在这里插入图片描述
    在代码里搜索V(注意打开匹配大小写,效率高些),搜索上一个(在我们的参数构造代码出现前的那一个),发现var V = window.seccode,window.seccode这个值在搜索引擎找了下,没有,那应该就是搜狗自己定义的值了,于是在source的各个js文件里搜索它,在一个js文件里找到了:在这里插入图片描述

发现这个值是写死的,打开无痕浏览,重新打开搜狗搜索,发现里面的window.seccode值一样,说明是个定值,类似于salt;

  1. 现在只剩s(),我们就可以自己计算s = s(’’ + P + O + M + V)的值了;
  2. 我们把js代码格式化下,点击下chrome的括号小图标即可
    在这里插入图片描述
    这样我们搜索s()被定义的地方就方便了,因为js中定义函数要么是s = function(){…} ,要么是function s(){…},所以我们依次搜索s(s =,在同一个文件的同一个函数里发现这个代码:
    (和大家说个搜索小技巧,这里搜索尽量在我们发现data数据那里,搜索上一个,并且s = 优先查看在同一个函数内的s =,这样就可以找到离我们的data代码最近的一个被定义的s,省去了不少事!)
    在这里插入图片描述
    在console里打印下n(50),发现它确实是一个函数!
    在这里插入图片描述
    点一下,跳转到对应的js处,得到s()函数的代码为:
function(t, n) {
       if (void 0 === t || null === t)
            throw new Error("Illegal argument " + t);
       var r = e.wordsToBytes(a(t, n));
       return n && n.asBytes ? r : n && n.asString ? i.bytesToString(r) : e.bytesToHex(r)
}

在console中测试下这个代码:
在这里插入图片描述
发现和我们的data中s值完全一致,且第二个参数可有可无,不影响结果;

9.这样,整个form data数据我们都知道怎么计算了,大家可以用自己的编程语言实现对应的代码即可(其实s()这个函数就是一个md5算法,噗哈哈)

10.都到这一步了,我们可以看看form data里的uuid到底是啥,用搜s()的方法找到uuid,发现uuid = B,搜索B = ,只有俩,发现
在这里插入图片描述
向上搜索o =,得到在这里插入图片描述

在console打印n(16),发现是一个函数,且有get方法,直接调用:在这里插入图片描述

完:其实是今天看了一篇chrome调试的文章(就是开头让你们看的那篇),于是赶紧来练习一遍

发布了130 篇原创文章 · 获赞 105 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/THMAIL/article/details/103872872