前言
相信有抓取過(guò)“栽(cai)花(pan)文書(shū)”唉锌、“智(zhi)障(lian)招聘”的蟲(chóng)師們,都應(yīng)該見(jiàn)過(guò)MmEwMD這串神秘的參數(shù),皆因有了它的存在眉踱,導(dǎo)致各位蟲(chóng)師都不能在好好的玩耍爬蟲(chóng)了,那么這串神秘的參數(shù)到底是什么呢霜威?今天就讓我們一起來(lái)好好地探討下吧谈喳,在開(kāi)始之前,歡迎大家加入我們的QQ技術(shù)交流群:544185435 戈泼,我們將不定期更新爬蟲(chóng)類相關(guān)文案與視頻教學(xué)哦婿禽!
關(guān)于MmEwMD
“MmEwMD” 這串神秘的參數(shù),我最早看到是在17年年底大猛,當(dāng)時(shí)有個(gè)網(wǎng)友私聊我谈宛,問(wèn)我能否逆向這個(gè)加密,于是胎署,我便應(yīng)它需求吆录,先到網(wǎng)上科普了下相關(guān)的訊息,我發(fā)現(xiàn)琼牧,當(dāng)時(shí)已經(jīng)有好多網(wǎng)站已經(jīng)采用了該加密算法恢筝,且已經(jīng)有大A在相關(guān)網(wǎng)站發(fā)布過(guò)相關(guān)帖子哀卫,更有某些雇主曾為逆向該加密價(jià)格開(kāi)到7K+,但最后有沒(méi)有成功我不清楚撬槽。
在通過(guò)一段時(shí)間的分析和科普后此改,我發(fā)現(xiàn)這個(gè)加密算法是由端(rui)數(shù)公司提供的,該算法有以下特征:
頁(yè)面的meta標(biāo)簽包含:9DhefwqGPrzGxEp9hPaoag 字段
document.cookie 包含: FSSBBIl1UgzbN7N 開(kāi)頭的字段
頁(yè)面加密的JS全動(dòng)態(tài)生成侄柔,每次刷新頁(yè)面后共啃,所有字段、值包括算法結(jié)構(gòu)整體都會(huì)改變暂题。
但凡使用了該加密移剪,只要發(fā)送了xhr請(qǐng)求,都默認(rèn)會(huì)自動(dòng)攜帶 MmEwMD 參數(shù)薪者,該功能通過(guò)hook open函數(shù)實(shí)現(xiàn)纵苛。
加密代碼全經(jīng)過(guò)高度混淆,基本所有字段或值都類似這樣 _$xX言津,可讀性為0
部分網(wǎng)站還啟用了反調(diào)試功能攻人,意味著你一旦打開(kāi)debugger工具則自動(dòng)斷點(diǎn),不斷死循環(huán)直到CPU資源耗盡悬槽,但并非所有網(wǎng)站都開(kāi)啟了該功能怀吻。
如何對(duì)抗反調(diào)試
對(duì)于網(wǎng)站的反調(diào)試這一問(wèn)題,相信一直困擾著不少的同胞吧初婆?我也沒(méi)有很好的辦法(只怪自己學(xué)藝不精)目前我的做法是在網(wǎng)頁(yè)加載前通過(guò)插件去替換debugger所在的函數(shù)烙博,或者通過(guò)中間人代理篡改,但這對(duì)于動(dòng)態(tài)釋放的JS加密并沒(méi)有任何效果烟逊,對(duì)于這種頁(yè)面渣窜,我是直接在控制臺(tái)重寫(xiě)函數(shù),如果大家有更好的方式歡迎留言探討宪躯!
如何快速找出加密入口乔宿?
這里我們將通過(guò)某站(為了規(guī)避不必要的麻煩,本站后續(xù)的文章都將不再提供站點(diǎn)名稱及相關(guān)信息访雪,敬請(qǐng)諒解详瑞!)作為演示,我們可從中看到該鏈接包含了 MmEwMD 字樣臣缀,可以說(shuō)坝橡,但凡發(fā)送了請(qǐng)求都會(huì)看到這串參數(shù)。
從上圖我們可以看出精置,在chrome里全局搜索 MmEwMD 并不能找到任何相關(guān)的東西计寇,是的,這串參數(shù)是純動(dòng)態(tài)生成,那么為了減少不必要的麻煩番宁,我們接下來(lái)將直接通過(guò)鉤子來(lái)捕獲這個(gè)參數(shù)的加密入口元莫。(鉤子腳本將在文末附件提供)
通過(guò)鉤子,我們便可非常輕松的就將其捕獲蝶押,它目前在發(fā)送這條鏈接之前被強(qiáng)制斷了下來(lái)踱蠢,那么現(xiàn)在離它的加密入口就非常的接近了,我們?cè)偻驴纯础?/p>
在經(jīng)過(guò)對(duì)堆棧信息分析后棋电,我們不難發(fā)現(xiàn)茎截,它是在:arguments[1] = _$me(arguments[1]); 這句代碼中生成的加密串,那是不是直接在 arguments[1] 這行下斷點(diǎn)就能進(jìn)入加密入口了呢赶盔?
很遺憾企锌, arguments[1] 處并不能作為斷點(diǎn)的落腳位,因?yàn)殚_(kāi)頭也說(shuō)過(guò)了招刨,這套加密的js都是全動(dòng)態(tài)生成的,同時(shí)也是經(jīng)過(guò)高度混淆的哀军,那么如果以此作為斷點(diǎn)的話沉眶,下一次刷新肯定就找不到了,所以我們?cè)偻路治龊笞罱K定位到i.send(b, k)這個(gè)方法中杉适,我們發(fā)現(xiàn)在刷新后斷點(diǎn)也依舊生效谎倔,那么我們要做的就是按F11一步步的尋找入口了。
在按了幾次F11后猿推,我們回到了剛那個(gè) arguments[1] 之中片习,這時(shí),我們執(zhí)行_$i2(arguments[1]) 便驚訝的發(fā)現(xiàn)蹬叭,它的確生成了加密藕咏,由此可見(jiàn)它便是我們尋找的加密入口了。
最后讓我們一睹加密的函數(shù)的樣子吧秽五,別懷疑孽查,它的可讀性真的只有0%,由于該加密算法許多網(wǎng)站曾使用坦喘,大家可以在百度或谷歌通過(guò)關(guān)鍵詞: MmEwMD 盲再、 9DhefwqGPrzGxEp9hPaoag 找到。