逆向過程中遭遇加密算法該怎么辦

逆向過程中遭遇加密算法該怎么辦

摘自夜幕爬蟲團(tuán)隊(duì)東哥杰作
如果你身處一線爬蟲崗聂受,那你大概率每天都會(huì)在逆向過程中遭遇加密算法的阻截阐虚。從加密的角度來看宝剖,網(wǎng)絡(luò)請(qǐng)求可以分為四種:

?請(qǐng)求和響應(yīng)都沒有加密乏冀;
?請(qǐng)求中有加密桅锄,響應(yīng)沒有劫哼;
?請(qǐng)求中沒加密叮趴,響應(yīng)信息中有加密;
?屮权烧!請(qǐng)求信息和響應(yīng)信息中都 TM 有加密疫向;

如果你連加密都沒見過,那你可得好好看一下豪嚎。

假設(shè)你現(xiàn)在要爬取一個(gè)網(wǎng)站上的帖子信息搔驼,但是如果沒有登錄的話你是無法看到 VIP 板塊內(nèi)容的。

作為爬蟲工程師侈询,你清楚地知道:現(xiàn)在你需要用代碼的方式發(fā)送 POST 請(qǐng)求舌涨,完成登錄操作。

一個(gè)網(wǎng)站的請(qǐng)求信息概覽如下:

這里以夜幕爬蟲安全論壇 bbs.nightteam.com 的登錄請(qǐng)求為例扔字,email囊嘉、password 和 vcode 對(duì)應(yīng)的是注冊(cè)郵箱温技、密碼和驗(yàn)證碼。

password 字段的值為 25f9e794323b453885f5181f1b624d0b扭粱,這一看就不是正常人會(huì)用的密碼舵鳞。正常人用的密碼大概長(zhǎng)這樣:

?普通人用的密碼 acsPO982er
?工具生成的或高端人士的密碼 Ikj48-zo23-5jz9
?測(cè)試賬戶或者笨蛋管理員的密碼 Admin1688

密碼長(zhǎng)度通常在 12 位以內(nèi),較長(zhǎng)的最多到 16 位琢蛤。幾乎沒有網(wǎng)站會(huì)要求你將密碼長(zhǎng)度保持在 32 位蜓堕,遂可以猜測(cè)這是編碼或加密過的結(jié)果值。說到這里博其,你應(yīng)該具備一些編碼或加密的常識(shí)套才,例如:

?MD5 提取結(jié)果通常是 32 位,不受明文長(zhǎng)度影響慕淡;
?Base64 編碼結(jié)果末尾通常會(huì)出現(xiàn)一或二個(gè)等于符號(hào)背伴,受明文長(zhǎng)度影響
?一長(zhǎng)串無規(guī)律數(shù)字與字母組合的字符大概率是 AES峰髓、DES傻寂、SHA 相關(guān)加密;
?SHA1 加密結(jié)果值為 40 位携兵,不受明文長(zhǎng)度影響崎逃;
?SHA256 加密結(jié)果值為 64 位,不受明文長(zhǎng)度影響眉孩;
?另外,AES勒葱、RSA 等對(duì)稱和非對(duì)稱加密都喜歡將結(jié)果值用 Base64 進(jìn)行編碼浪汪,這樣易于傳遞;
?如果你看到一長(zhǎng)串字符里出現(xiàn) + 號(hào)凛虽、\ 號(hào)和末尾的 = 號(hào)死遭,那大概率就是上一行描述的加密算法加密后又進(jìn)行了 Base64 編碼的結(jié)果;
?但要注意的是 32 位的字符串不一定是 MD5 摘要結(jié)果凯旋,64 位的也不一定是 SHA 加密結(jié)果呀潭。

強(qiáng)烈建議你去看看這些編碼或加密算法的文檔,了解它們的計(jì)算過程至非。如果你不知道在哪里看钠署,也不知道如何閱讀晦澀難懂的 RFC,可以翻開《Python3 反爬蟲原理與繞過實(shí)戰(zhàn)》這本書的第十章荒椭。

下面有四段長(zhǎng)度不一的字符串谐鼎,你猜猜它們對(duì)應(yīng)使用了哪些編碼或加密手段?

