js逆向-JS加密破解进阶

目录

一、JS逆向进阶一:破解AES加密

(一)AES对称加密算法原理

(二)破解AES加密

(三)实战:发现报告网

二、JS逆向进阶二:破解RSA加密

(一)RSA非对称加密算法原理

(二)破解RSA加密

(三)实战:36氪:破解RSA加密,逆向解析36氪登陆参数

三、JS逆向进阶三:解决多个请求使用相同加密算法的情况

四、JS逆向进阶四:破解参数混合加密

五、JS逆向进阶五:解决密钥需要额外获取的情况

六、JS逆向进阶六:基础JS混淆加密破解


一、JS逆向进阶一:破解AES加密

(一)AES对称加密算法原理

安装一个模块:pip install pycryptodome

# 把明文拆分成 128bits 的部分,如果最后的部分不足128bits,就需要进行 padding(填充)
# 密钥的长度 128bits, 192bits, 256bits
# 长度不固定
# CBC 是最常用的模式,还需要一个128bits 的iv(随机向量)import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad# 加密
def encrypt(plaintext, key, iv):# 三个值均转为二进制形式plaintext = plaintext.encode()key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)# 密文(加密后的文字)(pad:进行填充)ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))# 变为base64的形式ciphertext = base64.b64encode(ciphertext).decode()return ciphertext# 解密
def decrypt(ciphertext, key, iv):ciphertext = base64.b64decode(ciphertext)key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)plaintext = plaintext.decode()return plaintextplaintext = "apple"
key = "0123456789abcdef"
iv = "abcdef0123456789"ciphertext = encrypt(plaintext, key, iv)
print(ciphertext)
plaintext = decrypt(ciphertext, key, iv)
print(plaintext)

(二)破解AES加密

以下为加密数据

添加xhr断点,以下为加密部分的js函数

import base64
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef encrypt(plaintext, key, iv):plaintext = plaintext.encode()key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))# 变为base64的形式ciphertext = base64.b64encode(ciphertext).decode()return ciphertextdef decrypt(ciphertext, key, iv):ciphertext = base64.b64decode(ciphertext)key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)plaintext = plaintext.decode()return plaintextplaintext = "abcd"
key = "0123456789abcdef"
iv = "abcdef0123456789"code = encrypt(plaintext, key, iv)
url = "http://127.0.0.1:5000/api/C14L02"
headers = {"User-Agent": "xxxx","Refer": "http://127.0.0.1:5000/api/C14L02"
}
data = {"code":code
}
res = requests.post(url, headers= headers, data=data)
print(res.json())

(三)实战:发现报告网

发现密码区域为加密数据

添加xhr断点,找到书写加密函数的区域并添加debug断点,放开url的xhr断点,可看到具体的值

在控制台中可看到的时间戳为13位,比要求数据少3位。但是在python中的时间戳time.time()函数刚好为整数部分

data参数中加密函数中:

在控制台查看分析数据

_()函数:md5加密字符串长度不变,经过验证为md5加密。D().ne()函数:因AES加密前后不一致,猜测,现在点进去这个函数

注意:

(1)iv此网站只截取字符串的后16位

(2)在requests发送请求时,此网站data要求转为json格式数据,请求头添加content-type参数不然会报错

(3)python中最终转为了base64格式,网站中的AES加密后为16进制的格式,需要修改一下

import time
import hashlib
import requests
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef encrypt(plaintext, key, iv):plaintext = plaintext.encode()key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))ciphertext = ciphertext.hex()return ciphertextmobile = "19244359876"
password = "WAJ23Aww"
ts = int(time.time())# D().ne("".concat(a).concat(o), _()("".concat(s.slice(3)).concat(a)))plaintext = str(ts) + password
key = mobile[3:] + str(ts)
key = hashlib.md5(key.encode()).hexdigest()
iv = key[-16:]
ciphertext = encrypt(plaintext, key, iv)url = "https://api.fxbaogao.com/mofoun/user/login/byPhoneNumber"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","Refer": "https://www.fxbaogao.com/"
}
data = {"data" : ciphertext,"mobile": mobile,"time": str(ts)
}
data = json.dunmps(data)
res = requests.post(url=url, headers= headers, data=data)
print(res.text)

