python---js逆向------再接再励------案例

news2024/11/24 2:19:32

作者前言

这是我的gitee仓库:https://gitee.com/qin-laoda/python-exercises

有兴趣的小可爱们可以点进去看看,

目录

常见的js加密算法
微信公众号的简单案例

________________________________

鉴于有一些小可爱对于js逆向的理解还有一些不解,下面我会再进一步的介绍js逆向,

常见的加密算法

 1.线性散列的MD5算法

2.对称加密DES/AES算法

3.非对称加密算法RSA

4.base64伪加密

5.https证书钥加密

js逆向-MD5加密(理论上无法破解)

MD5是一种被广泛使用的线性散列算法,可以产生一个128位(16字节)的散列值(hash value),用户确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据

  • 解密:

    • 常规讲MD5是不存在解密的,但是理论上MD5可以反向暴力破解,暴力破解的原理就是用很多不同的数据进行加密后跟已有加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大即可,但是实际中要考虑破解成本(时间和机器性能)。假设破解当前MD5密码需要目前计算能力最优秀的计算机工作100年才能完成破解,那么当前的MD5密码就是安全的
  • 增加破解成本的方法

    • 使用一段无意义且随机的私钥进行MD5加密会生成一个加密串,称为串1
    • 将要加密的数据跟串1拼接,再进行一次MD5,这时会生成串2
    • 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据
  • 我们在注册账号时密码一般都是MD5加密

AES DES对称加密(用一个密钥加密解密)

DES全称为Data Encryption Standard ,即数据加密标准,是一种使用秘钥加密的算法,该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的秘钥(一组字符串)即可。
注意:

  • 现在用的AES这个标准来替代原先的DES

  • AES和DES的区别:

    • 加密后秘文长度的不同

      • DES加密后密文长度是8的整数倍
      • AES加密后密文长度是16的整数倍
    • 应用场景的不同

      • 企业级开发使用DES足够安全
      • 如果要求更高使用AES
    • DES和AES切换只需要修改CrytoJS.AES<=>CryptoJS.DES

使用DES/AES进行数据交换时要求双方都拥有相同的私钥
破解方法:

  1. 暴力破解
  2. DES如果使用56位的秘钥,则可能的秘钥数量是2的56次方个。只要计算足够大是可以破解的

DES算法的入口参数有三个:

  • Key、Data、Mode、padding

    • Key为7个字节共56位,是DES算法的工作秘钥
    • Data为8字节64位,是要被加密或被解密的数据
    • Mode为DES的工作方式
    • padding为填充模式,如果加密后密文长度如果达不到指定整数倍(8字节、16字节),填充对应字符 。padding的赋值固定为CryptoJS.pad.Pkcs即可

RSA加密(公钥加密,私钥解密)

RSA加密算法是一种非对称加密算法。在公开秘钥加密和电子商业中RSA被广泛使用
非对称加密算法需要两个秘钥:

  • 公开秘钥(publickey:简称公钥)
  • 私有秘钥(privatekey:简称私钥)
  • 公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密,因为加密和解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法

注意:

  • 使用时都是使用公钥加密使用私钥解密。公钥可以公开,私钥自己保留
  • 算法强度复杂、安全性依赖于算法于秘钥但是由于其算法复杂,而是的加密解密速度没有对称加密的速度快

使用流程和场景介绍:

  • 通过公钥加密,使用私钥解密,私钥是通过公钥计算生成的,假设ABC三方之间相互要进行加密通信。大家相互之间使用公钥进行信息加密,信息读取使用各自对应的私钥进行信息解密
  • 用户输入的支付密码会通过RSA加密

公钥私钥生成方式:公私钥可以可以在线生成:http://web.chacuo.net/netrsakeypair

base64伪加密(一种编码格式)

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法,知识看上去像是加密而已
使用A-Z,a-z,0-9,+,/ 这64个字符实现对数据加密

https加密

https是基于http和SSL/TLS实现的一个协议,它可以保证在网络上传输的数据都是加密的,从而保证数据安全
如何实现https

  1. http协议是不安全的
    在https诞生之前,所有网站都是使用的http协议,而http协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改
  2. 使用对称秘钥进行数据加密
    为了防止数据泄露和篡改,我们对数据进行加密,如:生成一个对称密码,将对称秘钥分别交给浏览器和服务器端,他们之间传输的数据都使用对称秘钥进行加密和解密

 

