【JS 逆向百例】cnki 学术翻译 AES 加密分析

关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶、JS/安卓逆向等技术干货!
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标
- 目标:cnki 学术翻译 AES 加密
- 主页:
aHR0cHM6Ly9kaWN0LmNua2kubmV0L2luZGV4 - 接口:
aHR0cHM6Ly9kaWN0LmNua2kubmV0L2Z5enMtZnJvbnQtYXBpL3RyYW5zbGF0ZS9saXRlcmFsdHJhbnNsYXRpb24= - 逆向参数:Request Payload:
words: "kufhG_UJw_k3Sfr3j0BLAA=="
逆向过程
本期逆向素材来源于K哥爬虫交流群里某位群友的求助,目标是 cnki 学术翻译,粉丝想实现两个功能:1、突破英文1000个字符的限制;2、逆向加密过程。

来到翻译首页,抓包定位到翻译接口,可以看到 Request Payload 里,待翻译文本会被加密处理,如下图所示:

这里如果直接搜索关键字 words,会发现结果非常多,不太好找,注意到 Payload 参数里还有个 translateType,那么就可以直接搜索 translateType,因为这两个参数一般都是挨着的,当然也可以使用 XHR 断点的方式来找,只不过麻烦一些,搜索结果都在 app.9fb42bb0.js 里,注意到最后一个结果里有 encrypto,加密的意思,基本上就是加密的地方了:

控制台打印一下 (0, h.encrypto)(this.inputWord),正是加密结果:

继续跟进一下 h.encrypto,很明显的 AES 加密,n = "4e87183cfd3a45fe",n 就是 key,模式 ECB,填充 Pkcs7,最后做了一些字符串的替换处理,如下图所示:

知道了加密算法,key 等关键参数,那么直接引用 crypto-js 模块来实现就 OK 了,JavaScript 代码如下:
// 引用 crypto-js 加密模块
var CryptoJS = require('crypto-js')
function s(t) {
var n = "4e87183cfd3a45fe"
var e = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}
, i = CryptoJS.enc.Utf8.parse(n)
, s = CryptoJS.AES.encrypt(t, i, e)
, r = s.toString().replace(/\//g, "_");
return r = r.replace(/\+/g, "-"),
r
}
console.log(s("测试"))
// kufhG_UJw_k3Sfr3j0BLAA==
使用 Python 翻译的一个小 demo:
# ==================================
# --*-- coding: utf-8 --*--
# @Time : 2021-11-05
# @Author : 微信公众号:K哥爬虫
# @FileName: cnki.py
# @Software: PyCharm
# ==================================
import execjs
import requests
token_url = "https://dict.cnki.net/fyzs-front-api/getToken"
translation_api = "https://dict.cnki.net/fyzs-front-api/translate/literaltranslation"
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
session = requests.session()
def get_token():
headers = {"User-Agent": UA}
response = session.get(url=token_url, headers=headers).json()
token = response["data"]
return token
def get_encrypted_word(word):
with open('cnki_encrypt.js', 'r', encoding='utf-8') as f:
cnki_js = f.read()
encrypted_word = execjs.compile(cnki_js).call('s', word)
return encrypted_word
def get_translation_result(encrypted_word, token):
payload = {
"translateType": None,
"words": encrypted_word
}
headers = {
"Token": token,
"User-Agent": UA
}
response = session.post(url=translation_api, headers=headers, json=payload).json()
result = response["data"]["mResult"]
return result
def main():
word = input("请输入待翻译字符串: ")
token = get_token()
encrypted_word = get_encrypted_word(word)
result = get_translation_result(encrypted_word, token)
print("翻译结果为: ", result)
if __name__ == "__main__":
main()
粉丝还有一个问题就是字符数限制问题,看能不能突破,实测英文限制1000字符,中文限制500字符,如下图所示:

这种限制其实大概率不仅仅是前端的限制,服务端应该也是有限制的,我们可以携带超过500字符的中文去请求一下,前面的字符是“测试1”,最后三个字符是“测试2”,此时已超过了500个字符,我们看到翻译结果里并没有出现 Test 2,所以想要翻译很多字符串,只能将其分割成几份来处理了。


【JS 逆向百例】cnki 学术翻译 AES 加密分析的更多相关文章
- JS逆向实战10——某集团RSA长加密
由于本网站较为特殊 目标网站加密与其他稍有不同 目标网站 68747470733a2f2f65632e6d696e6d6574616c732e636f6d2e636e2f6f70656e2f686f6 ...
- JS逆向实战12——某店 captchaToken 参数 加密
今天爬取的是网站需要模拟登陆 目标网站 aHR0cHM6Ly9wYXNzcG9ydC55aGQuY29tL3Bhc3Nwb3J0L2xvZ2luX2lucHV0LmRv 浏览器抓包分析 随便输入一堆假 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- js逆向之AES加密
故事背景: 在获取某网站接口数据时,发现其请求的 headers 中的参数 使用了 AES算法加密 ,并对其进行校验,在此简单记录下自己的踩坑历程. AES简介: 高级加密标准(AES,Advance ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- 网络爬虫之记一次js逆向解密经历
1 引言 数月前写过某网站(请原谅我的掩耳盗铃)的爬虫,这两天需要重新采集一次,用的是scrapy-redis框架,本以为二次爬取可以轻松完成的,可没想到爬虫启动没几秒,出现了大堆的重试提示,心里顿时 ...
- 通过JS逆向ProtoBuf 反反爬思路分享
前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...
- JS逆向实战3——AESCBC 模式解密
爬取某省公共资源交易中心 通过抓包数据可知 这个data是我们所需要的数据,但是已经通过加密隐藏起来了 分析 首先这是个json文件,我们可以用请求参数一个一个搜 但是由于我们已经知道了这是个json ...
- JS逆向之补环境过瑞数详解
JS逆向之补环境过瑞数详解 "瑞数" 是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!! 好在现在网上有很多讲解瑞数 ...
- JS逆向之浏览器补环境详解
JS逆向之浏览器补环境详解 "补浏览器环境"是JS逆向者升职加薪的必备技能,也是工作中不可避免的操作. 为了让大家彻底搞懂 "补浏览器环境"的缘由及原理,本文将 ...
随机推荐
- CXF WebService 授权&动态调用
SpringBoot WebService 源代码:https://gitee.com/VipSoft/VipWebService 服务端添加拦截器 import org.apache.cxf.bin ...
- MyBatis-Plus (SpringBoot2 版)看这篇就足够了,一发入魂
1.了解 Mybatis-plus 1.1.Mybatis-Plus 介绍 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简 ...
- Codeforces Round #623 (Div. 2) A~D题,D题multiset使用
比赛链接:Here 1315A. Dead Pixel 签到题, 比较四个值 max(max(x, a - 1 - x) * b, a * max(y, b - 1 - y)) 1315B. Home ...
- S3C2440移植uboot之支持NAND启动
上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动. 目录 1.去掉 "-pie ...
- freeswitch APR库内存池
概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. apr库中的大部分API都需要依赖于内存池,使用内存池简化内存管理,提高内存分配效率,减少内存操作中出错的概 ...
- java进阶(5)--package与import
一.package 1.package的作用:为了方便程序的管理 2.package怎么使用:package+包名,只能出现在java代码的第一行 3.package命令规范:一般采用公司域名倒序方式 ...
- Android Emulator 画面闪烁
Android 虚拟机经常会出现画面闪烁,可以通过修改设置解决. 打开虚拟机之后,点击 "..." 按钮.按照下图改为 "D3D11",冷重启虚拟机就好了.
- off-policy RL | Advantage-Weighted Regression (AWR):组合先前策略得到新 base policy
论文题目:Advantage-Weighted Regression: Simple and Scalable Off-Policy Reinforcement Learning,ICLR 2020 ...
- 【中介者模式(Mediator)】使用Java实现中介者模式
引言 中介者,何为中介者,顾名思义就是我们的在处理A和B之间的关系的时候,引入一个中间人,来处理这两者之间的关系,例如生活中我们需要去租房,买房,都会有中介,来处理房东和租客之间的协调关系,这个就是中 ...
- ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证
ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证 背景 周末分析了 SQLServer mysql等数据库 想着继续分析一下oracle数据库 这边oracle使用的 ...