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逆向,以及如何实现的过程。

 

posted on 2023-08-07 16:14  花阴偷移  阅读(71)  评论(0编辑  收藏  举报

导航