最近在学习JS逆向。由于之前做过12306的自动抢票软件,所以对12306情有独钟,接下来介绍一下12306用户的登录密码。参数破解方法。首先我们打开12306的登录界面,打开抓包工具,输入用户名和一个错误的密码(例如:123456),点击登录按钮滑动验证码进行验证,在Ajax包中,我们可以点击登录包查看,我们可以发现密码参数是加密的,所以我们需要找到对应的加密后的js代码,分析其加密机制,用python实现。第一步点击开发者工具右上角的箭头表示位置,第二步找到搜索点击,下面会弹出一个搜索框,第三步在输入密码搜索框,第四步,点击旁边的搜索按钮,此时所有包含密码关键字的文件都在里面,我们点击从上到下依次查找每个文件,看看加密算法在哪里密码在文件中。经查询分析,密码的加密算法在第二个文件中,我们找到对应的JS代码,并设置断点。设置断点后,我们在这里输入用户名和密码,点击登录。这时,我们发现浏览器停在了断点位置,如下图:这时,我们仔细分析这行JS代码,发现最后生成的参数是由“@”加上“加密函数返回的结果。这个函数的第一个参数很明显就是我们输入的明文密码(123456),第二个参数就是我们的公钥,固定为SM4_key="tiekeyuankp12306",所以我们最终可以封装一个JS函数,代码如下:functiongetpwd(p){varSM4_key='tiekeyuankp12306';return'@'+encrypt_ecb(p,SM4_key)}console.log(getpwd('123456'))此时我们需要找到encrypt_ecb函数的具体实现。我们把鼠标放在函数上,点击箭头所指的加密函数。我们发现进入了一个加密函数文件,里面全是加密算法。经过分析,有我们需要的具体加密算法和解密算法,而这个文件的代码只有300多行,所以我们可以把它们全部提取出来,放到我们刚刚封装的函数中进行调试。运行代码后,发现程序报错,提示:base64jsisnotdefined,所以执行缺什么补什么的原则,补上base64js的相关代码部分。这时候我们继续按照刚才的方法查找base64js部分,找到了一个名为base64js的文件,只有100多行代码。这个时候我们把它全部复制到刚才运行的代码上面,再运行一次。我们发现还是报错。提示:base64js未定义。这时候有朋友要问了,我把base64js都放进去了,怎么还是不行呢?其实base64js对象比较复杂,在我们提取出来的JS代码中是无法识别的。仔细分析报错的地方,发现base64js的fromByteArray方法是函数P,但是我们直接用P函数替换是不可行的,会出现P函数未定义的错误也被举报。这时候仔细分析,发现base64js是完全可以替代的。首先我们把P函数复制到代码最上面,然后把代码中的base64js.fromByteArray(outArray)替换成P(outArray),运行提示l函数未定义,这时候复制部分找到l函数到代码顶部,再次运行调试,根据程序提示缺什么补什么的原则进行相应的补充。最后将补充的代码调试运行,结果如下:将JS代码打包成JS文件,使用python的execjs包运行js代码,直接调用JS文件中的getpwd函数,python代码如下:importexecjsf=open(r"test2.js",encoding='utf-8').read()ctx=execjs.compile(f)FuncName='getpwd'password=ctx.call(FuncName,'123456')print(password)初学者做JS逆向时,不要一味的提取代码,而是要学会分析JS代码,然后从简单开始练习,积累经验,慢慢的时候会越来越得心应手遇到加密参数。