兄弟,別再爬妹子圖了整點JS逆向吧--陸金所密碼加密破解


好久沒有寫爬蟲文章了,今晚上得空看了一下陸金所登錄密碼加密,這個網站js加密代碼不難,適合練手,篇幅有限,完整js代碼我放在了這里從今天開始種樹,不廢話,直接開整。

前戲熱身

打開陸金所網站,點擊到登陸界面,長這樣:
在這里插入圖片描述
按F12打開工具,再登錄隨便輸入一個號碼和密碼,點擊登錄按鈕,查看發送的請求:
在這里插入圖片描述
一共有3個,從請求名稱上也看的出來哪個是登錄請求(看不出來的話一個一個點擊),拉下來,看看提交的FormData:
在這里插入圖片描述
我輸的密碼是123,可以看出來這里把password加密了,既然加密了那我們就去js文件里找找加密方法唄。

激戰開始

切換到Sources,按下圖點擊search
在這里插入圖片描述
出現搜索框:
在這里插入圖片描述
都知道要搜哪個關鍵字吧,搜索關鍵詞無非就是FormData里有的或者encrypt之類的,當我們搜索password就出現了諸多js文件,仔細篩選,基本能通過js文件名進行猜測了,比如下圖中的這個文件已經指明了login,點擊紅框中這個js文件。
在這里插入圖片描述
打開了上圖中的js文件,如下圖繼續搜索password
在這里插入圖片描述
如上圖,這個文件一共有6處password,只有上圖紅框中的最像加密代碼,這里把搜索到的js代碼摘出來,大家可以仔細查看一下:

 rsaChg: function() {
        if ($("#pwd").val()) {
            var e = new RSAKey;
            e.setPublic($("#publicKey").val(), $("#rsaExponent").val());
            var a = e.encrypt($("#pwd").val());
            $("#password").val(a),
            $("#pwd").val("************")
        }
    },

到這里基本就確定加密方法就是encrypt,那就開始調試了,在91行這里打個斷點。
在這里插入圖片描述
老辦法,在登錄界面輸入手機號和錯誤的密碼,點擊登錄后就會跳轉到91行斷點這里,如下圖。
在這里插入圖片描述
點擊下圖中按鈕跳到下一步,應該會跳轉到setPublic函數中:
在這里插入圖片描述

setPublic進行了一番設置,這里的。
在這里插入圖片描述
這里的這兩個值是固定的,后面扣js代碼的時候直接寫死即可。

 var t = "BE24E372DC1B329633A6A014A7C02797915E3C363DD6EE119377BD645329B7E6446B4A71AC5F878EBC870C6D8BFD3C06B92E6C6E93390B34192A7A9E430800091761473FAC2CC0A68A828B2589A8CB729C19161E8E27F4C0F3CDE9701FAFE48D2B65947799072AFA6A3F2D7BDBEF8B6D7429C2D115A3E5F723467D57B3AC6967"
var i = "10001"

一路狂點下一步,直到進入encrypt中,其實是進入了RSAEncrypt,不過這兩個函數是等價的,
在這里插入圖片描述
上圖中我一共標了3個數字代表RSAEncrypt需要調用的三個函數,用函數名在這個js文件里搜索一下,只要將這三個函數里涉及的小函數都扣出來就可以組成一個js文件了:
函數一:pkcs1pad2是關於密碼處理的。

function pkcs1pad2(t, e) {
    if (e < t.length + 2)
        return alert("密碼太長!"),
        null;
    var r = new Array
      , n = t.length - 1
      , i = t.length;
    if (!(i < 100))
        return alert("密碼太長!"),
        null;
    r[0] = 48 + i / 10,
    r[1] = 48 + i % 10;
    var o = 2;
    for (n = 0; n < i && e > 0; )
        r[o++] = t.charCodeAt(n++);
    for (var a = new SecureRandom, s = new Array; o < e; ) {
        for (s[0] = 0; 0 == s[0]; )
            a.nextBytes(s);
        r[o++] = s[0]
    }
    return new BigInteger(r)
}

函數2:bnBitLength

function bnBitLength() {
    return this.t <= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM)
}

函數3:doPublic等於RSADoPublic,所以找到RSADoPublic,可以看出encrypt也是等於RSAEncrypt的,所以剛才我才說這兩個是等價的。

RSAKey.prototype.doPublic = RSADoPublic,
RSAKey.prototype.setPublic = RSASetPublic,
RSAKey.prototype.encrypt = RSAEncrypt;

這是RSADoPublic

function RSADoPublic(t) {
    return t.modPowInt(this.e, this.n)
}

繼續調試encrypt,返回的n其實就是加密結果。
在這里插入圖片描述
得到了一串加密數據。
在這里插入圖片描述
Network里看看:

在這里插入圖片描述
如果你是一步一步調試的到這里,其實已經可以把涉及到的代碼摘出來放一個js文件里了,需要注意的是代碼中難免出現windownavigator,有一個取巧的辦法就是將其設置為如下方式:

 window = this;
navigator={}
....
//篇幅有限,省略了
....
//自寫的加密函數
function pwd(password) {
    var e = new RSAKey;
    var t = "BE24E372DC1B329633A6A014A7C02797915E3C363DD6EE119377BD645329B7E6446B4A71AC5F878EBC870C6D8BFD3C06B92E6C6E93390B34192A7A9E430800091761473FAC2CC0A68A828B2589A8CB729C19161E8E27F4C0F3CDE9701FAFE48D2B65947799072AFA6A3F2D7BDBEF8B6D7429C2D115A3E5F723467D57B3AC6967"
    var i = "10001"
    e.setPublic(t,i)
    var a = e.encrypt(password);
    return a

}

python調用

這里需要引入execjs,安裝方法上一篇爬蟲文章里提過了。

import execjs

with open('..//js//lujinsuo.js', encoding='utf-8') as f:
    lujinsuo= f.read()
js = execjs.compile(lujinsuo)
logid = js.call('pwd', "123456")
print(logid)

運行如下,
在這里插入圖片描述

結束

本文只是介紹了其中password加密的方式,此網站比較簡單,適合初學js逆向入手,更多內容請訪問從今天開始種樹,關注下面的公眾號,當然不關注也無所謂。
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM