吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1890|回复: 23
收起左侧

[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] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
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

厉害厉害
schnappi2025 发表于 2025-3-30 15:07
厉害!学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-5-20 08:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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