當(dāng)你遇到可疑的字符串時(shí)趣惠,你需要找到證據(jù)確定你的猜想狸棍。你可以通過全局搜索來找關(guān)鍵詞身害,如果搜不到就看調(diào)用棧并逐個(gè)查看和分析。下圖為全局搜索圖示:

當(dāng)你用各種方法找到加密算法的時(shí)候草戈,你還需要仔細(xì)調(diào)試和分析它究竟用了什么方法將原本秀色可餐的字符串換成了面目全非的結(jié)果值塌鸯。

經(jīng)過一番操作,你找到了類似加密的算法唐片,具體如下圖所示:

看起來應(yīng)該是這段代碼對(duì) password 進(jìn)行了操作丙猬,具體代碼在 384 行:

這一看就是用信息摘要算法,也就是 MD5 對(duì) password 進(jìn)行了加密牵触。為了確定你的猜想淮悼,驗(yàn)證這段代碼確實(shí)是你想找的代碼,你需要在 385 行打上斷點(diǎn)并再次點(diǎn)擊頁面的登錄按鈕揽思。登錄按鈕點(diǎn)擊后程序就會(huì)運(yùn)行到那里袜腥,并停在斷點(diǎn)處:

代碼運(yùn)行狀態(tài)中,password 的值為一長(zhǎng)串的字符钉汗。此時(shí)還不能完全確定它就是 MD5羹令,雖然文字上寫的是 $.md5,但有可能是故意蒙騙你的呢损痰?

這時(shí)候你可以在網(wǎng)上搜索在線的 MD5 計(jì)算福侈,將相同的輸入填寫進(jìn)去,看看得出的結(jié)果和代碼的是否相同卢未。

如果結(jié)果相同肪凛,說明 MD5 就是這里用的“加密”算法,反之則要進(jìn)一步跟進(jìn)代碼辽社。

找到加密的算法后伟墙,你有 2 種選擇:

?用你熟悉的 JAVA/Python 語言實(shí)現(xiàn)相同的輸入輸出,也就是調(diào)用 MD5 算法對(duì)密碼進(jìn)行摘要提鹊吻Α戳葵;
?在 Node 或 JavaScript 中調(diào)用相同的方法實(shí)現(xiàn)對(duì)密碼摘要的提取汉匙;

看到這里你肯定會(huì)說拱烁,那么問題來了:

?什么時(shí)候選擇第一種?
?什么時(shí)候選擇第二種噩翠?

如果你明確知道目標(biāo)的代碼邏輯戏自,例如使用 MD5 提取信息摘要或使用 AES 算法對(duì)密碼或請(qǐng)求正文中的 sign 字段進(jìn)行構(gòu)造/加密等,你可以用第一種方法伤锚。但如果你不清楚目標(biāo)的代碼邏輯浦妄,目標(biāo)除了使用常見的編碼或加密外還實(shí)現(xiàn)了自己的一套數(shù)據(jù)處理規(guī)則,且函數(shù)之間多層次的相互調(diào)用,那么就選擇第二種方法剂娄。

你可能看到下方圖示中貼出的代碼邏輯:

文件里有近萬行的代碼蠢涝,不僅層層調(diào)用,還對(duì)變量名阅懦、常量名和二、方法名和參數(shù)名進(jìn)行了混淆,這時(shí)候你要想從一個(gè)函數(shù)入口逐步捋清整個(gè)加密算法的邏輯是非常困難的耳胎。面對(duì)這種情況你可以選擇第二種方法惯吕,從入口函數(shù)開始,將層層調(diào)用的方法或變量粘貼到一個(gè) JS 文件中怕午,并根據(jù)運(yùn)行時(shí)提示的 xxx not define 將缺少的對(duì)象補(bǔ)足(通俗地講废登,就是缺啥補(bǔ)啥),直到 JS 文件中的程序能夠正常運(yùn)行并輸出你想要的結(jié)果郁惜。

上面我們以請(qǐng)求信息中出現(xiàn)加密為例堡距,講解了不同場(chǎng)景的應(yīng)對(duì)流程和可選方法。其實(shí)響應(yīng)信息中出現(xiàn)加密也是相同的思路兆蕉,假設(shè)服務(wù)端在響應(yīng)信息中返回了這么一串字符:

處理方法和上面介紹的相同:

