Reverse-逆向操作03

摘要

本文内容转自网络,个人学习记录使用,请勿传播

声明:

  • 逆向主要的作用:
    • 1.数据的加密和解密的处理
    • 2.动态变化的请求参数
      • 都是通过js代码生成

试客联盟逆向分析

  • url:http://login.shikee.com/

  • 分析思路:

    • 输入了用户名和密码后,打开抓包工具,然后点击登录按钮发起请求,发现抓包工具捕获到一个数据包,从中可以看出password是加密的,因此需要对其进行搜索。

    • 在可以之处打断电,然后重新点击登录按钮发起请求,查看是否会停留在断点位置。

    • js代码的改写:

      • var formData = $(“#loginForm”).serializeArray();

        • 将等号右侧的内容选中,鼠标放上去,则显示该内容返回的结果是什么,返回的结果是一个数组,里面存储了4个元素(字典)。

        • 1
          2
          3
          4
          5
          6
          7
          #formData就是如下数组:
          [
          {name: 'username', value: 'bobo@qq.com'},
          {name: 'password', value: '123456'},
          {name: 'vcode', value: ''},
          {name: 'to', value: 'http://user.shikee.com/'}
          ]
      • 找寻rsa_n的值,这个值表示的是公钥,它要么是单独的请求获取的,要么隐藏在前台页面中。

        • 将断点取消,打开抓包工具,刷新等于页面,然后点击登录按钮。说明抓包工具捕获到了所有的数据包,然后contrl+f打开全局搜索框,搜索rsa_n定位该值对应的数据包即可!

        • 1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          #动态提取rsa_n的值
          import requests
          import re
          url = 'http://login.shikee.com/getkey?v=97434350dfd69718c42d82249257621d'
          headers = {
          'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
          }
          page_text = requests.get(url=url,headers=headers).text
          rsa_n = re.findall('var rsa_n = "(.*?)";',page_text)[0]
          print(rsa_n)
      • 完整代码:

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        import requests
        import re
        import execjs
        url = 'http://login.shikee.com/getkey?v=97434350dfd69718c42d82249257621d'
        headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
        }
        page_text = requests.get(url=url,headers=headers).text
        rsa_n = re.findall('var rsa_n = "(.*?)";',page_text)[0]

        node = execjs.get()
        fp = open('./shikelianmeng.js','r',encoding='utf-8')
        ctx = node.compile(fp.read())
        pwd = '123456'
        funcName = 'getPwd("%s","%s")'%(pwd,rsa_n)
        result = ctx.eval(funcName)
        print(result)

空中网

  • url:https://passport.kongzhong.com/

  • 分析:

    • 输入用户名和密码,点击登录按钮使用抓包工具捕获数据包。

    • 点击登录按钮后发起的是一个get请求,请求参数中的密码加密了,所以全局搜索password,在可以的位置打断点。

    • 通过逐一文件的分析,没有找到任何一个可以之处,为什么?

      • 核心逆向的js代码被混淆(js混淆)。

      • 什么是js混淆:

        • 网站的设计者,可以将核心的js代码进行单独编码或者加密,因此我们就无法直接定位到核心的js代码了。
      • 因此,我们是需要进行js反混淆之后,就可以看到明文形式的js核心代码了,因此就可以愉快的改写js代码进行逆向了。

        • 那么如何对js混淆的代码进行反混淆呢?

          • 使用浏览器开发工具自带的反混淆工具实现【自动反混淆】操作!

          • 如何操作:

            • 打开浏览器开发者工具,点击设置按钮

              • Snip20220324_42
            • 点上该对钩:

              • Snip20220324_43
            • 在抓包工具的全局搜索框中,重新搜索相关的关键字,重点找寻VMxxx的数据包,该数据包就是反混淆后的结果。

        • js改写:

          • 动态获取data[“dc”]的值,在抓包工具所有数据包的响应数据中查找。

            • 1
              2
              3
              4
              5
              6
              7
              8
              9
              10
              11
              12
              import re
              import json
              import execjs
              url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1648128700957'
              headers = {
              'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
              "Referer": "https://passport.kongzhong.com/",
              }
              page_text = requests.get(url=url,headers=headers).text
              dc_str = re.findall('KZLoginHandler.jsonpCallbackKongZ\((.*?)\)',page_text)[0]
              dc_obj = json.loads(dc_str)
              dc = dc_obj['dc']
      • 完整代码:

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        import requests
        import re
        import json
        import execjs
        url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1648128700957'
        headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
        "Referer": "https://passport.kongzhong.com/",
        }
        page_text = requests.get(url=url,headers=headers).text
        dc_str = re.findall('KZLoginHandler.jsonpCallbackKongZ\((.*?)\)',page_text)[0]
        dc_obj = json.loads(dc_str)
        dc = dc_obj['dc']

        node = execjs.get()
        fp = open('./kongzhongwang.js','r',encoding='utf-8')
        ctx = node.compile(fp.read())
        pwd = '123456'
        funcName = 'getPwd("%s","%s")'%(pwd,dc)
        result = ctx.eval(funcName)
        print(result)