js逆向--PyExecJS模拟执行javascript破解MD5加密网站(6)
一.立创网站分析
下面结合立创网站的案例来分析:访问:https://so.szlcsc.com/global.html?k=LM358 这个网站,作用是查询"LM358"关键词相关的物料价格信息。通过浏览器开发工具知道,物料价格数据是通过ajax的https://so.szlcsc.com/product/price/stock post 获取到的, 其中的参数s是通过加密的,如下所示:
1.javascript逆向的调试分析
步骤1:添加XHR的断点,也就是ajax的地址,如下所示
步骤2:在浏览器中刷新上面的访问地址,此时会自动在下面的a.send(xx)处断点,查看调用堆栈,在ajax下的匿名处(2)点击,代码跳到了(3)处,此时找到了关键入口。
步骤3:开始分析加密逻辑,分析关键的代码
将so.ca1c02ae.js文件保存到本地后用vs code打开,用于分析和打印调试,具体做好参考:js逆向--改写javascript文件(4)
1)下面是列出了ajax请求关键代码:
var u = !1 , d = null , f = function(t, o, n) { return new Promise((function(s, i) { (d || u) && clearTimeout(d), d = setTimeout((function() { !function() { u = !0; var a = Date.now() , c = (0, r.default)("".concat(t.map((function(e) { return e.productSignId } )).toString(), ",").concat(a, ",").concat(o)); e.ajax({ type: "POST", url: "/product/price/stock", dataType: "json", contentType: "application/json", data: JSON.stringify({ pidList: t, currTime: a, s: c, priceStockUuid: n }), success: function(e) { s(e) }, error: function(e) { i(e) } }) }() } ), 500) } )) }
f对象接收三个参数,t,o,n 三个参数, 这三个参数都好获取到,其中:
t参数是一个数组,包含了产品id,和产品签名,如下所示:
o参数和n参数,也能在源码中找到,也就是说,在进行ajax请求前,必需先请求文档,把三个参数获取下来。
2)在上面的f对象中生成了加密参数,下面分析:
上面的r.default是加密的一个函数,加上断点进来后,鼠标移到该函数,显示点击跳到4488行,如下所示
跳到4488行后,我在里面加了打印,刷新浏览器请求地址,看到打印效果如下所示:
入参o是:产品签名+时间戳(毫秒)+源码中<input type="hidden" id="salt" value="12E4B291B2C24151896D7C2191509153" /> value每次都会变
函数中的e参数是hex加密类型
函数中的t对象调用update方法,获取加密参数,t对象是一个加密标准库如下所示:
通过点击行4451跳到的是一个标准加密库,立创网站注释了加密的github地址:https://github.com/emn178/js-md5,测试出来加密效果一样
这样完整的分析就圆满结束了。
二.编写加密js文件
1. 文件准备
获取源文件地址:https://github.com/emn178/js-md5/blob/master/src/md5.js
将文件内容命名一个全局的变量md5, 放在demo网站中 <script src="~/lib/md5.js"></script>, 启动网站,打开浏览器开发工具,测试ok,如下所示:
2.修改md5.js文件
添加全局的变量名称mymd5,具体操作见:js逆向--PyExecJS模拟执行javascript(6)破解js完整文件
三.使用PyExecJS执行
准备环境工作见第5章,执行md5.js文件,在python中执行加密代码 如下所示:
def get_js_token(self,md5_str): file_name = "realtime_python_crawler/vendor/md5.js" context1 = execjs.compile(self.__js_from_file(file_name)) result = context1.call('mymd5', md5_str) return result # 读取js内容 def __js_from_file(self, file_name): with open(file_name, 'r', encoding='UTF-8-sig') as file: result = file.read() return result
加密前需要的字符串哪下所示
result加密后结果如下:
到这里就结束了js逆向,以及如何实现的过程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2018-08-07 mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)