网易游戏登录密码加密破解小试
source link: http://www.happyhong.cn/ni-xiang/10035.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
最近实在太忙,更新速度也慢了,今天得空网上冲浪一会,心血来潮打开了童年游戏大话西游官网,本想看看有什么变化,发个帖抱怨一下为啥还不开怀旧服,就在登录之际又忍不住按下了F12,跟我想的一样,的确是把密码加密了,那好吧,等我把JS代码扣完再去发帖吧,觉得有帮助关注一下知识图谱与大数据公众号吧,当然不关注也无所谓。
依然有完整JS代码,点击这里从今天开始种树,还是熟悉的rsa加密,有兴趣的可以跟着东扣扣西扣扣,锻炼一下,整个过程不难。
打开登录界面,输入错误的账号密码(图中的账号均为虚构)。
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
代码的文章,当然不关注也无所谓。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK