吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1658|回复: 22
收起左侧

[Web逆向] 【js逆向】某云模拟登录

  [复制链接]
asone917 发表于 2025-3-28 16:57
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目标网址aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4=
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
感谢各位大佬的观看,我是菜鸟,新手上路,在某同学的忽悠下入坑js逆向,请多指教


f12,输入账号密码点击登录后找到数据接口
查看请求标头,经对比,需要求解的有:CsmCst
cookie和x-riskdevicesign是定值
image.png


查看请求载荷,表单数据中的userName是明文,password加密,comParam_curTime、comParam_seqCode、comParam_signature会变
image.png
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
先从请求载荷开始Csm、Cst的求解:全局搜索 Cst,断点,点击登录触发断点 image.png F9,进来这里,扣代码 image.png 扣代码运行 image.png
ReferenceError: Fe is not defined image.png
ReferenceError: _e is not defined image.png
ReferenceError: Te is not defined(类似的,在那个文件找,能找到对应的函数)实际要扣取的全部代码如下,在红框内 image.png 最后报错: image.png 从t进来,发现是加载器,用到了 webpack技术,将当前文件内容复制下来,不知道什么是 webpack请自行搜索教程 image.png 只复制红框内的内容 image.png 导出加载器全局使用 image.png image.png image.png 打印所需要的模块 image.png 全局搜索 4917 image.png image.png 后面发现缺很多,干脆直接把那些模块全部复制下来 image.png
运行
image.png

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来是请求载荷中加密参数的求解:全局搜索 comParam_curTime,断点调试 image.png r = Object(u["k"])() 指的是下面这个H函数 image.png c()函数执行的是_()函数 image.png 全部复制下来 image.png 运行 image.png 核心代码:
[JavaScript] 纯文本查看 复制代码
function run() {
    biaotou = Ue(e_url)
    n = (new Date).getTime() - '182'
    t = "s54zv9bm1vd5czfujy6nnuxj1l4g2ny6"
    r = H()
    a = _(n + r + _(r + t + n));
    return [biaotou,n,r,a]
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------接下来是表单数据中的password的求解全局搜索password,这里的username和password在一起,猜测加密位置在这里,所以选择在这里断点 image.png 进来到这里,这里的逻辑是在用户输入的账号末尾补0直到长度为24,如果超过24位则取前24位 image.png F9进来,这就太明显了 image.png
----------------
改写M函数
代码:
[Python] 纯文本查看 复制代码
const cryptoJs = require('crypto-js')

function M(username, password) {
    if (username.length < 24)
        for (var a = username.length; a < 24; a++)
            username += "0";
    else
        username = username.substring(0, 24);
    d = cryptoJs.enc.Utf8.parse(username)
    s = {
        mode: cryptoJs.mode.ECB,
        padding: cryptoJs.pad.Pkcs7
    }
    l = cryptoJs.TripleDES.encrypt(password, d, s);
    return l.toString()
}

// console.log(M("adfsa@qq.com","123456"))

function login(userName, password) {
    return M(userName, password)
}


运行结果对比:
image.png

主函数:
[Python] 纯文本查看 复制代码
import json

import requests
import subprocess
from functools import partial

subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs

base_url = "数据接口,自行填写"

username = input("请输入您的账号:")
password = input("请输入您的密码:")

# 求password
with open("password.js", encoding="utf-8") as f:
    jscode = f.read()

js = execjs.compile(jscode)
password_encryption = js.call("login", username, password)
print(password_encryption)
form_data = {
    "userName": username,
    "password": password_encryption
}

# 求标头和载荷的加密参数
with open("demo.js", encoding="utf-8") as f:
    jscode = f.read()

js = execjs.compile(jscode)
result = js.call("run")
print(result)
Csm = result[0]['sign']
Cst = result[0]['time']
print(Csm,Cst)
headers = {
    "accept": "application/json, text/plain, */*",
    "accept-encoding": "gzip, deflate, br, zstd",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "no-cache",
    "connection": "keep-alive",
    "content-length": "60",
    "content-type": "application/x-www-form-urlencoded",
    "csm": Csm,
    "cst": str(Cst),
    "host": "m.ctyun.cn",
    "origin": "。。。",
    "pragma": "no-cache",
    "referer": "。。。",
    "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "x-riskdevicesign": "50b8ae96f222fd0f2879125bc5fc6e08",
}
params = {
    "referrer": "wap",
    "mainVersion": "300031500",
    "comParam_curTime": result[1],
    "comParam_seqCode": result[2],
    "comParam_signature": result[3],
    "isCheck": True,
    "locale": "zh-cn"
}

print(params)
res = requests.post(base_url, headers=headers, params=params, data=form_data)
user_data = res.text
user_data = json.loads(user_data)
print(json.dumps(user_data,indent=4, ensure_ascii=False))



登录成功显示:
image.png

登录失败显示:
image.png

整个过程就是这样,有不足之处请各位大佬指出,有逆向的资源也可以分享,本人正在学习逆向中,目前已经学了一个月,菜鸟上路,多多指教

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





免费评分

参与人数 12威望 +1 吾爱币 +31 热心值 +11 收起 理由
Wyiyun777 + 1 + 1 热心回复!
a927 + 1 + 1 我很赞同!
zzyzy + 1 + 1 谢谢@Thanks!
allspark + 1 + 1 用心讨论,共获提升!
ZeLin99 + 1 我很赞同!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jk998 + 1 + 1 我很赞同!
yan999 + 1 + 1 我很赞同!
liuxuming3303 + 1 + 1 我很赞同!
开心的一逼 + 1 + 1 谢谢@Thanks!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
cgiwei999 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ztgzs 发表于 2025-3-29 09:09
入手逆向的纯新手应该从哪学起啊
JimLee0921 发表于 2025-4-29 10:46
anwuzhu077 发表于 2025-3-31 23:48
我不是很理解M函数重写的时候,为什么判定p.a这段就是cryptoJs这个加密方式,可以解答一下我吗,楼主

TripleDES可以看出来其实就是3DES加密的,所以可以判断可以使用标准加密库cryptojs进行加密,当然我也是小白
ghylinux 发表于 2025-3-29 09:30
xiaofeng9527 发表于 2025-3-29 10:11
学习了。
YS888 发表于 2025-3-29 10:13
感谢分享
robert1234 发表于 2025-3-29 10:30
谢谢分享。
Dogexx 发表于 2025-3-29 16:53
我看了一下,请求头中的参数好像不进行校验,固定下来也行。
wodeer00 发表于 2025-3-29 17:29
插眼, 学习
shanhu5235 发表于 2025-3-30 10:53
不错,加油
xiaoqy 发表于 2025-3-30 14:19

厉害厉害
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-30 14:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表