Reverse-逆向操作02

摘要

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

STEAM逆向分析

  • url:https://store.steampowered.com/login/?redir=&redir_ssl=1

  • 分析思路:

    • 输入用户名和密码后,点击登录按钮,通过抓包工具捕获点击登录按钮后发起请求对应的相关数据包。

    • 定位了登录的数据包:

      • 发现只有密码是加密的,因此需要对密码进行逆向,加密的密码对应的请求参数名称是:password,接下来打开全局搜索框,搜索password即可。
    • 打开全局搜索框:

      • 点击右上角的三个点,打开search表示的全局搜索框即可,在其内部搜索password。
      • 在进行了password全局搜索后,定位了一批的数据包,在这些数据包中重点关注js文件对应的代码,在其内部找寻加密解密的相关操作。
        • 如果定位到了一个数据包,记得点击左下角的大括号进行js文件代码的格式化显示。
        • 在该数据包内部代码中点击一下,按下contrl+f进行局部搜索,搜索password即可,在可以位置打下断点即可!
        • 在可以之处打上断点后,需要基于抓包工具进行请求的重新发送,查看是否会停留在断点的位置。
          • Snip20220322_29
          • 看到是调用了RSA的encryt进行数据加密,该函数有两个参数,参数1是明文密码(已知),参数2是pubkey公钥,公钥具体的数值(未知)。
    • 如果断点生效,下一步进行js改写

    • 重要的经验分享:

      • js的内置对象有:window,document,navigator
      • 在js改写的过程中,如果出现了上述内置对象未定义的情况,直接给该内置对象赋值this即可!window = this; navigator = this;
    • 改写成功后的js代码:

    • 1
      见项目代码
    • 小问题:上述改写的js代码中,getPublicKey函数需要的公钥是写死在程序中,如何实现动态获取公钥的数据呢?

      • 公钥和私钥都不会明文的写在程序中,网站中加密算法的公钥/私钥一般都是隐藏在前台的html页面中或者是通过单独的请求获取的!

      • 重新改写好的最终js代码:

      • 1
        见项目代码
      • 完整的python代码:

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        import requests
        #动态获取rsa的公钥数据
        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',
        }
        url = 'https://store.steampowered.com/login/getrsakey/'
        data = {
        "donotcache": "1647951542258",
        "username": "bobo@qq.com"
        }
        json_data = requests.post(url,headers=headers,data=data).json()
        mod = json_data['publickey_mod']
        exp = json_data['publickey_exp']

        import execjs
        node = execjs.get()
        fp = open('steam.js','r',encoding='utf-8')
        ctx = node.compile(fp.read())
        pwd = "123456"
        jsFunc = 'getPwd("%s","%s","%s")'%(pwd,mod,exp)
        result = ctx.eval(jsFunc)
        print(result)

完美世界逆向分析

  • url:https://passport.wanmei.com/login?location=L3NhZmUv

    • 定位到正确的断点位置
    • 进行js改写操作
      • 断点代码的关键字:setPublicKey,encrpt
        • 通过这两个关键字确定该算法为非对称秘钥加密算法!
      • 注意:e.setPublicKey($(‘#e’).val()); 该行代码是在设置公钥,因此函数的参数应该是公钥表示的字符串。$(‘#e’).val()就是公钥表示的字符串。$(‘#e’).val()的意思是,获取id为e的标签中存储的数据值,将该数据值作为公钥使用。
  • 注意:直接将js代码粘贴到发条改写工具中,可能会出现编码问题,则可以将js代码先粘贴到pycharm中,再将pycharm中的代码复制粘贴到发条改写工具中,不要点击格式化按钮,然后直接点击加载代码按钮,会出现一个错,定位在了s = “…”,可以将该行代码删除,自己重新写一遍即可!至此编码问题就解决了!

  • python代码

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      import execjs
      node = execjs.get()
      fp = open('wanmeishijie.js','r',encoding='utf-8')
      ctx = node.compile(fp.read())
      pwd = "123456"
      key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjfeE0MIYsZes/HwV06/kvRw34Hmhn9WPt0feLPp1PVqdqZz1/xFvPPEAJ/lAvfqt5kyn+A06bvYXIhizTjlOzPgLE4897ihuSYXgfwcUshPZvydRLbftU6Exj5SLbv5tw4GInbgQv7RWLWOKyQA81q6lWae2Kcgd1XpDRsQNXVwIDAQAB"
      jsFunc = 'getPwd("%s","%s")'%(pwd,key)
      result = ctx.eval(jsFunc)
      print(result)