記錄遇到的一個新的變種JS加密

WX20231204-144436@2x.png


邏輯分析

混淆代碼的目的是隱藏實(shí)際邏輯嚷节,增加逆向工程的難度。以下是對代碼的逐步分析和解讀虎锚。


第一部分:立即調(diào)用的函數(shù)表達(dá)式 (IIFE)

(function () {
    var _K = [...]; // 存儲大量字符串的數(shù)組
})();
1.  **目的**:這個 IIFE 是整個代碼運(yùn)行的入口硫痰,它封裝了一系列變量和函數(shù),避免全局命名空間污染窜护。

2.  **_K 數(shù)組**:這是一個重要的混淆手段效斑,將腳本中使用的字符串統(tǒng)一存儲在一個數(shù)組中,通過索引引用柱徙。

?   好處:可以壓縮代碼缓屠,減少重復(fù)字符串的占用空間奇昙。

?   難點(diǎn):代碼閱讀者需要追蹤每個索引的實(shí)際含義。

第二部分:字符串的引用方式

_K[0], _K[1], ..., _K[n]
1.  **作用**:通過 _K 數(shù)組的索引訪問字符串敌完。

2.  **影響**:

?   原始的字符串內(nèi)容被隱藏了储耐。

?   閱讀者需要先還原 _K 數(shù)組中的字符串,才能理解代碼蠢挡。

示例:還原字符串的方法

如果我們要還原 _K 的第一個元素 _K[0]弧岳,可以直接打印這個數(shù)組凳忙,或者在控制臺執(zhí)行以下代碼:

console.log(_K[0]); // 會輸出 'DgfIBgu'

通過這種方式逐一還原 _K 的內(nèi)容业踏,可以幫助我們理解代碼。


第三部分:核心邏輯的隱藏

在這種混淆代碼中涧卵,通常會利用字符串?dāng)?shù)組和動態(tài)計(jì)算來隱藏核心邏輯勤家。例如:

var a = _K[5] + _K[12];
  1. 問題:由于 _K 的內(nèi)容是動態(tài)的,我們無法直接從代碼中看出 a 的值柳恐。

  2. 解決辦法:需要跟蹤這些動態(tài)操作伐脖,或者在運(yùn)行時斷點(diǎn)調(diào)試,查看 a 的真實(shí)值乐设。


第四部分:動態(tài)調(diào)用與函數(shù)名混淆

混淆后的代碼常見如下形式:

someFunction(_K[23], _K[7]);

? 函數(shù)名:someFunction 很可能被混淆為一個毫無意義的名稱讼庇。

? 參數(shù):參數(shù)內(nèi)容也經(jīng)過 _K 數(shù)組混淆,使得調(diào)用的邏輯難以追蹤近尚。


第五部分:還原與解混淆思路

1. 定位 _K 數(shù)組

將其打印輸出或保存到文件中:

console.log(_K);

分析每個字符串的內(nèi)容蠕啄。

2. 跟蹤動態(tài)調(diào)用

在瀏覽器或 Node.js 中運(yùn)行代碼,并在關(guān)鍵函數(shù)上設(shè)置斷點(diǎn)戈锻。

?   使用 debugger 語句歼跟。

?   查看調(diào)用棧,逐步分析邏輯格遭。

3. 代碼格式化

使用代碼格式化工具(如 Prettier 或 Beautify)來美化代碼結(jié)構(gòu)哈街,提高可讀性。


混淆代碼背后的邏輯

混淆后的代碼往往是為了:

?   隱藏敏感邏輯拒迅,如授權(quán)驗(yàn)證骚秦、算法實(shí)現(xiàn)。

?   增加逆向工程的難度璧微。

要解混淆骤竹,需要一定的耐心和技巧。若需要進(jìn)一步幫助往毡,可以提供更多上下文或執(zhí)行環(huán)境信息蒙揣。

代碼翻譯解密后局部一覽

