当前位置: 首页 > news >正文

金山翻译接口逆向

网址(加密后):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);
  1. (“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()函数的参数是一个定值

  2. 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加密后就可以得到与之一样的密文

  1. .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()进行转化

在这里插入图片描述

http://www.lryc.cn/news/464092.html

相关文章:

  • unified-runtime编译与验证
  • 【Python】最详细--基础语法
  • 二叉树基础:什么样的二叉树适合用数组来存储?
  • iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景
  • Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)
  • 【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》
  • 科研类型PPT的制作技巧
  • rom定制系列------小米6x_MIUI14_安卓13刷机包修改写入以及功能定制 界面预览
  • 线性代数基础02
  • 「4.4」祖孙询问
  • Datawhale 组队学习 文生图 Prompt攻防 task03随笔
  • 游戏投屏软件有哪些?分享这10款比较好用的!
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(下篇):制作小BOSS龙牙哥
  • 顺序表算法题【不一样的解法!】
  • VuePress的基本常识
  • 深入解析Vue2与Vue3的区别与Vue3的提升
  • 认识python数据分析
  • 以太网交换安全:MAC地址漂移与检测(实验:二层环路+网络攻击)
  • NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关
  • 软件测试工程师:如何写出好的测试用例?
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
  • 基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
  • PyTorch 的 DataLoader 类介绍
  • 【设计模式系列】命令模式
  • uniapp中使用lottie实现JSON动画
  • AcWing275
  • Windows系统部署redis自启动服务【亲测可用】
  • 深入了解机器学习 (Descending into ML):线性回归
  • 每日OJ题_牛客_集合_排序_C++_Java
  • 鸿蒙网络编程系列27-HTTPS服务端证书的四种校验方式示例