?嘗試通過對(duì)象名關(guān)鍵字搜索密文處理函數(shù)羽戒;
?嘗試通過對(duì) JSON.stringify 或 Base64.decode 又或者 Base.decrypt 再或者 AES.decrypt 等方法關(guān)鍵詞搜索或方法的 hook 找到處理函數(shù);

思考:為什么搜索這些關(guān)鍵詞虎韵?

找到之后根據(jù)情況選擇捋清邏輯或者依葫蘆畫瓢地拼湊 JavaScript 代碼易稠,直到能夠得到相同的輸入輸出。

對(duì)于常見的編碼或加密算法包蓝,你應(yīng)該有一個(gè)全面的認(rèn)識(shí)驶社。你需要了解:

?編碼或加密算法的產(chǎn)生背景;
?編碼或加密算法的協(xié)議規(guī)范测萎;
?編碼或加密算法的正向計(jì)算規(guī)則亡电;
?編碼或加密算法的反向計(jì)算規(guī)則;
?編碼或加密算法在你熟悉的語言中成熟的加密庫的使用绳泉;
?編碼或加密算法在 JavaScript 中的使用和關(guān)鍵詞特征;

舉個(gè)例子姆泻,AES 算法有幾種模式零酪,例如 CBC、ECB拇勃;同時(shí)它又有不同的填充方式四苇,例如 PK7、PK5方咆;還需要設(shè)定不同長(zhǎng)度規(guī)格的密鑰和向量月腋;如果你不了解這些,那么就算你知道目標(biāo)使用了 AES 算法,你也沒有辦法得到相同的輸入和輸出榆骚,也就是無法完成爬蟲任務(wù)片拍。下方圖示為 AES 的 Node 語言示例:

image

從這里也可以看出,爬蟲工程師應(yīng)該收集妓肢、整理這些加密庫的使用捌省,這樣在工作中遇到的時(shí)候可以直接拿來使用,節(jié)省一大部分時(shí)間碉钠。另外纲缓,不要做伸手黨,因?yàn)闆]有自己寫的東西通常是最容易忘記的東西喊废。

下方還有幾道思考題在等你祝高,不要錯(cuò)過哦!

指引

?Node 執(zhí)行 JavaScript 代碼的內(nèi)容在《JavaScript 逆向系列課》第三課——調(diào)用 JavaScript 執(zhí)行代碼污筷;
?AES 加密算法詳解的內(nèi)容在《JavaScript 逆向系列課》第十三課——解密工闺!AES并不是每次都奏效;?BASE64 編碼和對(duì)應(yīng)的變幻內(nèi)容在《JavaScript 逆向系列課》第十五課——Base64竟有如此威力颓屑;?定位加密參數(shù)對(duì)應(yīng)代碼位置的方法在《JavaScript 逆向系列課》第七課斤寂;
?如果你不熟悉調(diào)試和調(diào)用棧的查看,請(qǐng)觀看《JavaScript 逆向系列課》第四課揪惦;

思考題

在你看完推薦和指引的內(nèi)容后遍搞,你肯定對(duì)編碼或加密算法有新的認(rèn)識(shí)。這里有幾道題器腋,你可以思考一下并在課程評(píng)論區(qū)留下你的答案:

1.如果請(qǐng)求正文中用的“加密”方法是 MD5溪猿,那么服務(wù)端會(huì)怎么處理?客戶端除了“加密”字符串之外還需要提交什么纫塌?2.如何修改 Base64 算法诊县,達(dá)到既保持編碼特征(例如 = 號(hào)、+ 號(hào))又能夠蒙騙(能正常解碼措左,但解碼結(jié)果和原文肯定對(duì)不上號(hào))解碼者呢依痊?3.AES 加密有幾種填充方式?4.AES 加密的密鑰有什么要求怎披?5.服務(wù)端只返回了一長(zhǎng)串的密文胸嘁,你應(yīng)該如何獲得明文?6.如果目標(biāo)使用了可逆的算法凉逛,你能聯(lián)想到的是性宏?7.如果目標(biāo)使用了不可逆的算法,你能聯(lián)想到的是状飞?8.行為驗(yàn)證碼提交驗(yàn)證的時(shí)候毫胜,請(qǐng)求正文通常會(huì)有哪些字段书斜,字段值是長(zhǎng)還是短?

答疑解惑