function L8() {
    var L9 = Z.channelCode;
    var LL = {
        channelCode: L9,
        av: L7("v", Z.appKey) ? "1" : "0",
        cv: L9 && L7("v", Z.appKey, L9) ? "1" : "0",
        apkFileName: Z.apkFileName,
        preferWakeup: Z.preferWakeup,
        hash: d.hash,
        _pkgId: Z._pkgId,
        fastInstall: Z.fastInstall
    };
    var LW = X(L9);
    y(function (LK) {
        var La = Z.server ? Z.server : P;
        I({
            url: i(La + "/web/" + Z.appKey + "/" + LW + "/init", LL, LK),
            method: "POST",
            contentType: "text/plain;charset=utf-8",
            data: T,
            timeout: 5000,
            error: function () {
                D(function () {
                    L2 = true;
                    g.ready();
                });
            },
            success: function (LD) {
                D(function () {
                    LD.sh && (e = L6(LD.sh));
                    F = LD.fu;
                    J = LD.fm;
                    f = LD.ft;
                    x = LD.su;
                    G = LD.sm;
                    U = LD.st;
                    Y = LD.ph ? S(LD.ph) : null;
                    E = LD.pyp ? S(LD.pyp) : null;
                    o = LD.pye ? parseInt(S(LD.pye) || "0") : 0;
                    j = LD.dsoi;
                    L9 = LD.channelCode;
                    L0 = LD.csu;
                    L1 = LD.cpc;
                    var LV = LD.fr;
                    LV && (F = i(F, {
                        ref: d.href
                    }));
                    g.ready();
                });
            }
        });
    });
}

徹底還原后一覽

function initialize() {
    var channelCode = data.channelCode;
    var requestPayload = {
        channelCode: channelCode,
        av: validateFlag("v", data.appKey) ? "1" : "0",
        cv: channelCode && validateFlag("v", data.appKey, channelCode) ? "1" : "0",
        apkFileName: data.apkFileName,
        preferWakeup: data.preferWakeup,
        hash: d.hash,
        _pkgId: data._pkgId,
        fastInstall: data.fastInstall
    };
    var channelInfo = getChannelInfo(channelCode);
    asyncFunction(function (callback) {
        var serverUrl = data.server ? data.server : P;
        I({
            url: constructUrl(serverUrl + "/web/" + data.appKey + "/" + channelInfo + "/init", requestPayload, callback),
            method: "POST",
            contentType: "text/plain;charset=utf-8",
            data: T,
            timeout: 5000,
            error: function () {
                runAsync(function () {
                    isErrorState = true;
                    globalHandler.ready();
                });
            },
            success: function (response) {
                runAsync(function () {
                    if (response.sh) {
                        secretHash = processHash(response.sh);
                    }
                    fileUrl = response.fu;
                    fileMetadata = response.fm;
                    fileType = response.ft;
                    serverUrl = response.su;
                    serverMetadata = response.sm;
                    serverTimestamp = response.st;
                    if (response.ph) {
                        packageHash = S(response.ph);
                    } else {
                        packageHash = null;
                    }
                    if (response.pyp) {
                        paymentHash = S(response.pyp);
                    } else {
                        paymentHash = null;
                    }
                    if (response.pye) {
                        paymentError = parseInt(S(response.pye) || "0");
                    } else {
                        paymentError = 0;
                    }
                    debugInfo = response.dsoi;
                    channelCode = response.channelCode;
                    customServerUrl = response.csu;
                    customPackageCode = response.cpc;
                    var referrer = response.fr;
                    if (referrer) {
                        fileUrl = constructUrl(fileUrl, {
                            ref: d.href
                        });
                    }
                    globalHandler.ready();
                });
            }
        });
    });
}

該文章最終解釋權(quán)歸《湖南唯凡科技網(wǎng)絡(luò)有限公司》jsjiami官方客服所有。

請勿將代碼拿去用于非法用途开瞭。

有任何疑問歡迎咨詢懒震。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩息,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子个扰,更是在濱河造成了極大的恐慌瓷炮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递宅,死亡現(xiàn)場離奇詭異娘香,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)办龄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門烘绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俐填,你說我怎么就攤上這事安接。” “怎么了英融?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵盏檐,是天一觀的道長。 經(jīng)常有香客問我驶悟,道長胡野,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任痕鳍,我火速辦了婚禮硫豆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘额获。我一直安慰自己够庙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布抄邀。 她就那樣靜靜地躺著耘眨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪境肾。 梳的紋絲不亂的頭發(fā)上剔难,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音奥喻,去河邊找鬼偶宫。 笑死,一個胖子當(dāng)著我的面吹牛环鲤,可吹牛的內(nèi)容都是我干的纯趋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吵冒!你這毒婦竟也來了纯命?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痹栖,失蹤者是張志新(化名)和其女友劉穎亿汞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揪阿,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疗我,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了南捂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴裤。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖黑毅,靈堂內(nèi)的尸體忽然破棺而出嚼摩,到底是詐尸還是另有隱情钦讳,我是刑警寧澤矿瘦,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站愿卒,受9級特大地震影響缚去,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琼开,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一易结、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柜候,春花似錦搞动、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辅柴,卻和暖如春箩溃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碌嘀。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工涣旨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人股冗。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓霹陡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烹棉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容