企名片數據加密javascript逆向實戰

  哈羅、哈羅!咱們又見面了,五一的假期是否還讓你沉浸在其中無法自撥呢?如果不用上班就能躺着掙錢該多好呀~當然!現在還是白天呢,請不要想太多哦

  五一假期的時候,有一位讀者找到了我,大致找我幹什麼呢?其實剛開始我也是很迷。我除了會寫個爬蟲跟段子實在想不到自身還有何優點呀!難道是我那該死的溫柔??果不其然,專業的事情還是找到了我這個不專業的人。事情的經過它是這樣子的:

讀者:大佬!想問問你企業名片的數據那個加密怎麼破解啊,我發現接口返回的數據是經過加密處理過的,雖然我寫了一個Selenium版本的,能採集數據吧,就是慢!而且看着也很low一樣。感覺自己就不是一個合格的爬蟲工程師,作爲一入坑爬蟲沒多久的我來說JS逆向壓根沒有思路…

都叫我大佬了,就算你不是妹子!今天這事我肯定得給你辦嘍!再不專業我現學現賣也要厚着臉皮上!

在這裏插入圖片描述
  起初我還是幫在Github跟一些博客找了相關的參考資料給她想着能打開她的一些思路,但是我發現事情並不是這樣的。一個對逆向基本思路沒有相關經驗跟思路的她可能並不知道如何找到切入點,先幹嘛?再幹嘛?甚至是在Chrome內基本的調試操作都不太清楚—

最重要的一點是:參考的資料只包含了對數據加密破解的思路跟講解,而這個網站在登陸的情況下對IP不僅有反爬措施更會凍結你的賬號。所以呢!我就做了一把雷鋒,把整個網站的爬蟲代碼都擼了出來,請看大屏幕:
在這裏插入圖片描述

來!不說那些沒用的。整點實際的給大家。對了!完整代碼僅供學習參考使用,有需要可以聯繫作者獲取

首先打開她給我發的鏈接企名片,在未登陸的情況下看到網站確實是有一些讓爬蟲迷失自我的數據。嘿!你左手右手一個慢動作,跟着我的操作一起走呀!光看着也不抵用噻

刷新頁面,開發者工具打開,可以發現網頁是js動態生成的,並沒有發現你咱們想要的HTML。象徵性的點擊一下查看響應數據
在這裏插入圖片描述
  我不知道productListVip這個接口內的響應數據是不是就有網站我們需要的數據!但是可以看到有一個數encrypt_data是經過處理的,初步看這只是一個Base64的編碼,真的這麼簡單嗎?我想它在編碼之前是經過加密算法處理過的。因爲很多網站對數據加密或多或少都是這樣的套路,所以爲了驗證這個被處理的東東到底是個啥,我們需要先去破解它

這個過程是快樂的,當然!它建立在你成功或有收穫的基礎之上。不然用Selenium來做它難道不香嗎?還要什麼自行車?

  參數encrypt_data既然是經過處理的,但是終歸是要給用戶看的,所以在它呈現到網頁過程中肯定是有在中間的某個地方對這個數據做了對應的解密操作,不然搞一頓Base64的編碼數據給用戶看?畢竟大家不是程序員呀!

之前說到過對於一些請求、響應…參數加密的這種場景,去反推的思路有很多種,可以通過搜索關鍵字、也可以通過hook、也可以斷點。思路是這樣的,具體因站而異哈

既然是JS生成我們在開發者工具中點擊Sources,因爲現在加密參數的那個請求它就是XHR,所以在右側XHR斷點調試欄添加它,這個功能支持XHR請求斷點調試在這裏插入圖片描述

OK!做好上面的一切我們刷新網站頁面。然後斷點跟預期中的一樣,停了下來。我們單步跟進可以很直觀的看到每一個參數傳遞的細節,直到發現了跟接口響應數據極度相似的參數e.data
在這裏插入圖片描述
繼續跟進發現e.data參數的數據通過一個函數實現。可以在Console中將這個函數調用執行一下。沒錯!函數Obiect(u.a)(e.encrypt_data)返回的內容正是網站頁面呈現的數據。到了這一步我們能確定接口就是數據加載的接口,Base64編碼也正是經過加密之後的數據
在這裏插入圖片描述
既然現在我們已經找到了真實的數據,那就證明它在呈現的時候就已經解密了,我們進到這個函數體內去繼續尋找,發現瞭解密函數

function o(t)是一個解密函數,可以看到它先調用s函數,s函數是什麼?等下我們進去看看就知道了!一共有四個參數,a.a.decode(t)這個參數是數據。等下下面看了s函數就明白了。另外三個參數固定的,最後JSON.parse格式化json數據
在這裏插入圖片描述
這個就是s函數,你覺得它主要功能是幹嘛的呢?我猜它是做數據解密的,你看看這一大串不是解密算法就讓我寫代碼不掉頭髮!這東西你要想了解它解密算法的原理用Python實現解密的話可以好好分析一下

