首頁 > 軟體

Python爬蟲eval實現看漫畫漫畫櫃mhgui實戰分析

2022-07-29 14:02:25

⛳️ 看漫畫MHG mhgui 實戰分析

本文所有MHG使用 MHG 替代~

本次爬蟲採集的案例是MHG,該站點貌似本身就遊走在法律的邊緣。

站點地址直接檢索即可進入,在該目標站點,橡皮擦發現了 eval 加密的雙重用法。

頁面所有點位都無太大難點,而且漫畫超多,但是當點選詳情頁的時候,發現加密點位了。

https://i.看評論區.com/ps1/u/17287/cmdty/%E7%AC%AC01%E8%AF%9D/3.jpg.webp?e=1654230046&m=T-uqjbcgI-eyVGgsIsnjLw

其中比較關鍵的就是引數 m,其餘引數都比較容易猜到其含義。

  • %E7%AC%AC01%E8%AF%9D:第一話;
  • e:時間戳。

通過開發者工具的 DOM 事件繫結器

找到下一頁按鈕點選事件,然後在下述位置新增斷點。

通過該斷點偵錯,發現引數在頁面載入時已經生成,繼續尋找的意義不大,接下來要更換思路。

全域性檢索關鍵字 m=,檢視所有搜尋結果之後,最終定位到 config.js 檔案,即下圖程式碼高亮位置。

擷取相應的程式碼檔案

如下所示,這程式碼一眼看上去就能猜測是 eval 加密,但是其關鍵資訊,例如 window["x65x76x61x6c"] 還是存在加密,下面我們優先解決該值。

