1. 程式人生 > >網易遊戲登入密碼加密破解小試

網易遊戲登入密碼加密破解小試

> 最近實在太忙,更新速度也慢了,今天得空網上衝浪一會,心血來潮打開了童年遊戲大話西遊官網,本想看看有什麼變化,發個帖抱怨一下為啥還不開懷舊服,就在登入之際又忍不住按下了F12,跟我想的一樣,的確是把密碼加密了,那好吧,等我把JS程式碼扣完再去發帖吧,覺得有幫助關注一下**知識圖譜與大資料**公眾號吧,當然不關注也無所謂。 ## 前言 依然有完整JS程式碼,[原文連結](https://mp.weixin.qq.com/s/y6219xqEb9Y3CkdWiyS6vQ),點選文末閱讀更多即可,還是熟悉的rsa加密,有興趣的可以跟著東扣扣西扣扣,鍛鍊一下,整個過程不難。登入地址請跳到執行章節,在python程式碼裡有。。 ## 直入正題 開啟登入介面,輸入錯誤的賬號密碼(圖中的賬號均為虛構)。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923215721768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 目的當然是檢視提交的資料裡有沒有加密的,找到其提交`url`,如下所示: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923215846807.png#pic_center) 右側往下拉一點即可看到提交的引數,這次有點不一樣,提交的引數並不是`FormData`形式,不過也不影響,如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923220007505.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 仔細看一下,大概可以知道`pw`是密碼加密結果,`un`是賬號,其它幾個引數暫時可以看成是固定的(一樣也可以通過除錯得到),今天主要是`pw`即密碼解密,接下來可以通過呼叫棧進去,呼叫棧進去也可以稍微利用一點技巧,比如可以檢視方法名,我們現在是在解密登入,那我們就可以通過方法名裡有類似`login`的進去。如下圖所示: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923220409881.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 進去以後你可能會迫不及待的像往常一樣查詢`pw`關鍵字,其實通過關鍵字也能猜到這樣查詢是能找到,當時要耗費不少精力,畢竟`pw`只有兩個字母太容易與其它單詞匹配了: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923220820358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 是不是,一下子匹配了`113`個地方,你當然可以一下一下點了,這樣細心點也能找到,只不過費點時間而已,還有一個方法,現在我們已經知道密碼是被加密了,那我們就搜尋關於加密的單詞,類似`encrypt`,這是一個經驗,大家可以掌握,試著搜一下`encrypt`: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923221130481.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 一共搜到`16`處,這可比`113`少多了吧,手再也不酸了,,因為以後還會遇到很多引數名只有一個字母或者兩個的情況,這算是一個比較有意思的方法吧。接下來我們在幾個比較懷疑的`encrypt`打上斷點,一共有三處,為什麼這麼說,看下面程式碼,是不是都很像要找的(截圖麻煩,我直接把程式碼放下面了): ```javascript n.pw = MP.encrypt2(this.__password);//第一處 t.pw = MP.encrypt2(this.$refs.mpinput._$getValue() || "0");//第二處 t.pw = MP.encrypt2(n);//第三處 ``` ## 進入除錯 在前面我們已經在幾個可以點打上了斷點,接下來就可以除錯了,啟用斷點(即輸入賬號密碼,點選登入),果不其然,跳到了其中一個斷點: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923221822138.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 那就是這裡嘍,單步執行下去,進入加密函式`encrypt2`: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923221859874.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 其中`encrypt2`的引數`e`為你輸入的密碼,除錯了幾次發現這裡`getPublicKey`引數`p`其實也是個固定值,一共需要摳的主函式也就兩個,一個`encrypt`和`getPublicKey`,`p`值請看下圖: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923222421127.png#pic_center) 繼續執行,進入設定`getPublicKey`函式: ```javascript 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`函式: ```javascript 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)`等等這些,難點是這些方法裡面還嵌套了其它方法,容易的地方是這些方法基本都在一起,再提一個摳程式碼的小技巧,摳的時候可以找到你想要的函式,點一下函式的大括號,括號下面會有橫線,這時候你就可以確定摳到哪裡了,因為結尾的大括號下面也會有橫線,聽不明白沒關係,看一下下圖就理解了: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020092322443817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) 我這裡就不列出所有程式碼了,大家有興趣的可以關注**知識圖譜與大資料**公眾號,找到這篇文章,點選文末的閱讀原文即可看到完整`JS`程式碼。 ## 執行 相信大家都能摳出來,摳完就可以通過`python`執行,上盤古時期程式碼: ```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) ``` 執行結果如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923223513293.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_center) ## 結束 摳`rsa`的程式碼的確要比`md5`要費點時間,不過只要細心都能摳出來,摳不出來的點即文末閱讀原文即可。覺得有幫助關注一下**知識圖譜與大資料**公眾號吧,有大量摳`JS`程式碼的文章,當然不關注也無所謂。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200923223652856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2h1YTEzOTUw,size_16,color_FFFFFF,t_70#pic_