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

Python突破JS加密限制,进行逆向解密

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

目录标题

      • 前言
      • 开发环境:
      • 模块使用:
      • 逆向目标
      • 逆向过程
      • 参数 JS 加密关键代码
      • Python 登录关键代码
      • 尾语 💝

开发环境:

  • Python 3.8

  • Pycharm

模块使用:

  • time >>> 时间模块,属于内置,无需安装

  • re >>> 用于生成随机数,属于内置,无需安装

  • requests >>> 主要用来发 送 HTTP 请求,属于内置,无需安装

  • execjs >>> 用来在python中运行js代码的库,第三方,需要安装

第三方模块安装:

win + R 输入cmd 输入安装命令 或 在pycharm中点击Terminal(终端) 输入安装命令

如果出现爆红, 可能是因为 网络连接超时, 可切换国内镜像源,命令如下:

pip install -i https://pypi.doubanio.com/simple/ requests

逆向目标

目标:某 7 网游登录

主页:aHR0cHM6Ly93d3cuMzcuY29tLw==

接口:aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA==

逆向参数:Query String Parameters:password: SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=

逆向过程

抓包分析

来到某 7 网游首页,随便输入一个账号密码,点击登陆,

抓包定位到登录接口为 aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA== ,GET 请求:

分析一下 Query String Parameters 里的主要参数:

callback 是一个回调参数,这个参数的值不影响请求结果,它的格式为 jQuery + 20位数字 + _ + 13位时间戳,使用 Python 很容易构建:

import time
import randomtimestamp = str(int(time.time() * 1000))
jsonp = ''
for _ in range(20):jsonp += str(random.randint(0, 9))
callback = 'jQuery' + jsonp + '_' + timestamp
print(callback)

login_account 是登录的账户名;

password 是加密后的密码;

_ 是13位时间戳。

参数逆向

需要我们逆向的参数就只有一个 password,

我们尝试直接全局搜索此关键字,会发现出来的结果非常多,不利于分析,

这里就有一个小技巧,加个等号,搜索 password=,这样就极大地缩短了查找范围,当然也可以搜索 password:,

也可以在关键字和符号之间加个空格,还可以搜索 var password 等,这些都是可以尝试的,要具体情况具体分析,一种没有结果就换另一种。

在本案例中,我们搜索 password=,在 sq.login2015.js 文件里可以看到语句 h.password = td(f),

疑似密码加密的地方,在此处埋下断点进行调试,可以看到返回的值确实是加密后的密码:


继续跟进 td 函数,可以看到是用到了一个自写的 RSA 加密,很简单明了,我们直接将其复制下来使用 Python 调用即可:

完整代码直接文末名片自取即可

参数 JS 加密关键代码

var ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function __rsa(str) {var out, i, len;var c1, c2, c3;len = str.length;i = 0;out = "";while (i < len) {c1 = str.charCodeAt(i++) & 0xff;if (i == len) {out += ch.charAt(c1 >> 2);out += ch.charAt((c1 & 0x3) << 4);out += "==";break}c2 = str.charCodeAt(i++);if (i == len) {out += ch.charAt(c1 >> 2);out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));out += ch.charAt((c2 & 0xF) << 2);out += "=";break}c3 = str.charCodeAt(i++);out += ch.charAt(c1 >> 2);out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));out += ch.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));out += ch.charAt(c3 & 0x3F)}return out
}function getEncryptedPassword(a) {var maxPos = ch.length - 2, w = [];for (i = 0; i < 15; i++) {w.push(ch.charAt(Math.floor(Math.random() * maxPos)));if (i === 7) {w.push(a.substr(0, 3))}if (i === 12) {w.push(a.substr(3))}}return __rsa(w.join(""))
}// 测试样例
// console.log(getEncryptedPassword("34343434"))

Python 登录关键代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import time
import randomimport execjs
import requestslogin_url = '脱敏处理,完整代码领取V:Pytho8987'def get_encrypted_password(password):with open('encrypt.js', 'r', encoding='utf-8') as f:www_37_js = f.read()encrypted_pwd = execjs.compile(www_37_js).call('getEncryptedPassword', password)return encrypted_pwddef login(username, encrypted_password):timestamp = str(int(time.time() * 1000))jsonp = ''for _ in range(20):jsonp += str(random.randint(0, 9))callback = 'jQuery' + jsonp + '_' + timestampparams = {'callback': callback,'action': 'login','login_account': username,'password': encrypted_password,'ajax': 0,'remember_me': 1,'save_state': 1,'ltype': 1,'tj_from': 100,'s': 1,'tj_way': 1,'_': timestamp}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36','sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"'}response = requests.post(url=login_url, headers=headers, params=params)print(response.text)def main():username = input('请输入登录账号: ')password = input('请输入登录密码: ')encrypted_password = get_encrypted_password(password)login(username, encrypted_password)if __name__ == '__main__':main()

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

相关文章:

Python突破JS加密限制,进行逆向解密

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录标题 前言开发环境:模块使用:逆向目标逆向过程参数 JS 加密关键代码Python 登录关键代码尾语 &#x1f49d; 开发环境: Python 3.8 Pycharm 模块使用: time >>> 时间模块&#xff0c;属于内置&#xff0c;无…...

