spiderdemo 2-混淆

网址:aHR0cHM6Ly9zcGlkZXJkZW1vLmNuL29iL29iX2NoYWxsZW5nZTEvP2NoYWxsZW5nZV90eXBlPW9iX2NoYWxsZW5nZTE=

接口:

定位就非常好定位

然后进入md5函数,这里已经确认过加了盐

找到盐值即可

py 复制代码
import hashlib

def get_hex_md5_cracked(input_string):
    """
    还原混淆 JS 中的 hex_md5 逻辑
    """
    # 1. 从混淆代码中逆向出的固定盐值
    # \xa3\xac\xa1\xa3 对应特定的扩展 ASCII 字符
    salt = "\xa3\xac\xa1\xa3fdjf,jkgfkl"
    
    # 2. 拼接输入字符串和盐值
    plain_text = input_string + salt
    
    # 3. 计算 MD5
    # 通常网页端 JS 默认编码为 UTF-8
    md5_hash = hashlib.md5(plain_text.encode('utf-8')).hexdigest()
    
    return md5_hash

# 测试示例
# 假设 JS 传入的参数是 "123456"
# print(get_hex_md5_cracked("123456"))

但是这样写会有一个问题

这是一个非常经典的问题。导致结果不一致的原因不是"盐值"错了,而是**字符编码(Encoding)**的问题。

核心原因分析

  1. JavaScript 的处理方式
    在该混淆 JS 的 MD5 实现中,它会取字符串中每个字符的 charCodeAt() 值,并将其截断为低8位(0-255)。
    代码中的盐值包含 \xa3(£),其 ASCII/Unicode 码点是 163 。JS MD5 库会直接把它当作一个字节 0xA3 处理。
  2. Python utf-8 的处理方式(上次代码的错误点)
    在 Python 中,\xa3 是 Unicode 字符。如果你使用 .encode('utf-8'),它会被编码成两个字节0xC20xA3
    这导致了哈希的输入内容变了,所以结果完全不同。
  3. 解决方法
    必须使用 latin-1 (ISO-8859-1) 编码。这种编码方式会把 0-255 范围内的 Unicode 字符直接映射为单字节,与 JS 那个老旧 MD5 库的行为完全一致。

修正后的 Python 代码

请使用下面的代码,我修正了编码部分:

python 复制代码
import hashlib
import time

def get_challenge_sign(page, timestamp=None):
    # 1. 还原混淆代码中的盐值 (注意:这些是扩展ASCII字符)
    salt = "\xa3\xac\xa1\xa3fdjf,jkgfkl"
    
    # 2. 如果没有提供时间戳,生成一个(模拟 JS 的 new Date().getTime())
    if timestamp is None:
        timestamp = int(time.time() * 1000)
    
    # 3. 拼接字符串:timestamp + page + salt
    # JS逻辑: `${timestamp}${page}` + salt
    plain_text = f"{timestamp}{page}{salt}"
    
    # 4. 【关键步骤】使用 latin-1 编码,而不是 utf-8
    # 这样 \xa3 (163) 才会变成单字节 b'\xa3',而不是双字节 b'\xc2\xa3'
    input_bytes = plain_text.encode('latin-1')
    
    # 5. 计算 MD5
    sign = hashlib.md5(input_bytes).hexdigest()
    
    return sign, timestamp

# --- 验证环节 ---

# 假设我们在 JS 控制台手动测试,固定以下输入:
# timestamp = 1735200000000 (示例时间戳)
# page = 1
# JS 逻辑: hex_md5("17352000000001") -> 预期结果
# 输入字符串实际为: "17352000000001" + "\xa3\xac\xa1\xa3fdjf,jkgfkl"

test_ts = 1735200000000
test_page = 1
sign, _ = get_challenge_sign(test_page, test_ts)

print(f"输入参数: page={test_page}, timestamp={test_ts}")
print(f"生成的 sign: {sign}")

# 如果你的 JS 控制台结果是 "c32b12ac...",说明你当时的 timestamp 肯定不是我上面造的这个。
# 你可以用这行 Python 代码去验证你控制台里报错的那组数据(确保 timestamp 和 page 一致)。

为什么加上 encode('latin-1') 就对了?

  • **JS 里的 \xa3**:被视为单字节 0xA3 (十进制 163)。
  • **Python utf-8**\xa3 -> b'\xc2\xa3' (两个字节,导致 MD5 错乱)。
  • **Python latin-1**\xa3 -> b'\xa3' (一个字节,与 JS 一致)。
相关推荐
AAD555888994 小时前
数字仪表LCD显示识别与读数:数字0-9、小数点及单位kwh检测识别实战
python
微风中的麦穗6 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_949146536 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术6 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学6 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
Li emily7 小时前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
wfeqhfxz25887827 小时前
农田杂草检测与识别系统基于YOLO11实现六种杂草自动识别_1
python
mftang8 小时前
Python 字符串拼接成字节详解
开发语言·python
0思必得08 小时前
[Web自动化] Selenium设置相关执行文件路径
前端·爬虫·python·selenium·自动化
石去皿8 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展