网易游戏登录密码加密破解小试
作者:互联网
最近实在太忙,更新速度也慢了,今天得空网上冲浪一会,心血来潮打开了童年游戏大话西游官网,本想看看有什么变化,发个帖抱怨一下为啥还不开怀旧服,就在登录之际又忍不住按下了F12,跟我想的一样,的确是把密码加密了,那好吧,等我把JS代码扣完再去发帖吧,觉得有帮助关注一下知识图谱与大数据公众号吧,当然不关注也无所谓。
前言
依然有完整JS代码,原文链接,点击文末阅读更多即可,还是熟悉的rsa加密,有兴趣的可以跟着东扣扣西扣扣,锻炼一下,整个过程不难。登录地址请跳到运行章节,在python代码里有。。
直入正题
打开登录界面,输入错误的账号密码(图中的账号均为虚构)。
目的当然是查看提交的数据里有没有加密的,找到其提交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
其实也是个固定值,一共需要抠的主函数也就两个,一个encrypt
和getPublicKey
,p
值请看下图:
继续运行,进入设置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))
}
到这里大家应该都知道要扣哪些了吧,对,就是getPublicKey
和encrypt
里面使用到的一些小函数,比如Base64.decode(e)
、Hex.decode(e)
等等这些,难点是这些方法里面还嵌套了其它方法,容易的地方是这些方法基本都在一起,再提一个抠代码的小技巧,抠的时候可以找到你想要的函数,点一下函数的大括号,括号下面会有横线,这时候你就可以确定抠到哪里了,因为结尾的大括号下面也会有横线,听不明白没关系,看一下下图就理解了:
我这里就不列出所有代码了,大家有兴趣的可以关注知识图谱与大数据公众号,找到这篇文章,点击文末的阅读原文即可看到完整JS
代码。
运行
相信大家都能抠出来,抠完就可以通过python
运行,上盘古时期代码:
import execjs
#url = http://xy2.netease.com/member.php?mod=logging&action=login
with 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
代码的文章,当然不关注也无所谓。
标签:return,pw,代码,getPublicKey,encrypt,小试,破解,加密 来源: https://www.cnblogs.com/luohua13950/p/13820350.html