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

pyexecjs原生js加密算法逆向

 查看必要参数,得知sign签名

 

从堆栈自上到下依次查找源代码

如下图,找到后打上断点,得知e是输入的参数,说明b()是一个加密函数,点击进入查看底层函数

把1117这个函数内的三个方法CV到python中的一个js文件中,使用pyexecjs进行处理即可得到算法结果

 三个方法函数代码如下js:

function e(t, e) {(null == e || e > t.length) && (e = t.length);for (var n = 0, r = new Array(e); n < e; n++)r[n] = t[n];return r
}function n(t, e) {for (var n = 0; n < e.length - 2; n += 3) {var r = e.charAt(n + 2);r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),r = "+" === e.charAt(n + 1) ? t >>> r : t << r,t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r}return t
}var r = null;function xx(t) {var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);if (null === i) {var a = t.length;a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))} else {for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++)"" !== s[c] && l.push.apply(l, function (t) {if (Array.isArray(t))return e(t)}(o = s[c].split("")) || function (t) {if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])return Array.from(t)}(o) || function (t, n) {if (t) {if ("string" == typeof t)return e(t, n);var r = Object.prototype.toString.call(t).slice(8, -1);return "Object" === r && t.constructor && (r = t.constructor.name),"Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0}}(o) || function () {throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c !== u - 1 && l.push(i[c]);var p = l.length;p > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + l.slice(-10).join(""))}for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = '320305.131321201' || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {var _ = t.charCodeAt(v);_ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),g[y++] = _ >> 18 | 240,g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,g[y++] = _ >> 6 & 63 | 128),g[y++] = 63 & _ | 128)}for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)b = n(b += g[x], w);return b = n(b, k),(b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),result = "".concat((b %= 1e6).toString(), ".").concat(b ^ f);return result;  // 返回结果
}

 上面是修改后的sj代码,如自己声明了xx()函数名,return 返回了一个结果。

参考图: 

d参数在控制台输出,gtk

window.gtk 可以在右键查看页面源代码中搜索gtk得到值

 进行替换

很多固定参数在js中找不到,就可以去查看页面源代码搜一下试试看。

 python代码:

# pip install pyexecjs# print(execjs.get().name)    # 当前运行时环境# import subprocess
# from functools import partial
#
# subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
#
# import execjs
#
# # 运行JavaScript代码
# result = execjs.eval("""
#     '马超_猴子_妲己_鲁班'.split('_')
# """)
#
# print(result)
#
# # compile() 加载一段js代码,通过call来访问这一段代码中的函数
# js = """
# function fn(a,b){
#     return a + b
# }
# function fn2(a,b){
#     return a * b
# }
# """
# a = execjs.compile(js)
# # 调用js中的函数
# ret = a.call('fn2', 10, 20)
# print(ret)
import json
import os
import requests
from pathlib import Path
import execjs
from fake_useragent import UserAgenturl = 'https://fanyi.baidu.com/v2transapi'
headers = {'User-Agent': UserAgent().random,"Cookie": '你的cookie'
}def fanyi(query):sign = get_sign(query)data = {'query': query,"from": "zh","to": "en","transtype": "enter","simple_means_flag": "3","sign": sign,"token": "你的token","domain": "common"}resp = requests.post(url, data=data, headers=headers)assert resp.status_code == 200dict_ret = json.loads(resp.text)try:ret = dict_ret['trans_result']['data'][0]['dst']return retexcept Exception as e:return edef get_sign(query):# 获取项目根目录BASE_DIR = Path(__file__).resolve().parents[1]# 构建文件路径file_path = os.path.join(BASE_DIR, 'utils', 'baidufanyi.js')f = open(file_path, mode='r', encoding='utf-8')# 加载js代码r = execjs.compile(f.read())# 调用(函数,参数)sign = r.call('xx', query)return signif __name__ == '__main__':print(fanyi('black'))

方法二:

"""
应用:百度翻译
urllib.request.Request
urllib.request.urlopen()
urllib.parse.urlencode()from表单参数
from: en: 表示源语言是英语(English)。
to: zh: 表示目标语言是中文(Chinese)。
query: apple: 表示要翻译的文本是 "apple"。
transtype: enter: 表示翻译类型是 "enter"。
simple_means_flag: 3: 表示简单翻译的标志,值为 3。
sign: 704513.926512: 表示请求的签名,可能是对其他参数的加密或哈希值。
token: bee1010145f198658719e143523967bf: 表示请求的令牌。
domain: common: 表示请求的领域是 "common"。
ts: 1702257690756: 表示请求的时间戳。
"""
import json
from urllib.request import Request, urlopen
from urllib.parse import quote, urlencodefrom fake_useragent import FakeUserAgenturl = 'https://fanyi.baidu.com/v2transapi'
headers = {'User-Agent': FakeUserAgent().random,"Cookie": "你的cookie"
}def fanyi(query):sign = calculate_sign(query)data = {'query': query,"from": "zh","to": "en","transtype": "translang","simple_means_flag": "3","sign": sign,"token": "11c16a562f2de40546a9f27f22f2b17d","domain": "common"}# Request()中的data参数是byte类型req = Request(url, data=urlencode(data).encode('utf-8'), headers=headers)resp = urlopen(req)assert resp.code == 200json_data = resp.read()content_encode = resp.getheader('Content-Type')content_encode = 'utf-8' if content_encode is None else content_encode.split('=')[-1]dict_ret = json.loads(json_data.decode('utf-8'))# print(dict_ret)try:ret = dict_ret['trans_result']['data'][0]['dst']return retexcept Exception as e:return '获取失败'"""
签名(sign)通常是通过对请求的关键参数进行加密或哈希运算而生成的,以确保请求的完整性和安全性。
签名的生成方式通常由服务端规定,并且在请求中包含签名参数。以下是一般的签名生成流程:获取待签名字符串: 将请求中的关键参数按照一定规则组织成一个字符串。进行加密或哈希运算: 将待签名字符串使用特定的算法进行加密或哈希运算,生成签名值。将签名值添加到请求参数中: 将生成的签名值作为请求的一部分,传递给服务端。
"""
# import hashlib
#
#
# def generate_signature(params, secret_key):
#     # 将参数按照特定规则排序并拼接成字符串
#     sorted_params = sorted(params.items())
#     concatenated_string = '&'.join([f"{key}={value}" for key, value in sorted_params])
#
#     # 将密钥拼接到待签名字符串末尾
#     concatenated_string += secret_key
#
#     # 使用 SHA256 算法生成签名
#     signature = hashlib.sha256(concatenated_string.encode()).hexdigest()
#
#     return signatureimport re
import mathdef translate_encrypt(text):i = "320305.131321201"o = re.findall(r'[\uD800-\uDBFF][\uDC00-\uDFFF]', text)if not o:t = len(text)if t > 30:text = text[:10] + text[math.floor(t / 2) - 5: math.floor(t / 2) + 5] + text[-10:]else:e = re.split(r'([\uD800-\uDBFF][\uDC00-\uDFFF])', text)S = []for C in range(len(e)):if e[C] != "":S.extend(list(e[C]))if C != len(e) - 1:S.append(o[C])g = len(S)if g > 30:text = ''.join(S[:10]) + ''.join(S[math.floor(g / 2) - 5: math.floor(g / 2) + 5]) + ''.join(S[-10:])u = "320305.131321201" if i is None else id = u.split(".")m = int(d[0]) if d[0] else 0s = int(d[1]) if d[1] else 0S = []for v in range(len(text)):A = ord(text[v])if A < 128:S.append(A)else:if 2048 > A:S.append(A >> 6 | 192)else:if 55296 == (64512 & A) and v + 1 < len(text) and 56320 == (64512 & ord(text[v + 1])):A = 65536 + ((1023 & A) << 10) + (1023 & ord(text[++v]))S.append(A >> 18 | 240)S.append(A >> 12 & 63 | 128)else:S.append(A >> 12 | 224)S.append(A >> 6 & 63 | 128)S.append(63 & A | 128)p = mF = "+-a^+6"D = "+-3^+b+-f"for b in range(len(S)):p += S[b]p = n(p, F)p = n(p, D)p ^= sif p < 0:p = (2147483647 & p) + 2147483648p %= 1e6return f"{int(p)}." + str(int(p) ^ m)def n(r, o):t = 0while t < len(o) - 2:a = ord(o[t + 2])a = a - 87 if a >= ord('a') else int(o[t + 2])a = r >> a if o[t + 1] == '+' else r << ar = r + a & 4294967295 if o[t] == '+' else r ^ at += 3return rdef calculate_sign(text):return translate_encrypt(text)if __name__ == '__main__':# text_to_translate = '你好世界'# sign = calculate_sign(text_to_translate)# print(sign)print(fanyi('苹果'))

相关文章:

pyexecjs原生js加密算法逆向

查看必要参数&#xff0c;得知sign签名 从堆栈自上到下依次查找源代码 如下图&#xff0c;找到后打上断点&#xff0c;得知e是输入的参数&#xff0c;说明b()是一个加密函数&#xff0c;点击进入查看底层函数 把1117这个函数内的三个方法CV到python中的一个js文件中&#xff0c…...

数据结构Java版(4)——链表

一、概述 链表是一种常见的数据结构&#xff0c;用于存储一系列具有相同类型的数据元素。它由多个节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同&#xff0c;它的节点在内存中不是连续存储的&#xff0c;而是通过每个节点中的指针…...

cfssl简单使用

1、安装 方式1&#xff1a;直接下载 详见&#xff1a;手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl&#xff1a;用于签发证书 # cfssljson&#xff1a;将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo&#xff1a;验…...

基于Word2vec词聚类的关键词实现

一.基于Word2vec词聚类的关键词步骤 基于Word2Vec的词聚类关键词提取包括以下步骤&#xff1a; 1.准备文本数据&#xff1a;收集或准备文本数据&#xff0c;可以是单一文档或文档集合&#xff0c;涵盖关键词提取的领域。2.文本预处理&#xff1a;清洗文本数据&#xff0c;去除…...

开源项目_大模型应用_Chat2DB

1 基本信息 项目地址&#xff1a;https://github.com/chat2db/Chat2DBStar&#xff1a;10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具&#xff0c;适用于各种数据库。 对于那些平时会用到数据库&#xff0c;但又不是数据库专家的程序员来说&#xff0c;…...

【线性代数与矩阵论】范数理论

范数理论 2023年11月16日 文章目录 范数理论1. 向量的范数2. 常用向量范数3. 向量范数的等价性4. 矩阵的范数5. 常用的矩阵范数6. 矩阵范数与向量范数的相容性7. 矩阵范数诱导的向量范数8. 由向量范数诱导的矩阵范数9. 矩阵范数的酉不变性10. 矩阵范数的等价性11. 长方阵的范数…...

【C++】priority_queue模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章旨在记录博主在模…...

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案

你们好&#xff0c;我是金金金。 场景 之前都是好好的&#xff0c;不知道今天为什么提交代码就这样了 排查 根据英文可以看出&#xff0c;ssh端口号被拒绝了&#xff0c;22号端口不行&#xff0c;那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件&#xff…...

Java调用WebService接口,SOAP协议HTTP请求返回XML对象

Java调用Web service接口SOAP协议HTTP请求&#xff0c;解析返回的XML字符串&#xff1a; 1. 使用Java的HTTP库发送SOAP请求&#xff0c;并接收返回的响应。 可以使用Java的HttpURLConnection、Apache HttpClient等库。 2. 将返回的响应转换为字符串。 3. 解析XML字符串&…...

Django框架二

一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient&#xff0c;mysqlclient版本最好在13.13以上 pip3 install mysqlclient DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: "mysite1",USER:root,PASSWO…...

工业相机与镜头参数及选型

文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离&#xff08;Worki…...

VSCode使用Makefile Tools插件开发C/C++程序

提起Makefile&#xff0c;可能有人会觉得它已经过时了&#xff0c;毕竟现在有比它更好的工具&#xff0c;比如CMake&#xff0c;XMake&#xff0c;Meson等等&#xff0c;但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的&#xff0c;可以说Makefile是基石…...

用C语言验证“三门定理”

#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <time.h>// 一个源自博弈论的数学游戏问题&#xff1a; // 参赛者会看见三扇门&#xff0c; // 其中一扇门的里面有一辆汽车&#xff0c; // 选中里面是汽车的那扇门&#xff0…...

计算机网络-分层结构,协议,接口,服务

文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决&#xff0c;也就分层解决 怎样分层 每层相互独立&#xff0c;每层做的工作不同 界面自然清晰&#xff0c;层与层之间的接口能够体现…...

前端开发 2: CSS

在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页样式的语言。它控制着网页的布局、颜色、字体等外观效果。在本篇博客中&#xff0c;我将为你介绍 CSS 的基础知识和常用技巧&#xff0c;帮助你更好地掌握前端开发中的样式设计。 CSS 基础知…...

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

文章目录 一 、硬件介绍二 、实验&#xff1a;LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1&#xff1a;面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3&#xff1a;蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、…...

HackTheBox - Medium - Linux - Noter

Noter Noter 是一种中型 Linux 机器&#xff0c;其特点是利用了 Python Flask 应用程序&#xff0c;该应用程序使用易受远程代码执行影响的“节点”模块。由于“MySQL”守护进程以用户“root”身份运行&#xff0c;因此可以通过利用“MySQL”的用户定义函数来利用它来获得RCE并…...

Uniapp多选Popup(弹出层)

uniapp中多选组件很少&#xff0c;故个人简单开发了一个&#xff0c;可简单使用&#xff0c;也可根据个人需求稍微改进 支持的功能 单选多选&#xff08;默认&#xff09;限制选择数量默认选中禁用选项 属性说明 属性默认值说明singlefalsetrue为开启单选&#xff0c;否则为…...

什么是网络安全?网络安全概况

网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施&#xff0c;旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面&#xff0c;包括但不限于信息安全、应用程序安全、操作系统安全等 …...

c语言小游戏之扫雷

目录 一&#xff1a;游戏设计理念及思路 二&#xff1a;初步规划的游戏界面 三&#xff1a;开始扫雷游戏的实现 注&#xff1a;1.创建三个文件&#xff0c;test.c用来测试整个游戏的运行&#xff0c;game.c用来实现扫雷游戏的主体&#xff0c;game.h用来函数声明和包含头文…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...