当前位置:网站首页>【JS 逆向百例】你沒見過的社會主義核心價值觀加密

【JS 逆向百例】你沒見過的社會主義核心價值觀加密

2021-11-25 18:11:13 K哥爬蟲

關注微信公眾號:K哥爬蟲,持續分享爬蟲進階、JS/安卓逆向等技術幹貨!

聲明

本文章中所有內容僅供學習交流,抓包內容、敏感網址、數據接口均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關,若有侵權,請聯系我立即删除!

逆向目標

  • 目標:社會主義核心價值觀加密原理分析
  • 主頁:aHR0cHM6Ly93d3cuYXBwbWl1LmNvbS9rZXkv

逆向分析

K哥的同事今天發來一個比較有趣的加密,不管你輸入什麼字符串,加密後的結果都是由 24 個字的社會主義核心價值觀隨機組合而成,如下圖所示:

01.png

首先我們嘗試抓包,看看是否有網絡上的發包操作,實際上是沒有的,這說明加密解密的邏輯都在已加載完畢的 JavaScript 代碼裏,這裏介紹三種方法去定比特加密入口:

1、我們注意到加密結果始終由社會主義核心價值觀組成,肯定是在原 24 字的基礎上做了一些操作,也就是說在某個地方肯定定義了這 24 個字,我們任意全局搜索其中一個詞即可,如下圖所示:

02.png

2、加密解密的結果都是點擊了按鈕才生成的,那麼這個按鈕肯定綁定了某些事件,比如鼠標點擊事件,我們可以通過 DOM 事件斷點的方式定比特加密入口,如下圖所示:

03.png

3、我們注意到加密解密的 button 都有一個 id,那麼有可能 JavaScript 裏會獲取到這個 id 後,使用 addEventListener() 方法向這個元素添加鼠標點擊事件句柄,所以也可以全局搜索其 id,即 encode-btn 和 decode-btn,也可以搜索 getElementById("encode-btn") 或者 getElementById("decode-btn"),當然也可以搜索方法關鍵字 addEventListener。如下圖所示:

04.png

定比特到加密比特置後,埋下斷點進行調試,我們來看看加密的邏輯:

06.png

加密過程:變量 v 通過元素 id(decoded-area)拿到明文文本區域(textarea),點擊加密按鈕(encode-btn)會觸發事件,進入後面的函數,v.value 就是明文值,經過 l() 函數加密後賦值給 n,然後再把 n 賦值給 p.value,也就是顯示在密文的文本區域(encoded-area)。

解密過程:變量 p 通過元素 id(encoded-area)拿到密文文本區域(textarea),點擊解密按鈕(decode-btn)會觸發事件,進入後面的函數,p.value 就是密文值,經過 s() 函數解密後賦值給 n,然後再把 n 賦值給 v.value,也就是顯示在明文的文本區域(decoded-area)。

整個代碼邏輯比較簡單,用到的這些函數也都在一起,直接全部 copy 下來即可。

完整代碼

GitHub 關注 K 哥爬蟲,持續分享爬蟲相關代碼!歡迎 star !https://github.com/kgepachong/

JavaScript 加密解密代碼

var e = function () {
    for (var t = arguments.length, n = Array(t), r = 0; r < t; r++)
        n[r] = arguments[r];
    var e = n.length
        , i = "string" == typeof n[e - 1] ? n[e - 1] : "Assert Error"
        , o = !0
        , u = !1
        , c = void 0;
    try {
        for (var f, a = n[Symbol.iterator](); !(o = (f = a.next()).done); o = !0) {
            if (!f.value)
                throw new Error(i)
        }
    } catch (t) {
        u = !0,
            c = t
    } finally {
        try {
            !o && a.return && a.return()
        } finally {
            if (u)
                throw c
        }
    }
}
    , i = function () {
    return Math.random() >= .5
}
    , o = function (t) {
    var n = /[A-Za-z0-9\-\_\.\!\~\*\'\(\)]/g
        , r = t.replace(n, function (t) {
        return t.codePointAt(0).toString(16)
    });
    return encodeURIComponent(r).replace(/%/g, "").toUpperCase()
}
    , u = function (t) {
    e("string" == typeof t, "utfs Error");
    var n = t.length;
    e(0 == (1 & n));
    for (var r = [], i = 0; i < n; i++)
        0 == (1 & i) && r.push("%"),
            r.push(t[i]);
    return decodeURIComponent(r.join(""))
}
    , c = function (t) {
    e("string" == typeof t);
    var n = []
        , r = !0
        , o = !1
        , u = void 0;
    try {
        for (var c, f = t[Symbol.iterator](); !(r = (c = f.next()).done); r = !0) {
            var a = c.value
                , s = Number.parseInt(a, 16);
            s < 10 ? n.push(s) : i() ? (n.push(10),
                n.push(s - 10)) : (n.push(11),
                n.push(s - 6))
        }
    } catch (t) {
        o = !0,
            u = t
    } finally {
        try {
            !r && f.return && f.return()
        } finally {
            if (o)
                throw u
        }
    }
    return n
}
    , f = function (t) {
    e(t instanceof Array);
    for (var n = [], r = t.length, i = 0; i < r;)
        t[i] < 10 ? n.push(t[i]) : 10 === t[i] ? (i++,
            n.push(t[i] + 10)) : (i++,
            n.push(t[i] + 6)),
            i++;
    return n.map(function (t) {
        return t.toString(16).toUpperCase()
    }).join("")
}
    , a = function (t) {
    return t.map(function (t) {
        return h[2 * t] + h[2 * t + 1]
    }).join("")
}
    , s = function (t) {
    var n = []
        , r = !0
        , i = !1
        , o = void 0;
    try {
        for (var c, a = t[Symbol.iterator](); !(r = (c = a.next()).done); r = !0) {
            var s = c.value
                , l = h.indexOf(s);
            -1 !== l && (1 & l || n.push(l >> 1))
        }
    } catch (t) {
        i = !0,
            o = t
    } finally {
        try {
            !r && a.return && a.return()
        } finally {
            if (i)
                throw o
        }
    }
    var v = f(n);
    e(0 == (1 & v.length));
    var p = void 0;
    try {
        p = u(v)
    } catch (t) {
        throw t
    }
    return p
}
    , h = "富强民主文明和諧自由平等公正法治愛國敬業誠信友善"

function encrypt(t) {
    return a(c(o(t)))
}

function decrypt(t) {
    return s(t)
}

// 測試樣例
// console.log(encrypt("1234"))
// console.log(decrypt("和諧民主和諧文明和諧和諧和諧自由"))

版权声明
本文为[K哥爬蟲]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/11/20211125181032285E.html

随机推荐