3.请求和响应流程如下:

  • 客户端使用对称秘钥对请求进行加密,并发送给服务器

  • 服务端接收到密文后,使用对称秘钥对密文进行解密,然后处理请求,最后再使用对称秘钥把返回的内容再次加密,返回给看客户端

  • 客户端接收密文之后,使用对称秘钥进行解密,并获取最终的响应内容

    这样,数据局传输传输都是密文,解决了明文传输数据的问题,但是这样会有bug。

  • 浏览器如何获取对称秘钥

  • 每个客户端的对称秘钥相同,浏览器能拿到对称秘钥,那黑客也能拿到,所以数据加密就没有意义了

  1. 动态对称秘钥和非对称秘钥​​​​​​​

        上图就是理论上通过RSA的原理来发送密钥,缺点就是无法知道客户端接收的公钥是不是服务器的

  • 这样就解决了动态对称秘钥和数据加密的问题,因为每个用户的对称秘钥都是随机生成且传输的过程都使用公钥加密(公钥的加密数据只能有私钥能解密),所有何可无法截获对称秘钥。而数据传输是通过对称秘钥加密过的,所以黑客即使能获取数据也无法去解密可看到真是的内容,看似无懈可击,但是这样还是会出现bug
  • 如果黑客在步骤2进行劫持,把自己的公钥返回给客户端,那客户端会使用黑客的公钥来加密对称秘钥,黑客在步骤6截获请求,使用自己的私钥获取对称秘钥,后面过程全都失去作用
  1. CA证书的应用
  2. 证书就是提供密钥,由可靠平台颁布
  3. 抓包工具就是一个代理服务器,接收客户端发来的数据然后再发送给服务器

下面我们来一个简单的案例

链接:https://mp.weixin.qq.com/

操作:

输入密码和账号 并打开开发者工具

找到对应接口

 可以看出上图加密的是32位可以大概判断是MD5加密

