【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习

逆向日期:2024.02.07

使用工具:Node.js

加密方法:AES

文章全程已做去敏处理!!!  【需要做的可联系我】

可使用AES进行解密处理(直接解密即可):在线AES加解密工具

1、打开某某网站(请使用文章开头的AES在线工具解密):4ChonmNI5Lkh3tjTAa6Z06mJWyT4q4j0x86XqcGv7O42h1fyOjN7aJnHZoBMGMVj
2、随便输入账号,然后图片验证码输入后,点击获取验证码,可在控制台网络面板查看

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第1张图片

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第2张图片

3、仍然一样,全局搜索,幺幺嗨,这么简单就找到了,他这里是将一个字典转为了字符串在进行的加密,,首先我们要先模拟生成他字典中的内容,图片验证码可以ocr识别传进去,手机号可以先写固定,时间戳直接生成,【sessionId】这个玩意不知道是啥,我们直接去翻源代码

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第3张图片

4、哎幺,我脑子最近有点傻,忘了先去分析【sessionId】值,才发现【sessionId】是用时间组成的,别问为什么,就因为脑子有点傻,在源码上浪费时间找了半天,直接看代码

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第4张图片

5、按照网站的方法,【f】的参数我们也已经解决了,接下来直接进入【newEncrypt】,看看这么加密的

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第5张图片

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第6张图片

6、找到了,好家伙AES加密,把此段代码直接复制,放到本地,然后调用本地的库。我们只需略微修改即可

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第7张图片

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第8张图片

7、然后我们先测试一下,在控制台和本地都加密一下【1】,看结果是不是一样,,可以看到是一样的,接下来就直接模拟

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第9张图片

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第10张图片

8、加密完成后,可以通过测位数来检验你的加密是否有问题,下面可以看到,无论是我本地加密的结果,还是源网站的结果,位数都是一样的,说们我们这个就成功逆开了

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第11张图片

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习_第12张图片

【附上源码】
npm install crypto-js --save  // 安装本地包
// 安装 crypto 加解密包
// npm install crypto-js --save
// 对称加密算法 的结果将会是唯一性,不会变更
const CryptoJS = require('crypto-js')

// 随机生成 16位
getAesKey = function(l) {
    l = l || 32;
    for (var n = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", t = n.length, e = "", a = 0; a < l; a++)
        e += n.charAt(Math.floor(Math.random() * t));
    return e
}
var getAesKeys = getAesKey()

newEncrypt = function(l) {
    var n = CryptoJS.enc.Utf8.parse(getAesKeys)  // 源网站的 getAesKeys 值是随机16位  刷新网站后,此处的值也会刷新
      , t = CryptoJS.enc.Utf8.parse(getAesKeys)  // 源网站的 getAesKeys 值是随机16位  刷新网站后,此处的值也会刷新
      , e = CryptoJS.enc.Utf8.parse(l)
      , a = CryptoJS.AES.encrypt(e, n, {
        iv: t,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return CryptoJS.enc.Base64.stringify(a.ciphertext)
}
function times(){
    // ISO 8601标准 UTC 时间
    var currentDate = new Date();
    // 年
    var year = currentDate.getFullYear();
    // 月
    var month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始,需要加1
    // 日
    var day = currentDate.getDate().toString().padStart(2, '0');
    // 时
    var hours = currentDate.getHours().toString().padStart(2, '0');
    // 分
    var minutes = currentDate.getMinutes().toString().padStart(2, '0');
    // 秒
    var seconds = currentDate.getSeconds().toString().padStart(2, '0');
    // 进行组合
    sessionId = year.toString().substring(4, 2)+month+day+hours+minutes+seconds+Math.floor(Math.random() * 100000000).toString().padStart(8, '0');
    return sessionId
}

f = {
    "body": {
        "name": "18000000000",   // 账号
        "code": "yutuAK",       //  图片验证码
        "sessionId": times(),
        "option": "LOGIN"
    },
    "head": {
        "userCode": null,
        "channelCode": "101",
        "transTime": new Date().getTime(),    // 时间戳
        "transToken": "",
        "customerId": null,
        "transSerialNumber": ""
    }
}
G = newEncrypt(JSON.stringify(f))

console.log(G)
console.log(G.length)

你可能感兴趣的:(JavaScript,javascript,node.js,js逆向)