网易游戏登录密码加密破解小试

需要内部号点右面-->:申请入口

需要内部号点右面-->:申请入口

需要内部号点右面-->:申请入口

最近实在太忙,更新速度也慢了,今天得空网上冲浪一会,心血来潮打开了童年游戏大话西游官网,本想看看有什么变化,发个帖抱怨一下为啥还不开怀旧服,就在登录之际又忍不住按下了F12,跟我想的一样,的确是把密码加密了,那好吧,等我把JS代码扣完再去发帖吧,觉得有帮助关注一下知识图谱与大数据公众号吧,回复“网易”即可查看网易相关文章,当然不关注也无所谓。

前言

依然有完整JS代码,点击这里:

需要内部号点右面-->:申请入口

直入正题

打开登录界面,输入错误的账号密码(图中的账号均为虚构)。


目的当然是查看提交的数据里有没有加密的,找到其提交url,如下所示:



右侧往下拉一点即可看到提交的参数,这次有点不一样,提交的参数并不是FormData形式,不过也不影响,如下:



仔细看一下,大概可以知道pw是密码加密结果,un是账号,其它几个参数暂时可以看成是固定的一样也可以通过调试得到一样也可以通过调试得到,今天主要是pw即密码解密,接下来可以通过调用栈进去,调用栈进去也可以稍微利用一点技巧,比如可以查看方法名,我们现在是在解密登录,那我们就可以通过方法名里有类似login的进去。如下图所示:



进去以后你可能会迫不及待的像往常一样查找pw关键字,其实通过关键字也能猜到这样查找是能找到,当时要耗费不少精力,毕竟pw只有两个字母太容易与其它单词匹配了:



是不是,一下子匹配了113个地方,你当然可以一下一下点了,这样细心点也能找到,只不过费点时间而已,还有一个方法,现在我们已经知道密码是被加密了,那我们就搜索关于加密的单词,类似encrypt,这是一个经验,大家可以掌握,试着搜一下encrypt



一共搜到16处,这可比113少多了吧,手再也不酸了,,因为以后还会遇到很多参数名只有一个字母或者两个的情况,这算是一个比较有意思的方法吧。接下来我们在几个比较怀疑的encrypt打上断点,一共有三处,为什么这么说,看下面代码,是不是都很像要找的(截图麻烦,我直接把代码放下面了):


n.pw = MP.encrypt2(this.__password);//第一处 t.pw = MP.encrypt2(this.$refs.mpinput._$getValue() || "0");//第二处 
t.pw = MP.encrypt2(n);//第三处

进入调试

在前面我们已经在几个怀疑点打上了断点,接下来就可以调试了,激活断点(即输入账号密码,点击登录),果不其然,跳到了其中一个断点:




那就是这里喽,单步运行下去,进入加密函数encrypt2



其中encrypt2的参数e为你输入的密码,调试了几次发现这里getPublicKey参数p其实也是个固定值,一共需要抠的主函数也就两个,一个encryptgetPublicKeyp值请看下图:



继续运行,进入设置getPublicKey函数:


  getPublicKey: function(e) {
        if (e.length < 50)
            return !1;
        if ("-----BEGIN PUBLIC KEY-----" != e.substr(0, 26))
            return !1;
        e = e.substr(26);
        if ("-----END PUBLIC KEY-----" != e.substr(e.length - 24))
            return !1;
        e = e.substr(0, e.length - 24);
        e = new ASN1Data(Base64.decode(e));
        if (e.error)
            return !1;
        e = e.data;
        if ("1.2.840.113549.1.1.1" == e[0][0][0])
            return new RSAPublicKey(e[0][1][0][0],e[0][1][0][1]);
        else
            return !1
    }

encrypt函数:

   encrypt: function(e, t) {
        if (!t)
            return !1;
        var i = t.modulus.bitLength() + 7 >> 3;
        e = this.pkcs1pad2(e, i);
        if (!e)
            return !1;
        e = e.modPowInt(t.encryptionExponent, t.modulus);
        if (!e)
            return !1;
        e = e.toString(16);
        for (; e.length < 2 * i; )
            e = "0" + e;
        return Base64.encode(Hex.decode(e))
    }

到这里大家应该都知道要扣哪些了吧,对,就是getPublicKeyencrypt里面使用到的一些小函数,比如Base64.decode(e)Hex.decode(e)等等这些,坏消息是这些方法里面还嵌套了其它方法,好消息是这些方法基本都在一起。再提一个抠代码的小技巧,抠的时候可以找到你想要的函数,点一下函数的大括号,括号下面会有横线,这时候你就可以确定抠到哪里了,因为结尾的大括号下面也会有横线,听不明白没关系,看一下下图就理解了:




我这里就不列出所有代码了,大家有兴趣的可以关注知识图谱与大数据公众号,找到这篇文章,点击文末的阅读原文即可看到完整JS代码。

运行

相信大家都能抠出来,抠完就可以通过python运行,上盘古时期代码:

import execjs#url = http://xy2.netease.com/member.php?mod=logging&action=loginwith open('..//js//dahuaxiyou.js', encoding='utf-8') as f:
    dahuaxiyou = f.read()js = execjs.compile(dahuaxiyou)logid = js.call('get_pwd', "qwerqwrqrq")print(logid)

运行结果如下:



结束

rsa的代码的确要比md5要费点时间,不过只要细心都能抠出来,抠不出来的点即文末阅读原文即可。觉得有帮助关注一下知识图谱与大数据公众号吧,有大量抠JS代码的文章,当然不关注也无所谓。




本站文章除注明原创外均整理自互联网,不代表本站立场,如有错误或侵权,请联系管理员,本文链接:https://www.daqmw.com/gonglue/4716.html

上一篇 2023-06-21
下一篇 2023-06-21

相关推荐

  • 0.1折扣游戏平台

    2023年来游戏行业,特别是手机游戏中,出了好多重磅消息。特别是0.1折手游的上线,吸引了大量玩家的兴趣,充100元只需要支付1元。目前很多0.1折精品手游市面上还找不到。

    2023-06-21 00:00:00
    11753
  • 幻世九歌

    需要手游内部福利号到网站首页联系客服>>>点击这里<<<

    2023-06-21 00:00:00
    8890