然后找到对应的js文件进行打断点,运行

 

 js代码:


    function p(e, t) {
        var n = (65535 & e) + (65535 & t);
        return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
    }
    function a(e, t, n, i, o, s) {
        return p((t = p(p(t, e), p(i, s))) << o | t >>> 32 - o, n)
    }
    function l(e, t, n, i, o, s, r) {
        return a(t & n | ~t & i, e, t, o, s, r)
    }
    function g(e, t, n, i, o, s, r) {
        return a(t & i | n & ~i, e, t, o, s, r)
    }
    function m(e, t, n, i, o, s, r) {
        return a(t ^ n ^ i, e, t, o, s, r)
    }
    function h(e, t, n, i, o, s, r) {
        return a(n ^ (t | ~i), e, t, o, s, r)
    }
    function r(e, t) {
        e[t >> 5] |= 128 << t % 32,
            e[14 + (t + 64 >>> 9 << 4)] = t;
        for (var n, i, o, d, s = 1732584193, r = -271733879, a = -1732584194, c = 271733878, u = 0; u < e.length; u += 16)
            s = l(n = s, i = r, o = a, d = c, e[u], 7, -680876936),
                c = l(c, s, r, a, e[u + 1], 12, -389564586),
                a = l(a, c, s, r, e[u + 2], 17, 606105819),
                r = l(r, a, c, s, e[u + 3], 22, -1044525330),
                s = l(s, r, a, c, e[u + 4], 7, -176418897),
                c = l(c, s, r, a, e[u + 5], 12, 1200080426),
                a = l(a, c, s, r, e[u + 6], 17, -1473231341),
                r = l(r, a, c, s, e[u + 7], 22, -45705983),
                s = l(s, r, a, c, e[u + 8], 7, 1770035416),
                c = l(c, s, r, a, e[u + 9], 12, -1958414417),
                a = l(a, c, s, r, e[u + 10], 17, -42063),
                r = l(r, a, c, s, e[u + 11], 22, -1990404162),
                s = l(s, r, a, c, e[u + 12], 7, 1804603682),
                c = l(c, s, r, a, e[u + 13], 12, -40341101),
                a = l(a, c, s, r, e[u + 14], 17, -1502002290),
                s = g(s, r = l(r, a, c, s, e[u + 15], 22, 1236535329), a, c, e[u + 1], 5, -165796510),
                c = g(c, s, r, a, e[u + 6], 9, -1069501632),
                a = g(a, c, s, r, e[u + 11], 14, 643717713),
                r = g(r, a, c, s, e[u], 20, -373897302),
                s = g(s, r, a, c, e[u + 5], 5, -701558691),
                c = g(c, s, r, a, e[u + 10], 9, 38016083),
                a = g(a, c, s, r, e[u + 15], 14, -660478335),
                r = g(r, a, c, s, e[u + 4], 20, -405537848),
                s = g(s, r, a, c, e[u + 9], 5, 568446438),
                c = g(c, s, r, a, e[u + 14], 9, -1019803690),
                a = g(a, c, s, r, e[u + 3], 14, -187363961),
                r = g(r, a, c, s, e[u + 8], 20, 1163531501),
                s = g(s, r, a, c, e[u + 13], 5, -1444681467),
                c = g(c, s, r, a, e[u + 2], 9, -51403784),
                a = g(a, c, s, r, e[u + 7], 14, 1735328473),
                s = m(s, r = g(r, a, c, s, e[u + 12], 20, -1926607734), a, c, e[u + 5], 4, -378558),
                c = m(c, s, r, a, e[u + 8], 11, -2022574463),
                a = m(a, c, s, r, e[u + 11], 16, 1839030562),
                r = m(r, a, c, s, e[u + 14], 23, -35309556),
                s = m(s, r, a, c, e[u + 1], 4, -1530992060),
                c = m(c, s, r, a, e[u + 4], 11, 1272893353),
                a = m(a, c, s, r, e[u + 7], 16, -155497632),
                r = m(r, a, c, s, e[u + 10], 23, -1094730640),
                s = m(s, r, a, c, e[u + 13], 4, 681279174),
                c = m(c, s, r, a, e[u], 11, -358537222),
                a = m(a, c, s, r, e[u + 3], 16, -722521979),
                r = m(r, a, c, s, e[u + 6], 23, 76029189),
                s = m(s, r, a, c, e[u + 9], 4, -640364487),
                c = m(c, s, r, a, e[u + 12], 11, -421815835),
                a = m(a, c, s, r, e[u + 15], 16, 530742520),
                s = h(s, r = m(r, a, c, s, e[u + 2], 23, -995338651), a, c, e[u], 6, -198630844),
                c = h(c, s, r, a, e[u + 7], 10, 1126891415),
                a = h(a, c, s, r, e[u + 14], 15, -1416354905),
                r = h(r, a, c, s, e[u + 5], 21, -57434055),
                s = h(s, r, a, c, e[u + 12], 6, 1700485571),
                c = h(c, s, r, a, e[u + 3], 10, -1894986606),
                a = h(a, c, s, r, e[u + 10], 15, -1051523),
                r = h(r, a, c, s, e[u + 1], 21, -2054922799),
                s = h(s, r, a, c, e[u + 8], 6, 1873313359),
                c = h(c, s, r, a, e[u + 15], 10, -30611744),
                a = h(a, c, s, r, e[u + 6], 15, -1560198380),
                r = h(r, a, c, s, e[u + 13], 21, 1309151649),
                s = h(s, r, a, c, e[u + 4], 6, -145523070),
                c = h(c, s, r, a, e[u + 11], 10, -1120210379),
                a = h(a, c, s, r, e[u + 2], 15, 718787259),
                r = h(r, a, c, s, e[u + 9], 21, -343485551),
                s = p(s, n),
                r = p(r, i),
                a = p(a, o),
                c = p(c, d);
        return [s, r, a, c]
    }
    function c(e) {
        for (var t = "", n = 0; n < 32 * e.length; n += 8)
            t += String.fromCharCode(e[n >> 5] >>> n % 32 & 255);
        return t
    }
    function u(e) {
        var t, n = [];
        for (n[(e.length >> 2) - 1] = void 0,
                 t = 0; t < n.length; t += 1)
            n[t] = 0;
        for (t = 0; t < 8 * e.length; t += 8)
            n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
        return n
    }
    function i(e) {
        for (var t, n = "0123456789abcdef", i = "", o = 0; o < e.length; o += 1)
            t = e.charCodeAt(o),
                i += n.charAt(t >>> 4 & 15) + n.charAt(15 & t);
        return i
    }
    function d(e) {
        return unescape(encodeURIComponent(e))
    }
    function o(e) {
        return c(r(u(e = d(e)), 8 * e.length))
    }
    function s(e, t) {
        var n, e = d(e), t = d(t), i = u(e), o = [], s = [];
        for (o[15] = s[15] = void 0,
             16 < i.length && (i = r(i, 8 * e.length)),
                 n = 0; n < 16; n += 1)
            o[n] = 909522486 ^ i[n],
                s[n] = 1549556828 ^ i[n];
        return e = r(o.concat(u(t)), 512 + 8 * t.length),
            c(r(s.concat(e), 640))
    }
     function demo(e, t, n) {
        return t ? n ? s(t, e) : i(s(t, e)) : n ? o(e) : i(o(e))
    }

