Python爬蟲(chóng)eval實(shí)現(xiàn)看漫畫(huà)漫畫(huà)柜mhgui實(shí)戰(zhàn)分析
?? 看漫畫(huà)MHG mhgui 實(shí)戰(zhàn)分析
本文所有MHG使用 MHG 替代~
本次爬蟲(chóng)采集的案例是MHG,該站點(diǎn)貌似本身就游走在法律的邊緣。
站點(diǎn)地址直接檢索即可進(jìn)入,在該目標(biāo)站點(diǎn),橡皮擦發(fā)現(xiàn)了 eval 加密的雙重用法。
頁(yè)面所有點(diǎn)位都無(wú)太大難點(diǎn),而且漫畫(huà)超多,但是當(dāng)點(diǎn)擊詳情頁(yè)的時(shí)候,發(fā)現(xiàn)加密點(diǎn)位了。
https://i.看評(píng)論區(qū).com/ps1/u/17287/cmdty/%E7%AC%AC01%E8%AF%9D/3.jpg.webp?e=1654230046&m=T-uqjbcgI-eyVGgsIsnjLw
其中比較關(guān)鍵的就是參數(shù) m
,其余參數(shù)都比較容易猜到其含義。
%E7%AC%AC01%E8%AF%9D
:第一話;e
:時(shí)間戳。
通過(guò)開(kāi)發(fā)者工具的 DOM 事件綁定器
找到下一頁(yè)按鈕點(diǎn)擊事件,然后在下述位置添加斷點(diǎn)。
通過(guò)該斷點(diǎn)調(diào)試,發(fā)現(xiàn)參數(shù)在頁(yè)面加載時(shí)已經(jīng)生成,繼續(xù)尋找的意義不大,接下來(lái)要更換思路。
全局檢索關(guān)鍵字 m=
,查看所有搜索結(jié)果之后,最終定位到 config.js
文件,即下圖代碼高亮位置。
截取相應(yīng)的代碼文件
如下所示,這代碼一眼看上去就能猜測(cè)是 eval
加密,但是其關(guān)鍵信息,例如 window["\x65\x76\x61\x6c"]
還是存在加密,下面我們優(yōu)先解決該值。
window["\x65\x76\x61\x6c"](function(i, k, a, n, m, an) { m = function(a) { return (a < k ? "" : m(window["\x70\x61\x72\x73\x65\x49\x6e\x74"](a / k))) + ((a = a % k) > 35 ? window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](a + 29) : a["\x74\x6f\x53\x74\x72\x69\x6e\x67"](36)) } ; if (!''["\x72\x65\x70\x6c\x61\x63\x65"](/^/, window["\x53\x74\x72\x69\x6e\x67"])) { while (a--) an[m(a)] = n[a] || m(a); n = [function(m) { return an[m] } ]; m = function() { return '\\\x77\x2b' } ; a = 1 } ;while (a--) if (n[a]) i = i["\x72\x65\x70\x6c\x61\x63\x65"](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62' + m(a) + '\\\x62','\x67'), n[a]); return i }('\x72 \x41\x3d\x28\x78\x28\x29\x7b\x72 \x6c\x69\x74"]('\x7c'), 0, {}));
別看上述代碼長(zhǎng),但是當(dāng)我使用在線工具解密之后,得到了下面一段代碼。
function(f){return LZString.decompressFromBase64(this).split(f)}
但是這里并沒(méi)有前文的關(guān)鍵字參數(shù) m=T-uqjbcgI-eyVGgsIsnjLw
,接下來(lái)我們?cè)谠创a中查看一下,看是否存在關(guān)鍵性信息。
得到的代碼段如下所示
window["\x65\x76\x61\x6c"]( (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="[ "\x73\x70\x6c\x69\x63" ]("\x7c"), 0, {} ) );
此時(shí)關(guān)鍵信息逐漸出現(xiàn),我們重點(diǎn)解密該代碼段即可。
eval 函數(shù)解析
直接使用 eval 函數(shù)解析上述代碼,發(fā)現(xiàn)出現(xiàn)如下錯(cuò)誤。
但是 \x65\x76\x61\x6c
可以解碼為 eval
。
console.log('\x65\x76\x61\x6c') 16:42:45.372 VM251:1 eval
但是下述這段代碼出現(xiàn)了問(wèn)題。
在結(jié)合剛才我們得到的一個(gè)莫名的加密函數(shù)。
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)
得到的信息如下所示,變得越來(lái)越清楚了。
||||||||||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
此時(shí)還是無(wú)法得到最終的答案,然后可以看到代碼結(jié)構(gòu)發(fā)現(xiàn)下述規(guī)律,即代碼出現(xiàn)了相似的部分,并且都是 eval。
細(xì)心環(huán)節(jié),將代碼一點(diǎn)點(diǎn)翻譯成可逆向的
將 lzstring
解密字符串,然后手動(dòng)使用 split
函數(shù)進(jìn)行分隔,因?yàn)樯鲜龃a \x73\x70\x6c\x69\x63
解析出來(lái)竟然是 splic
函數(shù)。
谷歌開(kāi)發(fā)者工具的控制臺(tái)中運(yùn)行下述代碼即可。
"||||||||||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();
此時(shí),一些關(guān)鍵參數(shù)都已經(jīng)得到了,例如 e
的值,m
的值。
以上就是Python爬蟲(chóng)eval實(shí)現(xiàn)看漫畫(huà)漫畫(huà)柜mhgui實(shí)戰(zhàn)分析的詳細(xì)內(nèi)容,更多關(guān)于Python爬蟲(chóng)eval看漫畫(huà)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 竊取攝像頭照片的實(shí)現(xiàn)示例
這篇文章主要介紹了python:竊取攝像頭照片的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python Pandas分組聚合的實(shí)現(xiàn)方法
這篇文章主要介紹了Python Pandas分組聚合的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python numpy數(shù)組的索引和切片的操作方法
NumPy 是一個(gè) Python 包。 它代表 “Numeric Python”。它是一個(gè)由多維數(shù)組對(duì)象和用于處理數(shù)組的例程集合組成的庫(kù)。這篇文章主要介紹了python numpy 數(shù)組的索引和切片,需要的朋友可以參考下2018-10-10PyCharm MySQL可視化Database配置過(guò)程圖解
這篇文章主要介紹了PyCharm MySQL可視化Database配置過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Python GUI之tkinter窗口視窗教程大集合(推薦)
這篇文章主要介紹了Python GUI之tkinter窗口視窗教程大集合,看這一篇教程足了,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-1010款最佳Python開(kāi)發(fā)工具推薦,每一款都是神器
這篇文章主要介紹了10款最佳Python開(kāi)發(fā)工具推薦,每一款都是神器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-10-10python實(shí)現(xiàn)基于樸素貝葉斯的垃圾分類算法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)基于樸素貝葉斯的垃圾分類算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07