window["x65x76x61x6c"](function(i, k, a, n, m, an) {
    m = function(a) {
        return (a < k ? "" : m(window["x70x61x72x73x65x49x6ex74"](a / k))) + ((a = a % k) > 35 ? window["x53x74x72x69x6ex67"]["x66x72x6fx6dx43x68x61x72x43x6fx64x65"](a + 29) : a["x74x6fx53x74x72x69x6ex67"](36))
    }
    ;
    if (!''["x72x65x70x6cx61x63x65"](/^/, window["x53x74x72x69x6ex67"])) {
        while (a--)
            an[m(a)] = n[a] || m(a);
        n = [function(m) {
            return an[m]
        }
        ];
        m = function() {
            return '\x77x2b'
        }
        ;
        a = 1
    }
    ;while (a--)
        if (n[a])
            i = i["x72x65x70x6cx61x63x65"](new window["x52x65x67x45x78x70"]('\x62' + m(a) + '\x62','x67'), n[a]);
    return i
}('x72 x41x3dx28x78x28x29x7bx72 x6cx69x74"]('x7c'), 0, {}));

別看上述程式碼長,但是當我使用線上工具解密之後,得到了下面一段程式碼。

function(f){return LZString.decompressFromBase64(this).split(f)}

但是這裡並沒有前文的關鍵字引數 m=T-uqjbcgI-eyVGgsIsnjLw,接下來我們在原始碼中檢視一下,看是否存在關鍵性資訊。

得到的程式碼段如下所示

window["x65x76x61x6c"](
  (function (p, a, c, k, e, d) {
    e = function (c) {
      return (
        (c < a ? "" : e(parseInt(c / a))) +
        ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
      );
    };
    if (!"".replace(/^/, String)) {
      while (c--) d[e(c)] = k[c] || e(c);
      k = [
        function (e) {
          return d[e];
        },
      ];
      e = function () {
        return "\w+";
      };
      c = 1;
    }
    while (c--)
      if (k[c]) p = p.replace(new RegExp("\b" + e(c) + "\b", "g"), k[c]);
    return p;
  })(
    'U.k({"F":i,"E":"D","C":"i.a","B":A,"z":"f","y":["1.a.b","2.a.b","3.a.b","4.a.b","5.a.b","6.a.b","7.a.b","8.a.b","9.a.b","%x%w%v%c%t%G%d%g%h%r.4.1%q.a.b","%p%j%o%c%j%n%c%l%I%d%H%P%d%g%h.a.b"],"J":W,"Y":11,"Z":"/12/u/X/V/f/","10":1,"S":"","R":Q,"O":0,"N":{"e":M,"m":"T-L-K"}}).s();',
    62,
    65,
    "D41hWAODmwO4FMBGlgFECs6CcJA03gAwCMgu9HACCRwAQlgMzbYBMVAHNcAJYC20AIgEMALgOCtWIbADFg2DmgBswJriasWwSACcEASQB2nIbLqSAwjT7oALMABmnADYIAzsADG+gdwTAMGVgB2YI9OABNgFE53YEBIm0ANvMAQt0BavUBbtUivH0jwsTYsViUHQxcACwQIhABPADUAcWgXXRd9cAAZOGAAVwBHcCR3aF1gIgUMayY6AgJrJRdHTR0AN10I1it/IMCJfQQADyEVyMcAe3cAawB9dxjgAGUAWQAJD24woUr7AUcXXyJAtUCwGc+k0whKwBcIiEnTcmhcRCAA="[
      "x73x70x6cx69x63"
    ]("x7c"),
    0,
    {}
  )
);

此時關鍵資訊逐漸出現,我們重點解密該程式碼段即可。

eval 函數解析

直接使用 eval 函數解析上述程式碼,發現出現如下錯誤。

但是 x65x76x61x6c 可以解碼為 eval

console.log('x65x76x61x6c')
16:42:45.372 VM251:1 eval

但是下述這段程式碼出現了問題。

在結合剛才我們得到的一個莫名的加密函數。

function(f){return LZString.decompressFromBase64(this).split(f)}

可以試著用 Python 解密一下上述程式碼段,而且 Python 中恰好有同名第三方模組。

pip install lzstring

直接解密加密字串即可。

import lzstring
x = lzstring.LZString()
decompressed = x.decompressFromBase64(
    'D41hWAODmwO4FMBGlgF加密字串AA=')
print(decompressed)

得到的資訊如下所示,變得越來越清楚了。

||||||||||jpg|webp|E5|E9||第01話|A1|B5|39921|8B|imgData|88||9F|9B|E6|29|2821|preInit|93||9C|BD|E4|files|cname|558777|cid|bpic|沉默的庭園|bname|bid|81|85|86|finished|eyVGgsIsnjLw|uqjbcgI|1654230046|sl|prevId|8D|558778|nextId|block_cc||S
MH|cmdty|false|17287|len|path|status||ps1

此時還是無法得到最終的答案,然後可以看到程式碼結構發現下述規律,即程式碼出現了相似的部分,並且都是 eval。

細心環節,將程式碼一點點翻譯成可逆向的

lzstring 解密字串,然後手動使用 split 函數進行分隔,因為上述程式碼 x73x70x6cx69x63 解析出來竟然是 splic 函數。

谷歌開發者工具的控制檯中執行下述程式碼即可。

"||||||||||jpg|webp|E5|E9||第01話|A1|B5|39921|8B|imgData|88||9F|9B|E6|29|2821|preInit|93||9C|BD|E4|files|cname|558777|cid|bpic|沉默的庭園|bname|bid|81|85|86|finished|eyVGgsIsnjLw|uqjbcgI|1654230046|sl|prevId|8D|558778|nextId|block_cc||SMH|cmdty|false|17287|len|path|status||ps1".split(
  "|"
);

得到的資訊如下所示。

[
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "jpg",
  "webp",
  "E5",
  "E9",
  "",
  "第01話",
  "A1",
  "B5",
  "39921",
  "8B",
  "imgData",
  "88",
  "",
  "9F",
  "9B",
  "E6",
  "29",
  "2821",
  "preInit",
  "93",
  "",
  "9C",
  "BD",
  "E4",
  "files",
  "cname",
  "558777",
  "cid",
  "bpic",
  "沉默的庭園",
  "bname",
  "bid",
  "81",
  "85",
  "86",
  "finished",
  "eyVGgsIsnjLw",
  "uqjbcgI",
  "1654230046",
  "sl",
  "prevId",
  "8D",
  "558778",
  "nextId",
  "block_cc",
  "",
  "SMH",
  "cmdty",
  "false",
  "17287",
  "len",
  "path",
  "status",
  "",
  "ps1",
];

然後將其替換到上述 JS 中,使用解密工具直接線上解析。

SMH.imgData({
  bid: 39921,
  bname: "沉默的庭園",
  bpic: "39921.jpg",
  cid: 558777,
  cname: "第01話",
  files: [
    "1.jpg.webp",
    "2.jpg.webp",
    "3.jpg.webp",
    "4.jpg.webp",
    "5.jpg.webp",
    "6.jpg.webp",
    "7.jpg.webp",
    "8.jpg.webp",
    "9.jpg.webp",
    "%E4%BD%9C%E5%93%81%E9%A1%B5%2821.4.1%29.jpg.webp",
    "%E6%8B%9B%E5%8B%9F%E5%88%86%E9%85%8D%E9%A1%B5.jpg.webp",
  ],
  finished: false,
  len: 11,
  path: "/ps1/u/17287/cmdty/第01話/",
  status: 1,
  block_cc: "",
  nextId: 558778,
  prevId: 0,
  sl: { e: 1654230046, m: "T-uqjbcgI-eyVGgsIsnjLw" },
}).preInit();

此時,一些關鍵引數都已經得到了,例如 e 的值,m 的值。

以上就是Python爬蟲eval實現看漫畫漫畫櫃mhgui實戰分析的詳細內容,更多關於Python爬蟲eval看漫畫的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com