console.log(demo('s454fd5)

结果:

 python代码运行js文件进行发送

代码如下:

import requests
import execjs
import time


def get_js(js_path, js_name, func_args=None):
    with open(js_path, "r", encoding="utf-8")as f:
        js = f.read()
        # 编译js文件
        ctx = execjs.compile(js, cwd=r"C:\Users\32288\WebstormProjects\untitled\node_modules\crypto-js")
        # 执行js中的函数
        result = ctx.call(js_name, func_args)
        print(result)
        return result


a = get_js("./01.js", "demo", ("123456",))


def main():
    """主要的业务逻辑"""
    # url
    url = "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin"
    data = {
        "username": 123456,
        "pwd": a,
        "mgcode": "",
        "f": "json",
        "userlang": "zh_CN",
        "redirect_url": "",
        "token": "",
        "lang": "zh_CN",
        "ajax": 1
    }
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    # 发送请求获取响应
    response = requests.post(url, data=data,headers=header)
    print(response.json())
    # 数据的提取
    # 保存


if __name__ == '__main__':
    main()

结果:

 总结

上面就是一些简单MD5的案例,后面会陆续上传其他案例,

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

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

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 23 日论文合集)

文章目录 一、检测相关(4篇)1.1 Targeted collapse regularized autoencoder for anomaly detection: black hole at the center1.2 RXFOOD: Plug-in RGB-X Fusion for Object of Interest Detection1.3 Toward Automated Detection of Microbleeds with Anatomical Scale Loca…

axios简单使用

axios简单使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

【杂谈】过往时期2-嵌入式求学故事线简忆

前一篇文章 过往时期 - 欢迎来到 Staok - 瞰百易 (gitee.io)。 在我兴趣广泛的过去&#xff0c;关于嵌入式方面的经历啊&#xff0c;讲一条这个的故事线。 小学&#xff0c;电子积木&#xff0c;灯泡&#xff0c;电机&#xff0c;上电发光、风扇旋转&#xff0c;风扇转的快了还…

AnyLogic仿真软件 8.8.2 Crack

AnyLogic仿真软件用于以下行业&#xff1a; 供应链 制造业 运输 仓库运营 铁路物流 矿业 石油和天然气 港口及码头 更多行业 为什么要进行仿真建模&#xff1f; 无风险环境 仿真建模提供了一种安全的方法来测试和探索不同的“假设”场景。在做出现实世界的改变之前做出正确的决…

第10章 隐式转换

第10章 隐式转换 package chapter10object Test01_TestImplicit {def main(args: Array[String]): Unit {val richInt new MyRichInt(12)println(richInt.myMax(15))// 1. 隐式函数implicit def convert(num: Int): MyRichInt new MyRichInt(num)println(12.myMax(15))// 2.…

登录校验原理过程和统一拦截技术(Cookie、Sesstion 和JWT令牌)

一、登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。由于浏览器与web服务器中的数据交互是通过HTTP协议的&#xff0c;而HTTP协议是无状态的–即每个页面中的请求和响应都是独立的&#xff0c;没有状态存在。所以我们需要进…

【数据库】关系型数据库与非关系型数据库解析

【数据库】关系型数据库与非关系型数据库解析 文章目录 【数据库】关系型数据库与非关系型数据库解析1. 介绍2. 关系型数据库3. 非关系型数据库4. 区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同4.4 总结 参考 1. 介绍 一个通俗易懂的比喻&#xff1a;关系型…

Xpath介绍以及语法

Xpath介绍 XML路径语言&#xff08;XML Path Language&#xff09;&#xff0c;它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构&#xff0c;提供在数据结构树中找寻节点的能力。 起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模…

第8章 模式匹配

第8章 模式匹配 基本概念和用法 模式守卫 package chapter08object Test01_PatternMatchBase {def main(args: Array[String]): Unit {// 1. 基本定义语法val x 5val y x match {case 1 > "one"case 2 > "two"case 3 > "three"ca…

《Reinforcement Learning: An Introduction》第6章笔记

Chapter 6 Temporal-Difference Learning If one had to identify one idea as central and novel to reinforcement learning, it would undoubtedly be temporal-difference (TD) learning. 时序差分学习&#xff08;temporal-difference (TD) learning&#xff09;组合了Mon…

PID控制算法 – 0、PID原理

1、开局一张图 很多地方都觉得PID的控制结构示意图是这样的&#xff1a; 2、目标值&#xff08;Setpoint&#xff09;、输入值&#xff08;Input&#xff09;、误差&#xff08;Error&#xff09; 其实把上图那个输入改为目标值&#xff08;Setpoint&#xff09;更合适&#…

canvas详解08-基本动画

由于我们是用 JavaScript 去操控 canvas 对象,这样要实现一些交互动画也是相当容易的。在本章中,我们将看看如何做一些基本的动画。 可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费…

CoreMark 跑个分:OrangePi5 RK3588S

一、 Orange Pi 5 简介 Orange Pi 5 采用了瑞芯微 RK3588S 新一代八核 64 位处理器&#xff0c;具体为四核A76四核A55&#xff0c;采用了 8nm 工艺设计&#xff0c;主频最高可达 2.4GHz&#xff0c;集成 ARM Mali-G610 MP4 GPU&#xff0c;内嵌高性能 3D 和 2D 图像加速模块&am…

【python桌面应用设计】tkinter库 01. Tkinter程序设计思想和结构(保姆级代码注释)

目录 实现思路代码实战简单的基础结构示例稍微丰富一点的示例 总结 『python图形化GUI界面设计』分享tkinter库、PyQt5库、wxPython库等相关的新手入门教程&#xff0c;目标是编写python程序时可以给程序一个可视化界面。 欢迎关注 『python桌面应用设计』 系列&#xff0c;持续…

ubuntu18.04安装ORBSLAM2

最近倒腾了一下旧项目&#xff0c;发现之前的环境不知道抽了什么风&#xff0c;直接不能用了&#xff0c;好吧&#xff0c;索性从头装过。 一、第三方库 主要包括Pangolin 、 OpenCV 、 Eigen g2o 与 DBoW2在ORB-SLAM2里面自带可以不需要自己搞 # 更新apt库,更新软件列表 su…

七、c++学习(加餐3:深入分析类和对象(下))

我们把这篇《深入分析类和对象》分为两篇&#xff0c;就是为了简化一下大家学习的压力&#xff0c;现在我们接下来看下一篇。 C学习&#xff0c;b站直播视频 文章目录 7.1 对象操作7.1.1 对象拷贝7.1.1.1 无拷贝赋值运算符7.1.1.2 测试编译器会不会自动生成7.1.1.3 自己写拷贝…

【吃透网络安全】2023软考网络管理员考点网络安全(四)防火墙详解

涉及知识点 什么是防火墙&#xff1f;防火墙的概念及定义&#xff0c;防火墙的优缺点&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 后面还有更多续篇希望大家能给个赞哈&#xff0c;这边提供个快捷入口&#xf…

Reactive 环境配置 遇到的问题记录

问题&#xff1a;Watchman: watchman--no-pretty get-sockname returned with exit code 1 ERROR: Unknown option --no-pretty 解决方案&#xff1a;运行ReactNative工程watchman运行错误 解决过程就是&#xff0c;我的watchman 没安装好&#xff0c;于是卸载&#xff0c;重新…

电子电气架构 —— OEM关于DTC具体实现相关见解

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们当前遇到的几乎所有的成长问题都可以归结道目光短浅、及时满足的天性上,不过在现代社会,用避难趋易和急于求成来指代他们更贴切。 本文主要讲…

Vivado使用技巧之外部编辑器配置

目录 一、前言 二、编辑器配置 2.1 环境变量添加 2.2 环境变量验证 2.3 Vivado设置 2.4 配置验证 2.5 解决Vivado配置失败问题 一、前言 Vivado自带的默认编辑器功能受限&#xff0c;不如第三方编辑器Eclipse&#xff0c;Notepad&#xff0c;Sublime功能强大。因此&…