【Linux】exec函数族

目录 1、exec函数族的介绍2、exec相关函数 1、exec函数族的介绍 2、exec相关函数 #include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ ); /* - path 需要指定的执行的文件的路径或者名称&#xff0c;相对路径or绝对路径- arg …...

OSQP二次规划求解库使用说明

OSQP二次规划求解库使用说明 贺志国 2023.5.10 1. 凸二次规划的一般表达式 m i n 1 2 x T P x q T x s . t . l ≤ A x ≤ u min \quad \frac{1}{2}x^T Px q^Tx \qquad s.t. \quad l \leq Ax \leq u min21​xTPxqTxs.t.l≤Ax≤u 其中&#xff0c; P P P称为内核矩阵&#x…...

Elasticsearch(一)

Elasticsearch&#xff08;一&#xff09; 初始elasticsearch 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速查找到需要的内容 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&…...

深入探究Java中的枚举类型:定义、特性和应用

引言&#xff1a; 在Java编程中&#xff0c;枚举类型是一种强大而灵活的工具&#xff0c;用于定义一组具名的常量。它不仅提供了代码可读性和可维护性的优势&#xff0c;还为开发人员提供了一种更安全和结构化的方式来处理固定的常量集合。本文将深入探讨Java中的枚举类型&…...

linux密码忘了?一招解决

目录 一、前言 二、进入编辑界面 三、单用户模式 四、修改密码 五、更新信息 六、退出 七、验证 一、前言 版本&#xff1a;centos7.9、VMware15.5 在我们学习linux运行级别的时候&#xff0c;面试题可能会出如何找回root密码&#xff0c;下面来详细的介绍一波&#xff…...

苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具

CleanMyMac X for mac是MacOS上一款Mac清理优化工具&#xff0c;不仅包含各种清理功能&#xff0c;更是具有卸载器、维护、扩展、碎纸机这些实用功能&#xff0c;可以同时代替很多工具。它可以清理&#xff0c;优化&#xff0c;保养和监测您的电脑&#xff0c;确保您的Mac运行…...

FPGA实现Cordic算法求解arctan和sqr(x*2 + y* 2)

一. 简介 由于在项目中需要使用的MPU6050&#xff0c;进行姿态解算&#xff0c;计算中设计到**arctan 和 sqr(x2 y 2),**这两部分的计算&#xff0c;在了解了一番之后&#xff0c;发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。另外也可以一次性求出sin和cos的…...

【最终截稿 | Springer 独立出版 | EI稳定检索】 2023年绿色建筑国际会议(ICoGB 2023)

会议简介 Brief Introduction 2023年绿色建筑国际会议(ICoGB 2023) 会议时间&#xff1a;2023年5月21日-23日 召开地点&#xff1a;瑞典斯德哥尔摩 大会官网&#xff1a;www.icogb.org ICoGB 2023将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为研究人员、工程师、专家学…...

Flutter常用状态管理框架及优缺点

Flutter 中常见的状态管理框架有以下几种&#xff1a; Provider&#xff1a; Provider 是一个轻量级的状态管理框架&#xff0c;可用于单个 Widget 或整个 Widget 树中分发状态。它通过 InheritedWidget 和 ChangeNotifier 来实现状态管理&#xff0c;并支持依赖项注入。Redux…...

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题&#xff0c;因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录&#xff0c;通常在 /opt/intel 文件夹下&#xff0c; cd /opt/intel/openvino_2021/openvino_…...

浏览器存储技术:localStorage、sessionStorage和cookie的区别

随着互联网技术的不断发展&#xff0c;人们越来越依赖浏览器进行网页浏览和数据处理。浏览器存储技术是Web开发中非常重要的一部分&#xff0c;它可以帮助我们在浏览器端存储数据&#xff0c;而无需将数据传输到服务器。本文将介绍三种常见的浏览器存储技术&#xff1a;localSt…...

MySQL中的内连接和外连接

一、MySQL内连接&#xff08;INNER JOIN&#xff09; 内连接&#xff0c;又称为等值连接&#xff0c;是最常见的连接类型。它根据两个&#xff08;或多个&#xff09;表中具有相同列值的行来创建一个新的结果表。在内连接中&#xff0c;只有通过连接条件匹配的行才会被包含在结…...

node学习手册

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;使 JavaScript 可以脱离浏览器环境运行在服务端。它提供了一组 API&#xff0c;可以让开发者轻松地进行服务器端编程。 以下是 Node.js 的学习手册&#xff1a; 安装 Node.js 首先&#xff0c;需要在官网…...

Java中的JSP是什么?如何实现JSP

JavaServer Pages&#xff08;JSP&#xff09;是一种Java技术&#xff0c;可以用于开发动态Web应用程序。它允许开发人员将Java代码嵌入到HTML页面中&#xff0c;以便生成动态内容。本文将介绍JSP的工作原理&#xff0c;以及如何在Java中实现JSP。 JSP的工作原理 JSP的工作原…...

c++之函数对象和谓词

