小程序动态调试-解密加密数据与签名校验

这篇具有很好参考价值的文章主要介绍了小程序动态调试-解密加密数据与签名校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
微信小程序的加密与验签早前大多数情况,要么就是逆向获取源码而后拿到加密秘钥,要么就是逆向拿到源码后使用腾讯自带的小程序开发者功能进行动态调试模拟,今天介绍一款志远大佬的开源工具—WeChatOpenDevTool

工具下载地址: https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python

正文:
首先运行脚本,而后打开微信小程序,注意先后顺序,打开小程序后,打开调试器
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
本次使用的依然是PC端微信进行小程序抓包,抓包使用的工具就是fiddler+burpsuite ,具体使用方式上文有过介绍,此处不再进行赘述

小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
大家可以看到,首先请求参数是加密的,并且请求头包含nonce、timestamp、signature信息,若是看过笔者的第一篇加密解密文章就知道,这里是一个签名校验,绝大多数的签名校验都是利用以上信息结合body进行加密,少数的还会带上uri或者是一些其他参数,那么我们今天要做的就是获取他请求包包体加密的方式以及签名校验的生成方法

老规矩,直接在开发者调试里面全局搜索requestData参数,这是最快定位的方法,当然了也可以利用网络信息进行断点调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试

我们很快就找到了关键信息requestData: n.encrypt(o, r),一眼丁真
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
通过单步步过,我们可以获知n = require(t(219))为加密函数,所以需要进去看一下加密方法,,F9步入后发现其实是sm4国密算法,sm4大家可以理解为改良版的aes加密

小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
继续进行步过(F10),结果如下:
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
经过测试,这里面的sm4秘钥是写死的,直接用就行
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
在获取了加密算法与秘钥的情况下,我们继续调试,幸运的是在进行下断点的时候,看到了这个签名校验的函数
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
疑似signature
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
跟进函数l(u, i, n, v)
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
F9进入到l()函数内,此时函数变为l(e, t, n, r),这里面的e,t,n,r 就相当于u, i, n, v ,这里面就是一个形参,而传入进去的u, i, n, v才是真正的实参
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试