看課程的同學(xué)基礎(chǔ)不一酵使,遂出現(xiàn)很多不同程度的問題荐吉。這里針對(duì)與本主題相關(guān)的評(píng)論進(jìn)行解答,與其它主題相關(guān)的問題解答會(huì)在對(duì)應(yīng)的補(bǔ)充圖文里出現(xiàn)凝化,大家繼續(xù)踴躍發(fā)言稍坯,大膽批評(píng)!

第一個(gè)問題

解答:RSA搓劫、AES瞧哟、DES 等加密算法的工作模式、填充方式可以在搜索引擎中找到答案枪向,具體的代碼實(shí)現(xiàn)也有庫和文檔勤揩。例如 JavaScript 領(lǐng)域的 crypto-js 庫的文檔 https://cryptojs.gitbook.io/docs/ 中就有各種算法的正向使用和反向使用示例,建議親手去實(shí)現(xiàn)和操作秘蛔。代碼實(shí)現(xiàn)部分東哥正在收集整理陨亡,后面會(huì)導(dǎo)出放到論壇給大家作為參考,但強(qiáng)烈建議自己動(dòng)手深员。

第二個(gè)問題

解答:crypto-js 是一個(gè) JavaScript 語言實(shí)現(xiàn)的加密算法庫负蠕,包含了常見的編碼和加密算法的實(shí)現(xiàn)。AES 是對(duì)稱加密的一種倦畅,crypto-js 中也有 AES 算法的實(shí)現(xiàn)遮糖。Python 領(lǐng)域也有對(duì)應(yīng)的加密算法庫,例如 PyCrypto叠赐。有了成熟的庫欲账,你就可以在確定明文和其它參數(shù)的情況下計(jì)算出密文,而不用自己從 0 開始編寫芭概。

第三個(gè)問題

解答:說零基礎(chǔ)也能學(xué)會(huì)大概是從韋世東那里得來的:“沒有 JavaScript 基礎(chǔ)也沒關(guān)系赛不,能看懂邏輯就行了,主要還是思路|沒有 JavaScript 基礎(chǔ)也沒關(guān)系罢洲,我們課程里會(huì)講需要用到的”踢故。這句話是對(duì)是錯(cuò)請(qǐng)自行評(píng)價(jià),解釋只會(huì)越描越黑惹苗。

練習(xí)平臺(tái)的事情在群公告已有解釋殿较,受到疫情影響,此處不重復(fù)鸽粉。

“會(huì)的不用看斜脂,不會(huì)的看了也沒用”這句不好解釋抓艳,說多了也是越描越黑触机,但我們可以從現(xiàn)象上來看結(jié)果:

有同學(xué)會(huì)一部分 JavaScript 逆向,但在看的過程中收獲了有用的知識(shí),他認(rèn)為對(duì)自己有幫助儡首,參考逆向一群的學(xué)霸墨華片任;

有同學(xué)不會(huì) JavaScript 逆向,但一邊看視頻配合著文章蔬胯,能夠用 hook 和查看調(diào)用棧的方式快速地找到加密方法的入口对供、能夠用 Node 的方式扣代碼并運(yùn)行出結(jié)果,能夠用全局搜索的方式定位加密入口氛濒,能繞過不同生成方式的 debugger 阻礙产场,參考韋世東自己;

第四個(gè)問題

這個(gè)大概率是個(gè)人原因了舞竿,第六課無限 debugger 從產(chǎn)生背影京景、影響范圍、作用效果等方面進(jìn)行了描述骗奖,同時(shí)舉了多個(gè)例子闡述不同手法生成的無限 debugger 對(duì)應(yīng)的解決方法确徙。我不是課程主講人,我也是第一次學(xué)這個(gè)执桌,但我在寫這篇文章的時(shí)候我都能背出來幾個(gè):

1.函數(shù)置空法:重寫帶有 debugger 的函數(shù)鄙皇,將函數(shù)體置空,達(dá)到消除無限 debugger 的效果仰挣;2.設(shè)置斷點(diǎn)條件:將斷點(diǎn)條件設(shè)置為 false伴逸,這樣永遠(yuǎn)都不會(huì)斷點(diǎn)在那里;3.替換法:將原 JS 文件下載到本地椎木,修改代碼后用 reres 插件替換瀏覽器自己請(qǐng)求的同名文件违柏,實(shí)現(xiàn)消除效果;

學(xué)習(xí)態(tài)度端正問題

