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

news/2024/10/29 2:26:49/

前言

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

目录标题

      • 前言
      • 开发环境:
      • 模块使用:
      • 逆向目标
      • 逆向过程
      • 参数 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()

尾语 💝

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

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

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

—— 心灵鸡汤

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

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


http://www.ppmy.cn/news/68845.html

相关文章

每日学术速递5.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.VideoChat: Chat-Centric Video Understanding 标题&#xff1a;VideoChat&#xff1a;以聊天为中心的视频理解 作者&#xff1a;KunChang Li, Yinan He, Yi Wang, Yizhuo Li, Wen…

dubbo技术

1、Dubbo的前世今生 2011年10月27日&#xff0c;阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo&#xff0c;服务治理和SOA的设计理念开始逐渐在国内软件行业中落地&#xff0c;并被广泛应用。 早期版本的dubbo遵循SOA的思想&#xff0c;是面向服务架构的重要组件。 …

小宁ChatGPT智能机器人上线,无需魔法注册即可使用!

​大家好&#xff0c;今天我要向大家介绍一款基于人工智能技术的聊天机器人——ChatGPT。ChatGPT可以与用户进行自然语言交互&#xff0c;回答用户的问题、提供服务、进行闲聊等&#xff0c;让聊天变得更有趣。 小宁ChatGPT是对接ChatGPT官方api&#xff0c;实现无需魔法无误差…

使用Spring Boot和Docker构建可伸缩的微服务架构,应对增长的业务需求

使用Spring Boot和Docker构建可伸缩的微服务架构&#xff0c;应对增长的业务需求 一、简介1. 微服务架构的定义2. Spring Boot和Docker的概述 二、Spring Boot1. Spring Boot的介绍2. Spring Boot的优势3. Spring Boot的组件4. Spring Boot的应用 三、Docker1. Docker的介绍2. …

全网首次公开,阿里巴巴新产Java性能优化小册(2023版),理论实战起飞

性能优化可以说是很多一线大厂对其公司内高级开发的基本要求&#xff08;其中以Java岗最为显著&#xff09;。其原因有两个&#xff1a;一是提高系统的性能&#xff0c;二是为公司节省资源。两者都能做到&#xff0c;那你就不可谓不是普通程序员眼中的“调优大神了”。 那么如…

C++ 中到底是应该include .h文件还是应该include .cpp文件

在阅读一个较大的解决方案中&#xff0c;对于其他文件夹下的.h和.cpp文件&#xff0c;有时候#include“XXX.h”文件&#xff0c;有时候是#include“XXX.cpp”文件&#xff0c;而且二者还不能更换。下面就好好分析一下他们二者的区别。 测试 测试&#xff1a;XXX.h和XXX.cpp…

【免交互】

目录 一、免交互1.1、语法格式1.2、命令演示1、多行写入文件内容2、多行注释 二、Expect2.1、基本命令2.2、脚本操作 一、免交互 1、使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 2、是标准输入的一种替代品可以帮助脚本开发…