【轉(zhuǎn)】使用瀏覽器擴(kuò)展篡改網(wǎng)頁中的 JS 文件

最近 Hack 了一個(gè)前端頁面(自家網(wǎng)站壶笼,但是暫時(shí)不能從源碼改)虐沥,來增強(qiáng)它的某些功能杨名。
這些增強(qiáng)功能需要使用網(wǎng)頁中的一些接口脏榆,但是經(jīng)過調(diào)試發(fā)現(xiàn)需要對接口傳輸?shù)谋韱芜M(jìn)行簽名校驗(yàn)。嘗試了一下常見的 Hash 算法以及少許迭代組合台谍,輸入輸出都對不上须喂,而逆向整個(gè)算法代價(jià)過高,所以打算使用瀏覽器擴(kuò)展篡改 JS 趁蕊,將簽名接口直接暴露出來坞生。
一、JS 文件攔截和篡改
經(jīng)過調(diào)試定位到了簽名算法所在的地方掷伙,然后取前后若干代碼作為特征碼是己,到時(shí)候只需要把要插入的內(nèi)容以合適的方式添加到特征碼里面,然后替換原文件中的特征碼任柜,就可以達(dá)到篡改 JS 的效果了卒废。

1.1 JS 文件攔截
這個(gè)攔截需要 webRequestBlocking和 webRequest權(quán)限,因此在 manifest.json 中聲明這兩個(gè)權(quán)限:

"permissions": [
  ...
  "webRequest",
  "webRequestBlocking"
]

然后在background.js中過濾帶有簽名算法的JS請求:

chrome.webRequest.onBeforeRequest.addListener(
  function(details){
    const { url } = details;
    if(/xxxx\.js/.test(url)){
      
      // 這個(gè)函數(shù)要同步返回宙地,因此我們不能在這里篡改文件
      // 不過先返回一個(gè)“信標(biāo)”摔认,注入到 dom 里作為注入 JS 的憑據(jù)
      // secretPageId 確保頁面對得上,不過這一點(diǎn)貌似是多余的
      const secretPageId = Date.now() + "--" + Math.random();
      const redirectUrl = `
        data:javascript,
        var node = document.createElement('div');
        node.id = 'secretPageId';
        node.innerHTML ="${secretPageId}";
        document.body.appendChild(node);
      `.replace(/\n/g, '');
      getAndChangeScript(url, secretPageId);
      return {
        redirectUrl
      }
    }
    return {
      redirectUrl: url,
    }
  }
);

1.2 JS 文件篡改
你可能注意到了上面的代碼片段中绸栅,調(diào)用的 getAndChangeScript 函數(shù)還沒有定義级野,看函數(shù)名應(yīng)該猜得到它是用來篡改 JS 的:

async function getAndChangeScript(src, secretPageId){
  const scriptStr = await (await fetch(url)).text();
  const changedScript = scriptStr.replace(
    // 這里是特征碼
    "e.filterNoNumber=Y;",
    // 修改后的特征碼,替換到原文中去
    "window.signMaker = J;e.filterNoNumber=Y;"
  );

  scriptInjectBus.send(secretPageId, changedScript);
}

二、將篡改后的 JS 注入頁面
2.1 將文件從 background.js 發(fā)送到 content.js
畢竟background.js并不能操作 DOM 蓖柔,因此只能使用 content.js辰企,這里就需要一個(gè)“傳送門”來發(fā)送這些內(nèi)容。
在background.js這一側(cè)况鸣,定義一個(gè)scriptInjectBus來干這事:

const scriptInjectBus = (function () {
  const listenQueue = [];
  const send = function (info) {
    listenQueue.forEach(function (handler) {
      handler(info);
    });
  };

  const listen = function (handler) {
    listenQueue.push(handler);
  };

  return {
    send,
    listen
  };
})();

并且要監(jiān)聽來自 content 的消息:

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
  scriptInjectBus.listen(function (info) {
    chrome.tabs.sendMessage(tab.id, info, function (res) {});
  });
});

??這里使用了 tabs牢贸,記得在 manifest.json中添加 tabs權(quán)限。

2.2 content.js 接收代碼并注入頁面
content.js這里的寫法想必大家就不陌生了:

chrome.runtime.onMessage.addListener(function(info){
    const node = document.getElementById('secretPageId');
    const secretPageId = node.innerHTML.trim();
    if(secretPageId && secretPageId === info.secretPageId){
        node.innerHTML = '';
        const scriptNode = document.createElement('script');
        scriptNode.innerHTML = info.js;
        document.body.appendChild(scriptNode);
    }
}

三镐捧、也許這并不是最好的辦法
但是管用就行潜索,對于自家網(wǎng)站來講,最好的辦法當(dāng)然是在源碼里修改懂酱。這種使用瀏覽器擴(kuò)展的奇技淫巧至少會(huì)有如下缺陷:

不支持import方法直接引入的 ESM模塊竹习;
對于依賴 JS 加載時(shí)序的頁面,打亂的時(shí)序會(huì)影響原來的邏輯(當(dāng)然這種設(shè)計(jì)是不科學(xué)的)列牺。

原文:https://segmentfault.com/a/1190000043057968

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末整陌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞎领,更是在濱河造成了極大的恐慌泌辫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件九默,死亡現(xiàn)場離奇詭異震放,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驼修,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門殿遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邪锌,你說我怎么就攤上這事勉躺。” “怎么了觅丰?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵饵溅,是天一觀的道長。 經(jīng)常有香客問我妇萄,道長蜕企,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任冠句,我火速辦了婚禮轻掩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懦底。我一直安慰自己唇牧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丐重,像睡著了一般腔召。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扮惦,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天臀蛛,我揣著相機(jī)與錄音,去河邊找鬼崖蜜。 笑死浊仆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豫领。 我是一名探鬼主播抡柿,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氏堤!你這毒婦竟也來了沙绝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鼠锈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后星著,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體购笆,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年虚循,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同欠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡横缔,死狀恐怖铺遂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茎刚,我是刑警寧澤襟锐,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站膛锭,受9級特大地震影響粮坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜初狰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一莫杈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奢入,春花似錦筝闹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糊秆。三九已至,卻和暖如春解寝,著一層夾襖步出監(jiān)牢的瞬間扩然,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工聋伦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夫偶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓觉增,卻偏偏與公主長得像兵拢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逾礁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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