function s(t, e, i, n, a, s) {
    var o, r, c, l, u, d, h, p, f, v, m, g, b, y, _ = new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756), C = new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344), w = new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584), x = new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928), k = new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080), T = new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312), A = new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154), L = new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696), S = function(t) {
        for (var e, i, n, a = new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964), s = new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697), o = new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272), r = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144), c = new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256), l = new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488), u = new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746), d = new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568), h = new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578), p = new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488), f = new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800), v = new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744), m = new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128), g = new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261), b = t.length > 8 ? 3 : 1, y = new Array(32 * b), _ = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0), C = 0, w = 0, x = 0; x < b; x++) {
            var k = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++)
                , T = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++);
            k ^= (n = 252645135 & (k >>> 4 ^ T)) << 4,
                k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
                k ^= (n = 858993459 & (k >>> 2 ^ (T ^= n << -16))) << 2,
                k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
                k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << -16))) << 1,
                k ^= n = 16711935 & ((T ^= n) >>> 8 ^ k),
                n = (k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << 8))) << 1) << 8 | (T ^= n) >>> 20 & 240,
                k = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240,
                T = n;
            for (var A = 0; A < _.length; A++)
                _[A] ? (k = k << 2 | k >>> 26,
                    T = T << 2 | T >>> 26) : (k = k << 1 | k >>> 27,
                    T = T << 1 | T >>> 27),
                    T &= -15,
                    e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | r[k >>> 16 & 15] | c[k >>> 12 & 15] | l[k >>> 8 & 15] | u[k >>> 4 & 15],
                    i = d[T >>> 28] | h[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | v[T >>> 12 & 15] | m[T >>> 8 & 15] | g[T >>> 4 & 15],
                    n = 65535 & (i >>> 16 ^ e),
                    y[w++] = e ^ n,
                    y[w++] = i ^ n << 16
        }
        return y
    }(t), z = 0, B = e.length, I = 0, j = 32 == S.length ? 3 : 9;
    p = 3 == j ? i ? new Array(0,32,2) : new Array(30,-2,-2) : i ? new Array(0,32,2,62,30,-2,64,96,2) : new Array(94,62,-2,32,64,2,30,-2,-2),
        2 == s ? e += "        " : 1 == s ? i && (c = 8 - B % 8,
            e += String.fromCharCode(c, c, c, c, c, c, c, c),
        8 === c && (B += 8)) : s || (e += "\0\0\0\0\0\0\0\0");
    var F = ""
        , $ = "";
    for (1 == n && (f = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++),
        m = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++),
        z = 0); z < B; ) {
        for (d = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++),
                 h = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++),
             1 == n && (i ? (d ^= f,
                 h ^= m) : (v = f,
                 g = m,
                 f = d,
                 m = h)),
                 d ^= (c = 252645135 & (d >>> 4 ^ h)) << 4,
                 d ^= (c = 65535 & (d >>> 16 ^ (h ^= c))) << 16,
                 d ^= c = 858993459 & ((h ^= c) >>> 2 ^ d),
                 d ^= c = 16711935 & ((h ^= c << 2) >>> 8 ^ d),
                 d = (d ^= (c = 1431655765 & (d >>> 1 ^ (h ^= c << 8))) << 1) << 1 | d >>> 31,
                 h = (h ^= c) << 1 | h >>> 31,
                 r = 0; r < j; r += 3) {
            for (b = p[r + 1],
                     y = p[r + 2],
                     o = p[r]; o != b; o += y)
                l = h ^ S[o],
                    u = (h >>> 4 | h << 28) ^ S[o + 1],
                    c = d,
                    d = h,
                    h = c ^ (C[l >>> 24 & 63] | x[l >>> 16 & 63] | T[l >>> 8 & 63] | L[63 & l] | _[u >>> 24 & 63] | w[u >>> 16 & 63] | k[u >>> 8 & 63] | A[63 & u]);
            c = d,
                d = h,
                h = c
        }
        h = h >>> 1 | h << 31,
            h ^= c = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h),
            h ^= (c = 16711935 & (h >>> 8 ^ (d ^= c << 1))) << 8,
            h ^= (c = 858993459 & (h >>> 2 ^ (d ^= c))) << 2,
            h ^= c = 65535 & ((d ^= c) >>> 16 ^ h),
            h ^= c = 252645135 & ((d ^= c << 16) >>> 4 ^ h),
            d ^= c << 4,
        1 == n && (i ? (f = d,
            m = h) : (d ^= v,
            h ^= g)),
            $ += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 & 255, 255 & h),
        512 == (I += 8) && (F += $,
            $ = "",
            I = 0)
    }
    if (F = (F += $).replace(/\0*$/g, ""),
        !i) {
        if (1 === s) {
            var N = 0;
            (B = F.length) && (N = F.charCodeAt(B - 1)),
            N <= 8 && (F = F.substring(0, B - N))
        }
        F = decodeURIComponent(escape(F))
    }
    return F
}

  現在,我們也找到了解密的js函數,也有了加密之後的數據。把這幾段關鍵的JS代碼摳出來做一個測試,這裏我使用在線的工具,有ide當然更專業。先簡單的做一個測試

function decrypt_func(t) {
    return JSON.parse(s("5e5062e82f15fe4ca9d24bc5", window.atob(t), 0, 0, "012345677890123", 1))
}
encrypt_data = ""
//這個加密的數據我這裏就不提供了,測試的話打開網站請自提一下
data = decrypt_func(encrypt_data)
console.log(JSON.stringify(data))

加密的那個s函數我也貼在上面了,別落下,然後我們看看測試效果,這…這…這不就是那個自行車嗎?
在這裏插入圖片描述

  好了,到這裏又到了跟大家說再見的時候了。我只是一個會寫爬蟲的段子手而已,一個希望有朝一日能夠實現財富自由,能夠早日榮歸故里的遊子罷了。希望我的文章能帶給您知識,帶給您幫助,帶給您歡笑!同時也謝謝您能抽出寶貴的時間閱讀,創作不易,如果您喜歡的話,點個贊再走吧。您的支持是我創作的動力,希望今後能帶給大家更多優質的文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章