二、JS逆向进阶二:破解RSA加密

(一)RSA非对称加密算法原理

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto import Random
import base64# 生成key
def genKeys():random_generator = Random.new().readrsa = RSA.generate(2048, random_generator)private_key = rsa.exportKey()public_key = rsa.public_key().exportKey()with open("./C14/rsa_private_key.pem", "wb") as f:f.write(private_key)with open("./C14/rsa_public_key.pem", "wb") as f:f.write(public_key)    def get_key(key_file):with open(key_file, "r") as f:data = f.read()key = RSA.importKey(data)return keydef encrypt(plaintext, public_key):plaintext = plaintext.encode()cipher = PKCS1_cipher.new(public_key)ciphertext = cipher.encrypt(plaintext)ciphertext = base64.b64encode(ciphertext).decode()return ciphertextdef decrypt(ciphertext, private_key):cipher = PKCS1_cipher.new(private_key)ciphertext = base64.b64decode(ciphertext)plaintext = cipher.decrypt(ciphertext, 0).decode()return plaintextpublic_key = get_key("./C14/rsa_public_key.pem")
private_key = get_key("./C14/rsa_private_key.pem")plaintext = "hello"
ciphertext = encrypt(plaintext, public_key)
print(ciphertext)plaintext = decrypt(ciphertext, private_key)
print(plaintext)

(二)破解RSA加密

此处为加密数据部分

xhr断点

import time
import requests
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto import Random
import base64def encrypt(plaintext, public_key):plaintext = plaintext.encode()cipher = PKCS1_cipher.new(public_key)ciphertext = cipher.encrypt(plaintext)ciphertext = base64.b64encode(ciphertext).decode()return ciphertextpublic_key = """xxxxxx"""
public_key = RSA.importKey(public_key)
ts = int(time.time()*1000)
ciphertext = encrypt(str(ts), public_key)
print(ciphertext)url = "http://127.0.0.1:5000/api/C14L05"
headers = {"User-Agent":"xxx","referer":"http://127.0.0.1:5000/C14L05"
}
data = {"code":ciphertext
}
res = requests.post(url, headers=headers, data=data)
print(res.json())

(三)实战:36氪:破解RSA加密,逆向解析36氪登陆参数

此处为加密形式

全局搜索"mobileNo",并打断点查看数据内容

控制台可知,后面部分即为电话号和密码

点击进入,前面的函数的js

由函数可知上方的i即为publickey

import time
import requests
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto import Random
import base64def encrypt(plaintext, public_key):plaintext = plaintext.encode()cipher = PKCS1_cipher.new(public_key)ciphertext = cipher.encrypt(plaintext)ciphertext = base64.b64encode(ciphertext).decode()return ciphertext# 需要带上---部分
public_key = """-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeiLxP4ZavN8qhI+x+whAiFpGWpY9y1AHSQC86qEMBVnmqC8vdZAfxxuQWeQaeMWG07lXhXegTjZ5wn9pHnjg15wbjRGSTfwuZxSFW6sS3GYlrg40ckqAagzIjkE+5OLPsdjVYQyhLfKxj/79oOfjl/lV3rQnk/SSczHW0PEyUbQIDAQAB-----END PUBLIC KEY-----"""
public_key = RSA.importKey(public_key)
ts = int(time.time() * 1000)
mobile = encrypt("19833679937", public_key)
password = encrypt("ssddef", public_key)url = "https://gateway.36kr.com/api/mus/login/byMobilePassword"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","referer":"https://36kr.com/","Content-Type": "application/json"
}
data = {"krtoken" : "","param" : { "countryCode": "86","mobileNo": mobile,"password" : password},"partner_id": "web","timestamp": ts}
data = json.dumps(data)
res = requests.post(url, headers=headers, data=data)
print(res.json())

三、JS逆向进阶三:解决多个请求使用相同加密算法的情况

JS函数如下

书写代码:

如下图可知,多个请求使用相同加密算法

四、JS逆向进阶四:破解参数混合加密

以下为加密数据,全局搜索”acode"

