JavaScript逆向实战:12306登录密码SM4加密参数破解详解

作者:白帽猫时间:2026-10-25 13:09:41浏览:320

本文详细解析12306网站登录密码的加密机制,通过浏览器开发者工具定位password参数的JS加密逻辑。重点分析SM4 ECB模式加密过程,提取encrypt_ecb及base64相关依赖代码,封装为独立JS文件。最后利用Python的execjs模块调用该函数,实现明文密码到加密参数的逆向转换,为自动化脚本开发提供参考。

12306登录密码逆向分析概述

基于此前开发12306自动抢票软件的经验,本文重点探讨12306用户登录密码参数的逆向破解方法。

12306登录密码逆向分析概述

在掌握JS逆向技术的过程中,针对12306登录接口的密码加密机制进行深入研究,旨在分享具体的参数破解方案。

首先访问12306登录页面,启动抓包工具。输入用户名及错误密码(如123456),点击登录并滑动验证码。在Ajax请求中定位login接口,观察到password参数已进行加密处理。因此,需定位对应的加密JS源码,解析其加密逻辑,并使用Python复现该过程。

12306登录密码逆向分析概述

定位加密参数与JS代码

第一步,点击开发者工具右上角的箭头图标;第二步,点击search按钮;第三步,在弹出的搜索框中输入password;第四步,点击搜索按钮。此时列表显示所有包含password关键词的文件,需逐一检查这些文件,定位password加密算法的具体代码位置。

12306登录密码逆向分析概述

经排查,password加密算法位于第二个文件中。定位到相关JS代码后,在此处设置断点。

12306登录密码逆向分析概述

设置断点后,重新输入用户名和密码并点击登录,浏览器执行流将暂停在该断点处。

具体界面表现如下图所示:

12306登录密码逆向分析概述

仔细分析该行JS代码,可见最终生成的参数由"@"符号与一个加密函数的返回值拼接而成。该函数的第一个参数为输入的明文密码(如123456),第二个参数为固定公钥SM4_key,其值为"tiekeyuankp12306"。据此,可封装一个JS函数。

核心代码逻辑如下:

核心加密函数封装与调试

function getpwd(p){
    var SM4_key = 'tiekeyuankp12306';
        return '@' + encrypt_ecb(p, SM4_key)
            }
console.log(getpwd('123456'))

接下来需找到encrypt_ecb函数的具体实现。将鼠标悬停于该函数名处,点击箭头指向的加密函数定义处,可跳转至包含完整加密算法的文件。

12306登录密码逆向分析概述

分析该文件,其中包含所需的加密和解密算法。由于代码仅300余行,可将其全部提取并插入至前述封装函数的上方进行调试。运行代码后报错,提示base64js未定义。遵循“缺什么补什么”的原则,需补充base64js相关代码。

12306登录密码逆向分析概述

按前述方式搜索base64js,发现一个名为base64js的文件,代码量100余行。将其全部复制到当前运行代码的最上方,再次运行仍报错,提示base64js未定义。

此时可能产生疑问:既然已引入base64js代码为何仍报错?实际上,base64js对象结构复杂,直接嵌入的JS代码无法正确识别。进一步分析报错位置,发现base64js.fromByteArray方法实际对应函数P。但直接将整个base64js替换为P函数不可行,因为会引发P函数未定义的错误。

深入分析后,可完全替换base64js对象。具体操作为:将P函数复制至代码最上方,并将原代码中的base64js.fromByteArray(outArray)替换为P(outArray)。运行后提示l函数未定义,此时需寻找l函数的定义并复制至代码上方。再次运行调试,依据程序报错提示,遵循“缺什么补什么”原则,逐步补充缺失的函数定义。

12306登录密码逆向分析概述

完成所有缺失代码的补充后,再次调试运行,结果如下:

12306登录密码逆向分析概述

Python调用JS实现加密

将上述JS代码打包为一个独立的JS文件。利用Python的execjs库执行JS代码,直接调用JS文件中的getpwd函数即可获取加密后的密码。

Python调用代码如下:

import execjs
f = open(r"test2.js", encoding='utf-8').read()
ctx = execjs.compile(f)
FuncName = 'getpwd'
password = ctx.call(FuncName, '123456')
print(password)

在JS逆向入门阶段,切忌盲目复制代码,应注重分析JS逻辑,从简单案例入手练习,积累经验。随着经验积累,处理各类加密参数时将更加游刃有余。

至此,关于JavaScript逆向破解12306登录密码的案例分析结束。如需了解更多JavaScript破解密码相关内容,建议搜索本站往期文章或继续阅读后续系列教程,感谢支持。

作者最新文章