我是韋世東香椎,我來跟大家說一下我的學(xué)習(xí)態(tài)度漱竖。我自己明確地知道幾點(diǎn)

1.買了并不等于會(huì),不動(dòng)手學(xué)習(xí)白買(這跟買書一個(gè)道理畜伐,很多人買了書又不看)馍惹;2.學(xué)習(xí)永遠(yuǎn)是主動(dòng)的,不指望看幾遍視頻能學(xué)會(huì)玛界,從而成為大佬万矾;3.這不是小學(xué)教育,沒有人會(huì)給我布置作業(yè)和檢查作業(yè)慎框,也沒有人催促著我學(xué)習(xí)良狈,進(jìn)不進(jìn)步只跟我一人有關(guān);4.強(qiáng)者之所以強(qiáng)是因?yàn)橛杏铱炭鄨?jiān)持笨枯,天才不是你也不是我薪丁;5.找不到練手的地方遇西?咸魚的公眾號(hào)、蔡老板的公眾號(hào)严嗜、學(xué)習(xí)使你勸退的公眾號(hào)粱檀、花兒謝了的公眾號(hào),哪個(gè)號(hào)上面不是一大堆實(shí)戰(zhàn)案例和剖析漫玄∏羊牵考慮到法律糾紛問題,別人不能在課程里直接告訴我去哪里找練手睦优,也不可以告訴我用哪個(gè)網(wǎng)站練手渗常,但機(jī)靈的我一定能找到;6.大部分人都不會(huì)拒絕友好的提問和表現(xiàn)出來的求知欲汗盘,遂我可以向很多人請(qǐng)教凳谦;7.比我優(yōu)秀還比我努力的人非常多,我不能落下衡未;8. 假設(shè)我嗶嗶的時(shí)間和別人求學(xué)的時(shí)間相等尸执,那么我收獲的就是一頓氣憤,而別人收獲的卻是知識(shí)缓醋;9.學(xué)習(xí)完知識(shí)點(diǎn)記得整理筆記如失,我可以用 Typora 或者 SnippetsLab 等軟件記錄心得和代碼。重申一次送粱,我向來不做伸手黨褪贵,就算問別人要的代碼也會(huì)自己動(dòng)手調(diào)試,并且進(jìn)行優(yōu)化和注釋整理抗俄;以下是我的 SnipptesLab 筆記截圖:

我如此勤奮的原因是我知道自己菜脆丁,我想進(jìn)步,想要成為別人口中的“大佬”动雹。遂我刻苦努力學(xué)習(xí)槽卫,不懂就問。找不到答案就請(qǐng)教胰蝠,缺哪方面知識(shí)就補(bǔ)歼培!大家看看平時(shí)我是如何主動(dòng)問別人的:

image
image
image
image
image
image
image
image
image
image
image
image
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茸塞,隨后出現(xiàn)的幾起案子躲庄,更是在濱河造成了極大的恐慌,老刑警劉巖钾虐,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噪窘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡效扫,警方通過查閱死者的電腦和手機(jī)倔监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門无切,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丐枉,你說我怎么就攤上這事【蛲校” “怎么了瘦锹?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵戚长,是天一觀的道長(zhǎng)昼蛀。 經(jīng)常有香客問我,道長(zhǎng)纵潦,這世上最難降的妖魔是什么泪掀? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任听绳,我火速辦了婚禮,結(jié)果婚禮上异赫,老公的妹妹穿的比我還像新娘椅挣。我一直安慰自己,他們只是感情好塔拳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布鼠证。 她就那樣靜靜地躺著,像睡著了一般靠抑。 火紅的嫁衣襯著肌膚如雪量九。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天颂碧,我揣著相機(jī)與錄音荠列,去河邊找鬼。 笑死载城,一個(gè)胖子當(dāng)著我的面吹牛肌似,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诉瓦,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼锈嫩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了垦搬?” 一聲冷哼從身側(cè)響起呼寸,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猴贰,沒想到半個(gè)月后对雪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡米绕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瑟捣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馋艺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迈套,死狀恐怖捐祠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桑李,我是刑警寧澤踱蛀,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站贵白,受9級(jí)特大地震影響率拒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禁荒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一猬膨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呛伴,春花似錦勃痴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褐隆,卻和暖如春污它,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庶弃。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工衫贬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歇攻。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓固惯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缴守。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葬毫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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