import base64
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef encrypt(plaintext, key, iv):plaintext = plaintext.encode()key = key.encode()iv = iv.encode()cipher =AES.new(key=key, mode=AES.MODE_CBC, iv=iv)ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))ciphertext = ciphertext.b64encode(ciphertext).decode()return ciphertextkey1 = "0123456789abcdef"
key2 = "987654321abcdef"
iv = "abcdef0123456789"ts = int(time.time()*1000)
code = encrypt(str(ts), key1, iv)
acode = hashlib.md5(code.encode()).hexdigest()
bcode = encrypt(code, key2, iv)url = "https://127.0.0.1:5000/api/C14L09"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","referer":"https://127.0.0.1:5000/api/C14L09""Content-Type": "application/json"
}
data = {"timestamp":ts,"acode":acode,"bcode":bcode
}
data = json.dumps(data)
res = requests.post(url, headers=headers, data=data)
print(res.json())

五、JS逆向进阶五:解决密钥需要额外获取的情况

以下位置为加密数据部分

以下为函数部分

如上述函数知,需要获取public_key

import requests
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipherurl = "https://127.0.0.1:5000/api/C14L11/get_key"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","referer":"https://127.0.0.1:5000/api/C14L11"
}
res = requests.post(url, headers=headers)def encrypt(plaintext, public_key):plaintext = plaintext.encode()cipher = PKCS1_cipher.new(public_key)ciphertext = cipher.encrypt(plaintext)ciphertext = base64.b64encode(ciphertext).decode()return ciphertextpublic_key = RSA.importKey(res.text)
code = encrypt("abc123", public_key)url = "https://127.0.0.1:5000/api/C14L11/get_data"
data = {"code": code}
res = requests.post(url, headers=headers, data=data)
print(res.json())

六、JS逆向进阶六:基础JS混淆加密破解

以下为加密函数

在控制台中查看各个函数代表的含义

import time
import random
import requeststimestamp = int(time.time() * 1000)
rand = int(random.random() * 500 + 100)
mySign = str(timestamp) + '-' + str(rand)
print(mySign)url = "https://127.0.0.1:5000/api/C14L12"
headers = {"sign": mySign,"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36","referer":"https://127.0.0.1:5000/api/C14L12"
}
res = requests.get(url, headers=headers)
print(res.json())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架

背景介绍 gRPC 是一种现代开源高性能远程过程调用 (RPC) 可以在任何环境中运行的框架。它可以有效地连接服务 在数据中心内和数据中心之间,具有对负载平衡、跟踪、 运行状况检查和身份验证。它也适用于最后一英里 分布式计算,用于…

P20类神经网络训练不起来怎么办?- 批次和动量

什么是batchsmall batch 和 large batch 的比较 : large batch 更快,small batch 在训练集和测试集上效果效果更好动量的意义和作用: 类似于物理上多了一点惯性,防止困在鞍点。 动量是之前所有梯度的加权和。 1. batch 是什么 …

高压电气是什么

高压电气 电工电气百科 文章目录 高压电气前言一、高压电气是什么二、高压电气的类别三、高压电气的作用原理总结前言 高压电气在电力系统中起着重要的作用,它能够将电能有效地输送和分配到各个用户,为社会和工业生产提供稳定可靠的电力供应。然而,高压电气系统也需要注意安…

Mr_HJ / form-generator项目文档学习与记录(续)

以后主打超融开源社区 (jiangzhicheng88) - Gitee.com render.js就是对vue的render函数的自己简单定制封装。 render.js实现的功能是将json表单中的__config__.tag解析为具体的vue组件; 正常开发流程我们组件输入的时候会触发组件内的 this.$emit(getValue, val)…

PyQt6 安装Qt Designer

前言:在Python自带的环境下,安装Qt Designer,并在PyCharm中配置designer工具。 在项目开发中,使用Python虚拟环境安装PyQt6-tools时,designer.exe会安装在虚拟环境的目录中:.venv\Lib\site-packages\qt6_a…

NPM开发工具的简介和使用方法及代码示例

NPM(Node Package Manager)是Node.js的包管理工具,用于管理和共享被发布到模块仓库的JavaScript代码。本文将介绍NPM的定义、使用方法、代码示例以及总结。 一、NPM的定义 NPM是Node.js的默认包管理工具,它的功能包括安装、管理、…