我们可以看到,函数最后一行s(p + e + c + u) ,这里其实才是最终输出的值,所以我们需要关注p/e/c/u这四个参数是怎么来的,s()这个函数做了什么
首先,p这个参数其实是一个三元运算结果,我们传入的r参数此时是-1,他会做一个比较,大于等于0和小于0的时候去输出不同的p值
r >= 0 ? p = [(o = a)(345), o(230), o(211), “RhYqRedo=K7JvcuyjpbyppnZr7qQGs21JQsTNSp5TJm”, o(269), “Tyrcs”][o(343)](1, 5)o(215) : p = d();
由于此时是-1,所以p=d(),大家可以步入d()函数,但是其实无论是大于还是小于,结果都是写死的哈
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
r >=0 的时候,
p=NBMExPe9iO{WXsAxZMRhYqRedo=K7JvcuyjpbyppnZr7qQGs21JQsTNSp5TJmczO
r <0 的时候,
p=EvAucyQXqhNrXB23hw8wPw73xHzAHNqipmBFKJTHGzBXTsHpNxR9PGyMhErNEvAu

e的值其实就是个uuid,我们一会进行介绍;
c = ei(202) ,我们可以看一下i(202) 做了什么
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
我们通过控制台调试,不难发现,其实i(202)是一个substring字符串截取工具,而ei(202)其实就是对e下标为5的位置开始截取字符串

下面就是u了,u = s(JSONi(286))
我们看JSONi(286) ,就能大概知道咋回事了,实际上就是把传进来的明文参数进行了json转换
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
但是s()这个函数是干什么呢,实际上笔者一开始也是一脸懵,笔者进入函数调试的时候,发现首先会将json转换后的参数进行ascii编码,然后计算length长度后进行一系列复杂的运算最后生成一个32长度的字符串,最后再进行取值,这里笔者完全是懵逼的,大概精简的代码如下

function l(r) {
        var n = 8 * r.length
          , t = n % 512;
        t = t >= 448 ? 512 - t % 448 - 1 : 448 - t - 1;
        for (var e = new Array((t - 7) / 8), o = 0, a = e.length; o < a; o++)
            e[o] = 0;
        var c = [];
        n = n.toString(2);
        for (var u = 7; u >= 0; u--)
            if (n.length > 8) {
                var l = n.length - 8;
                c[u] = parseInt(n.substr(l), 2),
                n = n.substr(0, l)
            } else
                n.length > 0 ? (c[u] = parseInt(n, 2),
                n = "") : c[u] = 0;
        for (var i = [].concat(r, [128], e, c), s = i.length / 64, v = [115, 128, 22, 111, 73, 20, 178, 185, 23, 36, 66, 215, 218, 138, 6, 0, 169, 111, 48, 188, 22, 49, 56, 170, 227, 141, 238, 77, 176, 251, 14, 78], h = 0; h < s; h++) {
            var g = 64 * h;
            v = f(v, i.slice(g, g + 64))
        }
        return v
}

其实在这里笔者就卡主了,不会了,完全看不出来是什么,这也不是sha1-256,因为笔者去试过了,但是柳暗花明的就是,笔者在第二天清晨看到了这个
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
山重水复疑无路,柳暗花明又一村,原来是SM3
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
所以此时问题迎刃而解
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
s(p + e + c + u) 这个函数就是把p + e + c + u四个参数串起来,然后进行SM3编码

上次说到,e的值其实就是个uuid,所以我们回到上面,看一下e是怎么来的
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
进入c()函数

function c() {
        for (var e = a, t = [], n = e(306), r = 0; r < 36; r++)
            t[r] = n[e(234)](Math.floor(16 * Math[e(346)]()), 1);
        return t[14] = "4",
        t[19] = n[e(234)](3 & t[19] | 8, 1),
        t[8] = t[13] = t[18] = t[23] = "-",
        t[e(215)]("")[e(268)]("-", "")
}

小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
大家不需要完全看得懂,我们只需要知道,他是由啥组成的,在什么位置有横杠就行
小程序的动态调试是什么,JS对抗,小程序,小程序加解密,前段调试
这个 JavaScript 函数的作用是生成一个符合 UUID(Universally Unique Identifier)规范的字符串。UUID 是一种用于标识信息或对象的唯一标识符。

现在让我们分解这个 JavaScript 函数的工作原理:

使用一个名为 a 的函数作为参数传入(在这里被省略了)。
创建一个空数组 t,用于存储生成的 UUID。
通过调用函数 e(306) 获取一个随机数生成器。
循环执行 36 次以下操作:
生成一个 0 到 15 之间的随机整数,然后转换为十六进制字符。
将生成的字符存储到数组 t 中。
修改数组中的特定索引位置,使得生成的 UUID 符合 UUID 版本 4 的规范:
将第 15 个字符设置为 “4”(UUID 版本号)。
将第 20 个字符的高 4 位设置为 “8”, “9”, “a” 或 “b”(UUID 变体)。
将数组中的特定索引位置设置为连字符 “-”。
使用 join() 方法将数组中的元素连接成一个字符串,并移除其中的连字符 “-”,最终得到 UUID。
下面是相应的 Python 代码:

python

import random

def generate_uuid():
    characters = '0123456789abcdef'
    uuid_list = [random.choice(characters) for _ in range(36)]
    uuid_list[14] = '4'  # UUID version 4
    uuid_list[19] = random.choice('89ab')  # Variant
    uuid_list[8] = uuid_list[13] = uuid_list[18] = uuid_list[23] = '-'
    return ''.join(uuid_list)

测试生成的 UUID
print(generate_uuid())
这个 Python 函数与 JavaScript 函数的实现类似,使用了 random.choice() 函数来从指定的字符集中随机选择字符,并通过字符串操作和列表操作生成 UUID。

最后总结一下,这个如果写脚本的话,一个接口就需要一个脚本,有点不值了,建议能力强的写个ipython写进burp里,只是难度有点…文章来源地址https://www.toymoban.com/news/detail-839314.html

到了这里,关于小程序动态调试-解密加密数据与签名校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

    目录 1. 接下来让小编给您们编写实现代码!请躺好 ☺ 1.1 配置application.yml文件 1.2 RSA算法签名工具类 1.3  RSA算法生成签名以及效验签名测试 1.4 RSA算法生成公钥私钥、加密、解密工具类 1.5 RSA算法加解密测试 我们为什么要使用RSA算法来进行加解密?  RSA 加密算法是一种非对

    2024年02月12日
    浏览(41)
  • OpenSSL 3.1.1 ECC 加密、解密、签名、验签(国密 sm2、sm3)

    openssl 3 默认废弃了 旧版本 (opessl 1.x) 的部分api 导致部分旧ecc 代码无法使用(可以通过配置编译选项打开) ,这里展示如何使用新接口用ECC 进行加密解密。 新接口是真的方便,基本上你都不需要懂啥密码学知识,对我们这种密码白痴来说太好了 头文件 生成密钥对 导出公

    2024年02月05日
    浏览(43)
  • SpringCloudGateway实现数字签名与URL动态加密

    再网络传递数据的时候,为了防止数据被篡改,我们会选择对数据进行加密,数据加密分为对称加密和非对称加密。其中RSA和AES,TLS等加密算法是比较常用的。 对称加密是指加密和解密使用相同的密钥的加密方法。其基本流程包括以下步骤: 密钥生成 : 双方协商生成一个共

    2024年02月07日
    浏览(27)
  • Linux gpg命令(gpg指令、gpg加密工具)(GNU Privacy Guard、GnuPG)文件压缩加密、文件加密、文件解密、文件压缩密码、解压密码、GPG密钥、数字签名、非对称加密

    GNU Privacy Guard (GnuPG或GPG) 是一个完全免费的开源实现,用于OpenPGP标准的数据加密和解密。这种加密方式可以用于保护敏感数据,确保其在传输过程中不被截获或篡改。本文将介绍在Linux环境中如何使用GPG加密工具。 安装gpg 在大多数Linux发行版中,GPG已经预先安装了。 如果未安

    2024年02月03日
    浏览(43)
  • 【安全】对称加密、非对称加密、数字签名和CA是什么?

    今天学习了关于网络通信过程中的安全相关的知识,还有一些基础的概念,现做以总结,博客的图示都是自己画的,如果能够有助于你的理解,请点个赞收藏一下~~ 目录 对称加密 非对称加密算法  数字签名和CA 证书的信任链 根身份证和自签名   对称加密的一方(比如小蓝)

    2023年04月08日
    浏览(31)
  • HTTPS加密原理,搞懂什么是对称加密、非对称加密、证书、数字签名

    众所周知,http协议是一种未加密的协议,我们未加密的数据,在传输的过程中会经过一个又一个的物理节点,如果被人通过抓包的方式拿到了我们的数据,将会给我们造成无法估量的损失。 为了解决解决这个问题,https应运而生。https通过加密的手段,保障的数据的安全性。

    2024年02月01日
    浏览(40)
  • JWT加密解密登录鉴权逻辑是什么?

    JWT(JSON Web Token)是一种用于进行认证和授权的开放标准,它可以安全地传输信息,通常用于实现身份验证和鉴权逻辑。 以下是使用JWT进行登录鉴权的一般逻辑: 1:用户登录: 用户提供用户名和密码进行登录。 服务器验证用户提供的凭据是否有效。 2:生成JWT: 服务器验证

    2024年02月06日
    浏览(28)
  • 微信小程序之 base-64加密、解密

    后端获取 token 接口,需要加密认证

    2024年02月11日
    浏览(49)
  • Android 使用sqlcipher加密和解密数据库(包括加密和解密已有的数据库,还有如何查看数据库教程)

    前言 我们知道Android系统有一个内嵌的SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,SQLite是一个轻量级的、跨平台的、开源的嵌入式数据库引擎,也是一个关系型的的使用SQL语句的数据库引擎,读写效率高、资源消耗总量少、延迟时间少,使其成为移

    2024年02月06日
    浏览(40)
  • 微信小程序使用crypto.js加密解密

    crypto.js是用来进行AES加密的 注意AES在使用时有7个配置项,前后端加解密记着统一参数,测试时注意配置项的选择是否一致。 AES加密测试工具 文件存放路径: cryptoPro.js代码:

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包