目录 函数对象&#xff1a; 谓词&#xff1a; 一元谓词函数举例如下 二元谓词举例如下 函数对象和函数的区别 一元谓词的案例 二元函数对象案例 二元谓词案例 函数对象&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff08;function obj…...

《Andorid开源》greenDao 数据库orm框架

一 前言&#xff1a;以前没用框架写Andorid的Sqlite的时候就是用SQLiteDatabase &#xff0c;SQLiteOpenHelper ,SQL语句等一些东西&#xff0c;特别在写SQL语句来进行 数据库操作的时候是一件很繁琐的事情&#xff0c;有时候没有错误提示的&#xff0c;很难找到错误的地方&a…...

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …...

MongoDB:Win/Linux环境安装及一键部署脚本

1. Win安装 1.1 下载 MongoDB 安装程序 访问 MongoDB 官网&#xff0c;进入下载页面&#xff1a;Download MongoDB Community Server | MongoDB 选择 Windows 平台并下载最新版的 MongoDB 安装程序。 1.2 安装 MongoDB 双击安装程序&#xff0c;按照提示完成 MongoDB 的安装…...

KingbaseES V8R3 集群运维系列 -- failover切换后集群自动恢复

​ 案例说明&#xff1a; KingbaseES V8R3集群默认在触发failover切换后&#xff0c;为保证数据安全&#xff0c;原主库需要通过人工介入后&#xff0c;恢复为新的备库加入到集群。在无人值守的现场环境&#xff0c;需要在触发failover切换后&#xff0c;主库可以自动恢复为新备…...

【Selenium中】——全栈开发——如桃花来

目录索引 查找元素&#xff1a;查找方法&#xff1a;单个元素查找&#xff1a;多个元素查找&#xff1a;*代码演示&#xff1a;* 元素交互操作&#xff1a;清空文字&#xff1a; 推荐的变量名定义名称&#xff1a;执行JavaScript &#xff1a;滚动页面方法&#xff1a;*滚动到底…...

Sarsa增强版之Sarsa-λ依然走迷宫

Sarsa-λ&#xff08;Sarsa Lambda&#xff09;是Sarsa算法的一种变体&#xff0c;其中“λ”表示一个介于0和1之间的参数&#xff0c;用于平衡当前状态和之前所有状态的重要性。 Sarsa算法是一种基于Q-learning算法的增量式学习方法&#xff0c;通过在实际环境中不断探索和学…...

生成 Cypher 能力:MOSS VS ChatGLM

生成 Cypher 能力&#xff1a;MOSS VS ChatGLM 生成 Cypher 能力&#xff1a;MOSS VS ChatGLM一、 测试结果二、 测试代码&#xff08;包含Prompt&#xff09; Here’s the table of contents: 生成 Cypher 能力&#xff1a;MOSS VS ChatGLM MOSS介绍&#xff1a;MOSS 是复旦大…...

数据库的键和存储

主键:数据库表中对存储数据对象给予以唯一和完整表示的数据列或属性的组合。一个数据列只能有一个主键&#xff0c;且主键的取值不能缺失&#xff0c;即不能为空。 外键:在一个表中存在另一个表得主键称此为表的外键。 为什么用自增列作为主键&#xff1f; 如果我们定义了主…...

基于AT89C51单片机的并入串出乘法口诀的设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87779146?spm1001.2014.3001.5503 源码获取 并入串出乘法口诀的设计与仿真系统设计 目录 第一章 概述 3 1.1课题研究及意义 3 1.2课题设计内容 4 第二章系统设计…...

人生在世皆有过错,来一起看看Java中的异常吧!!!

Java中的异常问题详解 一、异常的概念与分类 1.异常概念 概念&#xff1a;Java异常是一个描述在代码段中发生异常的对象&#xff0c;当发生异常情况时&#xff0c;一个代表该异常的对象被创建并且在导致该异常的方法中被抛出&#xff0c;而该方法可以选择自己处理异常或者传…...

linux 测试连接网络和端口 telnet

一、安装telnet 1、检测telnet-server的rpm包是否安装 [rootlocalhost ~]# rpm -qa telnet-server 若无输入内容&#xff0c;则表示没有安装。出于安全考虑telnet-server.rpm是默认没有安装的&#xff0c;而telnet的客户端是标配。即下面的软件是默认安装的。 2、若未安装&…...

一文快速入门体验 Hibernate

前言 Hibernate 是一个优秀的持久层的框架&#xff0c;当然&#xff0c;虽然现在说用得比较多的是 MyBaits&#xff0c;但是我工作中也不得不接触 Hibernate&#xff0c;特别是一些老项目需要你维护的时候。所以&#xff0c;在此写下这篇文章&#xff0c;方便自己回顾&#xf…...

【RabbitMQ】SpringAMQP

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…...

错题汇总08

1.如果友元函数重载一个运算符时&#xff0c;其参数表中没有任何参数则说明该运算符是 A 一元运算符 B 二元运算符 C 选项A&#xff09;和选项B&#xff09;都可能 D 重载错误 运算符重载 1.重载成类的成员函数------>形参数目看起来比该运算符需要的参数个数少1&#x…...