机器学习算法---回归

1. 线性回归(Linear Regression) 原理: 通过拟合一个线性方程来预测连续响应变量。线性回归假设特征和响应变量之间存在线性关系,并通过最小化误差的平方和来优化模型。优点: 简单、直观,易于理解和实现。…

【日常笔记】notepad++ 正则表达式基本用法

一、场景 二、正则表达式--语法 2.1、学习基本的匹配字符: 2.2、学习特殊字符和量词: 2.3、学习转义字符 2.4、学习分组和捕获 2.5、区分大小写 和 匹配整个单词 2.6、引用分组 三、实战 ▶ 希望把课程目录中 -- 前面的都去掉 一、场景 希望把…

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题 Idea 在升级了2023.3以后,Jrebel 无法以 debug 的模式启动,找了半天,最后在插件主页的评论区找到了解决方案 特此记录一下

Dockerfile:创建镜像,创建自定义的镜像。

Docker的创建镜像的方式: 基于已有镜像进行创建。 根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性的功能还是需要自己定义(进入容器进行操作) 基于模板进…

SpringBoot 基础概念:SpringApplication#getSpringFactoriesInstances

SpringBoot 基础概念&#xff1a;SpringApplication#getSpringFactoriesInstances SpringApplication#getSpringFactoriesInstances SpringApplication#getSpringFactoriesInstances private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,…

在 Spring Boot 中发送邮件简单实现

Spring Boot 对于发送邮件这种常用功能也提供了开箱即用的 Starter&#xff1a;spring-boot-starter-mail。 通过这个 starter&#xff0c;只需要简单的几行配置就可以在 Spring Boot 中实现邮件发送&#xff0c;可用于发送验证码、账户激活等等业务场景。 本文将通过实际的案…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析&#xff1a; 标题手画二次元需要技巧&#xff1a; 二次元高清图片的绘制技巧主要包括以下几点&#xff1a; 线条的运用&#xff1a;在二次元风格的绘画中&#xff0c;线条的运用非常重要。要绘制出流畅、细腻的线条&#xff0c;需…

用于自动驾驶的基于深度学习的图像 3D 物体检测:综述

论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/10017184/ 背景 准确、鲁棒的感知系统是理解自动驾驶和机器人驾驶环境的关键。自动驾驶需要目标的 3D 信息&#xff0c;包括目标的位置和姿态&#xff0c;以清楚地了解驾驶环境。 摄像头传感器因其颜色和…

初识JVM底层知识,一文读懂JVM知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

nginx反向代理实践指南:访问Tomcat

目录 前言1 实现的效果2 访问流程分析3 安装tomcat并测试4 配置4.1 在Windows系统的hosts文件进行域名和IP对应关系的配置4.2 在NGINX进行请求转发的配置&#xff08;反向代理配置&#xff09; 5 最终测试结论 前言 从Windows系统访问Tomcat Web应用程序&#xff0c;设置和配置…

VUE-脚手架搭建

文章目录 一、概述二、前提准备1. 安装 node-js2. npm 镜像设置3. 安装 vs-code 三、脚手架搭建1. Vue-2 搭建1. Vue-3 搭建 一、概述 官网&#xff1a;http://cn.vuejs.org/ vue 有两个大版本&#xff0c;分别是 vue-2 和 vue-3&#xff0c;目前新项目的话用 vue-3 的会比较多…

Elasticsearch 进阶(索引、类型、字段、分片、副本、集群等详细说明)-06

笔记来源&#xff1a;Elasticsearch Elasticsearch进阶 进阶-核心概念 索引Index 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字…

RT-DETR 图片目标计数 | 特定目标进行计数

全类别计数特定类别计数如何使用 RT-DETR 进行对象计数 有很多同学留言说想学 RT-DETR 目标计数。那么今天这篇博客,我将教大家如何使用 RT-DETR 进行对象计数。RT-DETR 是一种非常强大的对象检测模型,它可以识别图像中的各种对象。我们将学习如何利用这个模型对特定对象进行…

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest, ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…